Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

Моля, регистрирайте се за да публикувате тема и да получите пълен достъп до всички функции.

 

C задача

Featured Replies

Здравейте,програмиренто е нещото което най-НЕЕЕ разбирам!!! и сега имам да направя следната задача:

Да се прочете 1 бинарен файл, в който са записани студенти с име, F № и масив от 50 оценки. Да се изведат на екрана имената на всички студенти, които имат ср.успех над 5.50 Аз съм направил следното:

#include <stdio.h>
#include <stdlib.h>
#define uspeh 5.50  //това искам някак си да го ползвам за проверката
typedef struct{
        char name[50];
        int F;
        int ocenki[50];
}stud;
float sreden(); 
int main(int argc, char *argv[])
{  
  FILE *f;
  int c;
  stud s;
  if((f=fopen("c:\\test.dat","wb"))==NULL){
         printf("can not open the file \n");                                
  system("PAUSE");	
      return 15;
}
for(;{
        printf("do you want to input a student yes,no?"); /*тук искам вместо "yes,no" да бъде y\n 
само че нали \n е за нов 
ред и незнам как да направя да го възприеме по друг начин */
        c=fgetc(stdin);
        if(c=='n')break;
        if(c!='y')continue;
        printf("give name please:");
        fscanf(stdin,"%s",&s.name);//fgets(s.name,50,stdin); 
        printf("fakulteten nomer please:");
        fscanf(stdin,"%d",&s.F);
        printf("Please enter a mark:");
        fscanf(stdin,"%d",&*s.ocenki);
        for(;{
                printf("Do you want to enter more marks yes,no?"); */ същия проблем за yes и no и се 
опитвам някак си 
да въведа няколко оценки в масива за оценки нооо всеки път греда и искам ако кажеме n 
да спреме с въвеждането и кода да продължи нататък */
                c=fgetc(stdin); 
                if(c=='n')break;
                if(c=='y')continue;
        fscanf(stdin,"%d",&*s.ocenki);
                 }
        printf("Name: %s Faculty number:%d Marks:%d \n",s.name,s.F,*s.ocenki);
        fwrite(&s,sizeof(s),1,f); 
       }
fclose(f);
if (sreden()!=0)printf("there is no such file\n");

  
  system("PAUSE");	
  return 0;
}
float sreden(){
    stud s;
     FILE *f;
     int found=0;
      if((f=fopen("c:\\test.dat","rb"))==NULL){
         printf("can not open the file \n");                                
         system("PAUSE");	
      return 15;
}
for(;{
   fread(&s,sizeof(s),1,f);
   if(feof(f))break; /*тука вече пълна каша!! уш да проверя някак си сбора от оценките 
в масива и ако е повече от 5.50 да изведа иметона студента но уви...*/
   if(s.ocenki/uspeh=>5.50){
   printf("The student %s  Faculty number:%d is an excellent student",s.name,s.F);   
   found=1;
   }
}
if(!found)printf ("not found \n");
return 0;
}
//и някои неща ми се принтират по 2 пъти, може би е заради fgetc май той взимаше и ентъра ли как беше,
//не си спомням,но имаше нещо такова,нали чете символ по символ и .....  :x    

Редактирано от Xagec (преглед на промените)

Първо: Нали всичко трябва да се прочете от някакъв файл. В кода ти никъде няма такова нещо, а всичко се взема от конзолата директно. След това би ли дал ормат на самия файл, и някакъв примерен файл, за да мога да ти го напиша.

  • Автор

Еми то важното е да се види дали работи програмата както трябва,няма проблем че го взимаме от конзолата,а и тя програмата създава файл test.dat,ако си я пуснал си виш C директорията (оо макар че тя сега не иска да се компилира ).Затова е целия този диалог с потребителя(ако мога така да го нарека), за да вкараме някакви данни с които да работи програмата.

Като се прибера от работа ще видя да ти я оправя програмата.

  • Автор

Оки,когато тогава :) нервирам се много че не става,а трябва да е супер просто за 30-40 мин ама...... то идиотите са си идиоти :huh:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h> 

#define perfect_score 5.50
#define BIN_FNAME "test.dat"
#define DEBUG_OUT(e, ...) printf(e, __VA_ARGS__) 
#define MENU_P(e) printf("* %s\n", e)
#define STATIC static

typedef unsigned char BOOL;
#define TRUE 1
#define FALSE 0

typedef struct stud_s {
    char name[50];
    char F[10];
    float marks[50];
} stud_s;

typedef enum ret_e {
    RETURN_SUCESS = 0,
    RETURN_FAILURE = -1,
} ret_e;

STATIC stud_s stud[100];
STATIC int nr_studs;

STATIC ret_e openBinFile(FILE *f, const char *fname)
{
    ret_e ret = RETURN_SUCESS;
    
    f = fopen(fname, "wb+");
    if (!f) {
        DEBUG_OUT("Cannot open the input file: %s\n", BIN_FNAME);
        ret = RETURN_FAILURE;
    }
    
    return ret;
}

STATIC BOOL fileExists(const char *fname) 
{ 
    struct stat stFileInfo; 
    BOOL ret = FALSE; 
    int intStat; 
    
    // Read the file attributes
    intStat = stat(fname, &stFileInfo); 
    
    if(intStat == 0) { 
        // We were able to get the file attributes 
        // so the file obviously exists. 
        ret = TRUE; 
    } 
    
	return ret; 
}

STATIC ret_e appendStud(stud_s *newStud)
{    
    if ((!newStud) && (nr_studs >= 99)) {
        return RETURN_FAILURE;
    }
    
    stud[nr_studs] = *newStud;
    nr_studs++;
    
    return RETURN_SUCESS;
}

// the file format is name,fnum,record1,record2,etc 
STATIC int readFile(FILE *f)
{
	int ret = 0;
    stud_s *studLocal;
    char buff[3];
    int i;
    
    if (f) {
        rewind(f);
        
        while (!feof(f)) {
        
        	studLocal = (stud_s*)malloc(sizeof(stud_s));
        	if (!studLocal) {
                DEBUG_OUT("Cannot allocate memory @%s, %i\n", __FILE__, __LINE__);
            }
        
        	fread(&studLocal->name, 1, 50, f);
            fread(&studLocal->F, 1, 10, f);
            
            for(i = 0; i < 50; i++) {
                memset(buff, 0 ,sizeof(buff));
                fread(&buff, 1, 3, f);
                studLocal->marks[i] = (float)((float)atoi(buff) / 100);
            }
            
            appendStud(studLocal);
            free(studLocal);
            ret++;
    	}
    }
    return ret;
}

STATIC void printHeader()
{
    int i;
    
    for (i = 0; i < 8; i++) {
        printf("**********");
    }
    printf("\n");
}

STATIC void printMenu()
{
    printHeader();
    MENU_P("n - Enter new student");
    MENU_P("p - Print all students with a excelent score");
    MENU_P("w - Write the student list to the file");
    MENU_P("h - Help");
    MENU_P("x - Exit");
    printHeader();
}

STATIC void dumpExcelStud()
{
    int i;
    int j;
    int count;
    int len;
    float mark;
    
    printf("Name:");
    for (i = 0; i < 23; i++) {
        printf("  ");
    }
    printf("\t");
    printf("Fak No   \tScore\n\n\n");
    
    for (i = 0; i < nr_studs; i++) {
        mark = 0;
        for (j = 0; j < 50; j++) {
            if (stud[i].marks[j] < 2) break;
            mark += stud[i].marks[j];
        }
        mark = mark / j;
        if ((mark >= perfect_score)) {
            len = strlen(stud[i].name);
            printf("%s", stud[i].name);
            for (count = len; count < 50; count++) printf(" ");
            
            len = strlen(stud[i].F);
            printf("\t%s", stud[i].F);
            for (count = len; count < 10; count++) printf(" ");
            printf("\t%f\n", mark);
        }
    }
}

STATIC int enterMark(stud_s *stud, int pos)
{
    
    char com;
    float mark;
    
    if (!stud) {
        return -1;
    }
    
    printf("Do you want to enter a new mark? [y/N] > ");
    
    com = getchar();
    
    switch(com)
    {
        case 'n':
        case 'N':
        default:
            while( (com = getchar()) != '\n');
            return -1;
            break;
        case 'y':
        case 'Y':
            while( (com = getchar()) != '\n');
            printf("New mark >  ");
            scanf("%f", &mark);
            while( (com = getchar()) != '\n');
            if ((mark >= 2) && (mark <= 6)) {
                stud->marks[pos] = mark;
            } else {
                stud->marks[pos] = 0;
            }
            return pos;
			break;
    }
    
    return -1;
    
}

STATIC void enterStud(stud_s *stud)
{
    stud_s *studLocal;
    int count = 0;
    char buff;
    int ret;
    
    studLocal = (stud_s*)malloc(sizeof(stud_s));
    if (!studLocal) {
        DEBUG_OUT("Cannot allocate memory @%s, %i\n", __FILE__, __LINE__);
        return;
    }
    
    printf("Enter Name >  ");
    
    memset(&studLocal->name, 0, sizeof(studLocal->name));
    
    buff = getchar();
    while (buff != '\n') {
        if (count < 49) {
            studLocal->name[count] = buff;
            count++;
        }
        buff = getchar();
        
    }
    
    printf("Enter Fak No >  ");
    
    memset(&studLocal->F, 0, sizeof(studLocal->F));
    
    count = 0;
    buff = getchar();
    while (buff != '\n') {
        if (count < 9) {
            studLocal->F[count] = buff;
            count++;
        }
        buff = getchar();
    }
    
    for (count = 0; count < 50; count++) {
        studLocal->marks[count] = 0;
    }
    
    
    count = 0;
    ret = enterMark(studLocal, count);
    while ((count < 50) && ( ret >= 0)) {
        count++;
        ret = enterMark(studLocal, count);
    }
    
    appendStud(studLocal);
    free(studLocal);
    
}

STATIC int decodeCom(stud_s *stud, FILE *f)
{
    char com;
    int ret = 0;
    
    printf(">  ");
    
    com = getchar();
    
    switch(com)
    {
        case 'n':
            while( (com = getchar()) != '\n');
            enterStud(stud);
            break;
        case 'p':
            while( (com = getchar()) != '\n');
            dumpExcelStud();
            break;
        case 'w':
            while( (com = getchar()) != '\n');
            DEBUG_OUT("Implement me please @ %s %i\n", __FILE__, __LINE__);
            break;
        case 'x':
            while( (com = getchar()) != '\n');
            ret = 1;
            break;
        case '\n':
            break;
        case 'h':
        default:
            printMenu();
            while( (com = getchar()) != '\n');
            break;
    }
    
    return ret;
}

int main (int argc, const char * argv[]) 
{
    FILE *f;	// pointer to the file
    BOOL fe;	// file exists flag
	ret_e ret;	// return code from the internal functions
                //stud_s *stud; // student list
    int nrStud;	// nr of students in the list

    
    nr_studs = 0;
    
    // check whether the file is there and we can read it
    fe = fileExists(BIN_FNAME);
    
    // open the file
    ret = openBinFile(f, BIN_FNAME);
    
    if (ret != RETURN_SUCESS) {
        return (RETURN_FAILURE);
    } 
    
    if (fe) {
        // since the file is there; read the records from it
        nrStud = readFile(f);
        DEBUG_OUT("Number of students read from the file: %i\n", nrStud);
    } else {
        nrStud = 0;
    }
    
    printMenu();
    
    
    while(decodeCom(stud, f) != 1);

    fclose(f);
        
    return 0;
}

Тествано е и се компилира без проблем със GCC 4.5.0 на MacOS. Би трябвало да работи и с компилатора на Майкрософт, но не съм го тествал. На теб ти остава да си напишеш функцията, която съхранява всичко от локалната структура във файл-а. Освен това по желание може да разкараш тая глупава статична структура със 100 студента и да я замениш с linked list. Просто мен ме мързи да го пиша по-нататък.

Редактирано от gueswho (преглед на промените)

  • Автор

Еееее ти супер много си се постарал!!! Не беше нужно чак толкова, БЛАГОДАРЯ, даже не всички неща сами ясни,ноо ще се опитам да разбера всичко и ще се опитам да го направя по семпло.Само един проблем имам:успях да го пусна само първия път, след това при изход "x",гръмна (Windows 7 Ultimate x64,Dev C version 4.9).Компилира се но при опит да му дам "Run",пак гръмва още в началото.

Публикувано изображение

Пробвах като копирах кода на ново,нещо да не съм направил,но не,даже рестартирах и пробвах пак :whist: ,но не.

Редактирано от Xagec (преглед на промените)

Пусни го през debugger и виж какъв му е проблема, ако не може да се оправиш пиши на кой ред е краша, и или един GDB coredump или всички променливи, които се ползват. Най-вероятно проблемът е някъде където алокира памет или където я освобождава, но ще ми трябва малко инфо от debugger-а.

  • 4 седмици по-късно...

Ето ти кода ,отне ми доста време ,надявам се да ти свърши работа !!!

//Contestant.h

#pragma once
#include "Contestant.h"
#include <string>
using namespace std;

class CContestant
{
private:
	string m_name;
	string m_fnum;
	int m_br;
	double m_mark[50];

public:
	CContestant();
	void Read();
	void Print();
	void AddToFile();
	void ReadFromFile();
	void PrintMostNames();
};

//Contestant.cpp

#include "Contestant.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

CContestant::CContestant()
{
	m_name="";
	m_fnum="";
	m_br=0;
	int i;
	for(i=0; i<50; i++)
		m_mark[i]=0;
}


void CContestant::Read()
{
	int index=1;
	cout<<"Ime: ";
	cin>>m_name;
	cout<<"Fak. Nomer: ";
	cin>>m_fnum;
	cout<<"Broi ocenki: ";
	cin>>m_br;
	int i;
	for(i=0; i<m_br; i++)
	{
		cout<<"Ocenka "<<index++<<": ";
		cin>>m_mark[i];
	}	
}

void CContestant::Print()
{
	int index=1;
	cout<<"Ime: "<<m_name<<endl;
	cout<<"Fak. Nomer: "<<m_fnum<<endl;
	int i;
	for(i=0; i<m_br; i++)
		cout<<"Ocenka "<<index++<<": "<<m_mark[i]<<endl;
	cout<<endl;
}

void CContestant::AddToFile()
{
	ofstream fout("Students.dat", ios::app);
	fout.write((char*)&(*this), sizeof((*this)));
	fout.close();
}

void CContestant::ReadFromFile()
{
	ifstream fin("Students.dat",ios::in);
	cout<<endl;
	while(fin.read((char*)&(*this), sizeof((*this))))
	{
		(*this).Print();
	}
	fin.close();	
}


void CContestant::PrintMostNames()
{
	int i, br=0;
	double points,sum=0;
	points=5.5;
	ifstream fin("Students.dat",ios::in);
	while(fin.read((char*)&(*this), sizeof((*this))))
	{
		for(i=0; i<(*this).m_br; i++)
		{
			sum+=(*this).m_mark[i];
			br++;
		}
		sum/=br;
		if(sum>points)cout<<(*this).m_name<<endl; 
		sum=br=0;
	}
	fin.close();
	cout<<endl;
}

//main.cpp

#include "Contestant.h"
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void New()
{
	ofstream fout("Students.dat",ios::out);
	fout.close();
	cout<<"\n *** Faylat e sazdaden uspeshno *** \n";
}


void main()
{
	CContestant CC;
	int ch;

	do
	{
	cout<<"\n";
	cout<<"=>	1. Sazdavane na nov fail \n";
	cout<<"=>	2. Dobavqne kam fayla danni za nov student \n";
	cout<<"=>	3. Otpechatvane na imenata na vsichki studenti sas sreden uspeh nad 5,50";
	cout<<"=>	4. Izvejda dannite na vsichki uchastnici \n ";
	cout<<"\n";
	cout<<"	0. IZHOD => \n ";
	cin>>ch;
	switch(ch)
	{
	case 0: break;
	case 1: New(); break;
	case 2: CC.Read(); CC.AddToFile(); break;
	case 3: CC.PrintMostNames(); break;
	case 4: CC.ReadFromFile(); break;
	}
	}while(ch);
}

Редактирано от (-1) ™ (преглед на промените)

Регистрирайте се или влезете в профила си за да коментирате

Разглеждащи това в момента 0

  • Няма регистрирани потребители разглеждащи тази страница.

Дарение

  • Подкрепи съществуването на форума - направи дарение
    32%
    Дарени 315 € от нужните 1 000 €

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.