Премини към съдържанието
SeatFR

Бинарен файл в C++ (курсова работа)

Препоръчан отговор


Здравейте!

Не съм тук, за да ми пишете програмата! Опитвах се по всякакъв начин, но работата с файла не работи правилно. Първо започвам с условието. А то е: post-210822-0-19275200-1419195905_thumb. . Задължително е да е с бинарен файл. Започнах програмата, но не очаквах да срещна проблеми и нямам много време за решаването му. При компилиране на програмата - тя работи, записва си във файла, но излизат различни проблеми:

- Винаги когато първо въведа данни, после ги изведа и реша да добавям нови програмата крашва.

- Понякога крашва при въвеждането още.

- Ако имам съществуващ файл програмата крашва.

- Понякога при въведени данни за 2-3 или повече туристи още при първото извеждане ми изкарва объркани данни.

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

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

стринговете в структурата няма как да се запишат по този начин.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Здравейте! Благодаря за мнението. Ровейки в раздела, открих това, че не може със стрингове. Редактирах ги да са char, но проблема с крашването при второ извеждане си остава. Редактирал съм кода в първото мнение, ще може ли да го погледнете. Благодаря ви много!

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
int output(turist t[])
{
    turist tur;
    int i=0;
    fstream fp;
    fp.open("turisti.dat", ios::binary|ios::in);
    if(!fp)
    {
        cout<<"\nGreshka pri otvarqne na faila!\n";
        return 0;
    }
    while(fp.read((char*)&tur, sizeof(turist))) {
        cout<<tur.ime<<" "<<tur.pol<<" "<<tur.strana<<" "
            <<tur.godini<<" "<<tur.profesia<<endl;
        t[i++]=tur; if (i==N) break;
    }
    fp.close();
    cout<<"\nBroj turisti: "<<i<<endl<<endl;
    return i;
}

// изпълняваш функцията в main() с:
    case 2: razmer=output(tr);
            break;
 



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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Благодаря ти, много! :)


Сподели този отговор


Линк към този отговор
Сподели в други сайтове
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct TURIST
{
    char ime[50];
    int pol;
    char strana[50];
    int godini;
    char profesia[50];
};

int strhowmany(char* a,char* b);

int main()
{
    TURIST turist;
	glavnomenu:
    while (1)
	{
        printf("\n\n         Menu \n");
	    printf("1 - Vavedete danni za turist\n");
	    printf("2 - Napravete spravka\n");
	    printf("3 - Kraj na programata\n");
		int c = getchar();
		fflush(stdin);
		if (c == '3') exit(0);
		if (c == '1')
		{
		    memset(&turist,0,sizeof(TURIST));
			vavediimetopak:
			printf("Vavedete imeto na turista:\n");
			fgets(turist.ime,49,stdin);
			if (turist.ime[0]=='\n')
			{
			    printf("Ne vavedohte imeto na turista\n");
				turist.ime[0] = 0;
				goto vavediimetopak;
			}
			char* i = strchr(turist.ime,'\n');
			i[0] = 0;
			vavedipolapak:
			printf("Vavedete pola na turista - 1 = Mazh, 2 = Zhena:\n");
			turist.pol = getchar() - '0';
			fflush(stdin);
			if (turist.pol<1 || turist.pol>2)
			{
			    printf("Ne vavedohte pravilno pola na turista\n");
				turist.pol=0;
				goto vavedipolapak;
			}
			vavedistranatapak:
			printf("Vavedete stranata na turista:\n");
			fgets(turist.strana,49,stdin);
			if (turist.strana[0]=='\n')
			{
			    printf("Ne vavedohte stranata na turista\n");
				turist.strana[0] = 0;
				goto vavedistranatapak;
			}
			i = strchr(turist.strana,'\n');
			i[0] = 0;
			vavedigodinitepak:
			printf("Vavedete godinite na turista:\n");
			scanf("%d",&(turist.godini));
			fflush(stdin);
			if (turist.godini<1 || turist.godini>200)
			{
			    printf("Ne vavedohte pravilno godinite na turista\n");
				turist.godini=0;
				goto vavedigodinitepak;
			}
			vavediprofesiatapak:
			printf("Vavedete profesiata na turista:\n");
			fgets(turist.profesia,49,stdin);
			if (turist.profesia[0]=='\n')
			{
			    printf("Ne vavedohte profesiata na turista\n");
				turist.profesia[0] = 0;
				goto vavediprofesiatapak;
			}
			FILE* d = fopen("danni.dan","ab");
			if (d == 0) 
			{
			    printf("File open error");
				exit(1);
			}
			fwrite(&turist,sizeof(TURIST),1,d);
			fclose(d);
		}
		if (c == '2')
		{
		    while (1)
			{
		        printf("\n\n        Menu spravki\n\n");
			    printf(" 1 Izvedete vsichki turisti\n");
                printf(" 2 Spravka za srednata vuzrast na turistite \n");
                printf(" 3 Spravka za nai-mladata jena posetila stranata ni \n");
                printf(" 4 Spravka ot koi strani sa turistite\n");
                printf(" 5 Spravka ot koq strana sa nai-mnogo turistite \n");
                printf(" 6 Krai na programata \n");
				printf(" 7 Glavno menu\n");
				c = getchar();
		        fflush(stdin);
		        if (c == '6') exit(0);
				else if (c == '7') goto glavnomenu;
				else if (c == '1')
				{
				    FILE* d = fopen("danni.dan","ab+");
					if (d == 0) 
			        {
			            printf("File open error");
				        exit(1);
			        }
					rewind(d);
					int n = 0;
					printf("\n\n");
				    while (!feof(d))
					{
					    n++;
					    memset(&turist,0,sizeof(TURIST));
					    fread(&turist,sizeof(TURIST),1,d);
						if (turist.ime[0] != 0)
						{
						    printf("%d. %s",n,turist.ime);
							if(turist.pol == 1) printf(" mazh ");
							else printf(" zhena ");
							printf("%s %d %s",turist.strana,turist.godini,turist.profesia);
						}
					}
					fclose(d);
				}
				else if (c == '2')
				{
				    FILE* d = fopen("danni.dan","ab+");
					if (d == 0) 
			        {
			            printf("File open error");
				        exit(1);
			        }
					rewind(d);
					int n = 0;
					int m = 0;
					while (!feof(d))
					{
					    turist.godini = 0;
						fread(&turist,sizeof(TURIST),1,d);
						n++;
						m = m + turist.godini;
					}
					n--;
					m = m - turist.godini;
					printf("\n\nSrednata vazrast na turistite e %f",(float)m/n);
					fclose(d);
				}
				else if (c == '3')
				{
				    FILE* d = fopen("danni.dan","ab+");
					if (d == 0) 
			        {
			            printf("File open error");
				        exit(1);
			        }
					rewind(d);
					int n = 200;
					TURIST najmladazhena;
					while (!feof(d))
					{
					    turist.pol = 0;
                        turist.godini = 0;
						fread(&turist,sizeof(TURIST),1,d);
						if ((turist.pol == 2)&&(n > turist.godini)) 
						{
						    n = turist.godini;
							memmove(&najmladazhena,&turist,sizeof(TURIST));
						}
					}
					if (n == 200) printf ("\n\nNiama zheni posetili stranata ni");
					else printf("\nNaj mladata zhena posetila stranata ni e:\n\n%s zhena %s %d %s",
					            najmladazhena.ime,najmladazhena.strana,najmladazhena.godini,najmladazhena.profesia);
                    fclose(d);		
				}
				else if (c == '4')
				{
				    void* stran = 0;
					char* strani;
					FILE* d = fopen("danni.dan","ab+");
					fseek(d,0,SEEK_END);
					unsigned n = ftell(d);
					rewind(d);
					stran = malloc(n);
					strani = (char*) stran;
					memset (strani,0,n);
					while(!feof(d))
					{
					    turist.strana[0] = 0;
					    fread(&turist,sizeof(TURIST),1,d);
						if ((turist.strana)[0] != 0) strcat(turist.strana,"\n");
						if ((strstr(strani,turist.strana)==0)) strcat(strani,turist.strana);
					}
					if (strani[0]==0) printf("Niamame nikakvi poseshtenia ot turisti");
					else 
					{
					    printf("\n\nTuristite sa ot slednite strani:\n\n");
					    printf(strani);    
					}
					free(stran);
					fclose(d);
				}
				else if (c == '5')
				{
				    void* stran = 0;
					char* strani;
					FILE* d = fopen("danni.dan","ab+");
					fseek(d,0,SEEK_END);
					unsigned n = ftell(d);
					rewind(d);
					stran = malloc(2*n);
					strani = (char*) stran;
					memset (strani,0,2*n);
					while(!feof(d))
					{
					    turist.strana[0] = 0;
					    fread(&turist,sizeof(TURIST),1,d);
						if ((turist.strana)[0] != 0) strcat(turist.strana,"\n");
						if ((strstr(strani,turist.strana)==0)) strcat(strani,turist.strana);
						strcat(strani+n,turist.strana);
					}
					if (strani[0]==0) printf("Niamame nikakvi poseshtenia ot turisti");
					else 
					{
					    int m;
						char country[50];
						int m1 = 0;
						char country1[50];
						char* aim;
						char* chp = strani;
						int p;
						while(strani[0])
						{
						    m = 0;
						    memset(country,0,50);
						    aim = strchr(strani,'\n');
							p = strcspn(strani,"\n");
							strncpy(country,strani,p+1);
							strani = aim +1;
							m = strhowmany(chp+n,country);
							if (m1 < m)
							{
							    m1 = m;
								strcpy(country1,country);
							}
						}
						printf("\n\nNaj mnogo - %d - poseshtenia na turisti ima ot %s\n\n",m1,country1);
					}
					free(stran);
					fclose(d);
				}
				printf("\n\nPress enter to continue\n\n");
				getchar();
				fflush(stdin);
			}	
		}
	}	
	return 0;
}

int strhowmany(char* a,char*b)
{
    int n = 0;
	char* chp;
	while (1)
	{
	    chp = strstr(a,b);
		if (chp == 0) break;
		n++;
		a=chp+strlen(b);
	}
	return n;
	
}

Вчера го сътворих. Работи. За тази подпрограма за намиране, колко пъти един стринг се съдържа в друг делимитиран, сто на сто на с++ има готова функция, но не я знам. 

 

На notepad++ го писах, що се размести тук не знам. Може някъде да съм сложил табове, а другаде интервали и за това да е. 

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Вчера го сътворих. Работи. За тази подпрограма за намиране, колко пъти един стринг се съдържа в друг делимитиран, сто на сто на с++ има готова функция, но не я знам.

Да - нарича се substr, но е на класа string. Т.е. за char[] данни трябва да се направи ръчно такъв метод.

Имам следния въпрос обаче - тези goto оператори защо са необходими за програмата ? Въпросния код за въвеждане и проверка на данните може да се изнесе спокойно като методи, вместо да спагетифицираме кода и да го правим труден за проследяване ? Не споря дали програмата работи или не, но се съмнявам на запитващия да му е ясно кое как и защо се вика и къде минава изпълнението на кода. Подобно нещо ми се върти и за разписването на if/else условията - кода, който се изпълнява в тях също може да се изнесе като методи, които да се викат на по един ред в main-а. Като цяло, добрата практика показва, че main метода трябва или да извършва нещо наистина просто, или да е максимално изчистен от логическите зависимости на програмата (които съответно да си отидат в методи).

 

Това са просто като good practices :)

 

Поздрави !

Редактирано от soundtracker (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да - нарича се substr, но е на класа string. Т.е. за char[] данни трябва да се направи ръчно такъв метод.

Имам следния въпрос обаче - тези goto оператори защо са необходими за програмата ? Въпросния код за въвеждане и проверка на данните може да се изнесе спокойно като методи, вместо да спагетифицираме кода и да го правим труден за проследяване ? Не споря дали програмата работи или не, но се съмнявам на запитващия да му е ясно кое как и защо се вика и къде минава изпълнението на кода. Подобно нещо ми се върти и за разписването на if/else условията - кода, който се изпълнява в тях също може да се изнесе като методи, които да се викат на по един ред в main-а. Като цяло, добрата практика показва, че main метода трябва или да извършва нещо наистина просто, или да е максимално изчистен от логическите зависимости на програмата (които съответно да си отидат в методи).

 

Това са просто като good practices :)

 

Поздрави !

 

goto използвам за препращане назад, когато е необходимо да зацикля кода. Нещо като уайл(1). Може с уайл (1) да ги махна. 

 

Иначе за да стане по четливо мога да разбия на два основни метода, които да разбия на подметоди, където е необходимо. Ще стане така:

 

int main

{

    while(1)

    {

           metod_za_obrabotka_na_glavno_menu (); // служи за въвеждане на туристи и връща само ако потребителя желае да ползва справки

           metod_za_obrabotka_na_menu_spravki();  //служи за извеждане на справки и връща само ако потребителя желае да ползва главно меню

    }

return 0; //управлението не достига никога дотук, изходите от програмата са от вътрешността на горните 2 метода с exit(0); успех и exit(1);

             // грешка

}

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct TURIST
{
    char ime[50];
    int pol;
    char strana[50];
    int godini;
    char profesia[50];
};

int strhowmany(char* a,char* b); //изчислява колко пъти стринг b се съдържа в стринг a
void glavnomenu();  // обработва менюто за въвеждане на туристи, връща само ако потребителя желае да ползва меню справки             
void menuspravki(); // обработва менюто за извеждане на справки, връща само ако потребителя желае да ползва меню въвеждане (главно меню)
void izvedivsichkituristi();
void srednavyzrast();
void najmladazhena();
void strani();
void najmnogootkoiastrana();

int main()
{
    while(1)
	{
	    glavnomenu();
		menuspravki();
	}
    return 0;
}


int strhowmany(char* a,char*b)
{
    int n = 0; // брояч на случаите, в които стринг b все още се съдържа в стринг a.
	char* chp; // указател служещ за намаляне на стринг a, до мястото в което е намерено последното съдържание на стринг b
	while (1)
	{
	    chp = strstr(a,b); //chp след изпълнението сочи първото намиране на b в a
		if (chp == 0) break; // излизане от цикъла, след като повече b не се съдържа в a
		n++;                    //увеличаване на брояча за всеки случай на намиране на b в a 
		a=chp+strlen(b); // chp+strlen(b) сочи края на намерения стринг b в стринг a
	}
	return n;
}


void glavnomenu()
{
    TURIST turist;
    while (1)
	{
        printf("\n\n         Menu \n");
	    printf("1 - Vavedete danni za turist\n");
	    printf("2 - Napravete spravka\n");
	    printf("3 - Kraj na programata\n");
		int c = getchar();
		fflush(stdin);
		if (c == '3') exit(0); // успешен изход от програмата по желание на потребителя
		if (c == '2') return;  // методът връща, когато потребителя желае да ползва меню справки
		if (c == '1')          // въвеждане на данните за туриста във файл danni.ddd
		{                      // който представлява последователно записани структури TURIST
		    memset(&turist,0,sizeof(TURIST));
			while(1)
			{
			    printf("Vavedete imeto na turista:\n");                // въвеждане на името на туриста
                fgets(turist.ime,49,stdin);                           // функцията fgets завършва върнатия низ със символ за нов ред накрая
			    if (turist.ime[0]=='\n')
			    {
			        printf("Ne vavedohte imeto na turista\n"); // връщане докато потребителя не въведе нещо от клавиатурата
				    turist.ime[0] = 0;
				}
				else
				{
			        char* i = strchr(turist.ime,'\n');  // на този и следващия ред махам крайния символ за нов ред
			        i[0] = 0;
				    break;
				}	
			}
			while(1)            // въвеждане на пола на туриста
			{
			    printf("Vavedete pola na turista - 1 = Mazh, 2 = Zhena:\n"); // 1 = мъж 2 = жена
			    turist.pol = getchar() - '0';                                // При ASCII  представяне на символите 0 = '0'-'0' и така за всички цифри
			    fflush(stdin);                                               // 1 = '1' - '0' и така за всички цифри ==== getchar не чисти входящият буфер
			    if (turist.pol<1 || turist.pol>2)
			    {
			        printf("Ne vavedohte pravilno pola na turista\n");
				    turist.pol=0;
				}
				else break;
			}
			while(1)         // въвеждане страната на туриста
			{
			    printf("Vavedete stranata na turista:\n");
			    fgets(turist.strana,49,stdin);
			    if (turist.strana[0]=='\n')
			    {
			        printf("Ne vavedohte stranata na turista\n");
				    turist.strana[0] = 0;
				}
				else
				{
			        char* i = strchr(turist.strana,'\n');
			        i[0] = 0;
					break;
				}	
			}
			while(1)
			{
			    printf("Vavedete godinite na turista:\n");
			    scanf("%d",&(turist.godini));
			    fflush(stdin);
			    if (turist.godini<1 || turist.godini>200)
			    {
			        printf("Ne vavedohte pravilno godinite na turista\n");
				    turist.godini=0;
				}
				else break;
			}
			while(1)
			{
			    printf("Vavedete profesiata na turista:\n");
			    fgets(turist.profesia,49,stdin);
			    if (turist.profesia[0]=='\n')
			    {
			        printf("Ne vavedohte profesiata na turista\n");
				    turist.profesia[0] = 0;
				}
				else break;
			}
			FILE* d = fopen("danni.dan","ab"); // "ab" защото пише в края на файла и ако файла не съществува, го създава
			if (d == 0) 
			{
			    printf("File open error");
				exit(1);
			}
			fwrite(&turist,sizeof(TURIST),1,d);
			fclose(d);
		}
	}	
}


void menuspravki()
{
    TURIST turist;
    while (1)
	{
		printf("\n\n        Menu spravki\n\n");
	    printf(" 1 Izvedete vsichki turisti\n");
        printf(" 2 Spravka za srednata vuzrast na turistite \n");
        printf(" 3 Spravka za nai-mladata jena posetila stranata ni \n");
        printf(" 4 Spravka ot koi strani sa turistite\n");
        printf(" 5 Spravka ot koq strana sa nai-mnogo turistite \n");
        printf(" 6 Krai na programata \n");
	    printf(" 7 Glavno menu\n");
		int c = getchar();
		fflush(stdin);
		if (c == '6') exit(0);
	    else if (c == '7') return;
	    else if (c == '1')
		{
		    izvedivsichkituristi();
		}    
		else if (c == '2')
		{
		    srednavyzrast();
		}
		else if (c == '3')
		{
		    najmladazhena();
		}
		else if (c == '4')
		{
		    strani();
		}
		else if (c == '5')
		{
		    najmnogootkoiastrana();
		}
		printf("\n\nPress enter to continue\n\n");
		getchar();
		fflush(stdin);
	}
}


void izvedivsichkituristi()
{
    TURIST turist;
    FILE* d = fopen("danni.dan","ab+"); 
	if (d == 0) 
	{
	    printf("File open error");
		exit(1);                              
	}
	rewind(d);
	int n = 0;
	printf("\n\n");
	while (!feof(d))
	{
		n++;
		memset(&turist,0,sizeof(TURIST));     // chete dannite ot fajla
		fread(&turist,sizeof(TURIST),1,d);    // izvezhda gi na ekrana 
		if (turist.ime[0] != 0)
		{
			printf("%d. %s",n,turist.ime);
			if(turist.pol == 1) printf(" mazh ");
			else printf(" zhena ");
			printf("%s %d %s",turist.strana,turist.godini,turist.profesia);
		}
	}
	fclose(d);
}


void srednavyzrast()
{
    TURIST turist;
    FILE* d = fopen("danni.dan","ab+");
	if (d == 0) 
	{
	    printf("File open error");
		exit(1);
	}
	rewind(d);
	int n = 0;
	int m = 0;
	while (!feof(d))
	{
	    turist.godini = 0;                         //chete fajla. sabira vazrastite 
		fread(&turist,sizeof(TURIST),1,d);         // i deli na broia turisti
		n++;
		m = m + turist.godini;
	}
	n--;
	m = m - turist.godini;
	printf("\n\nSrednata vazrast na turistite e %f",(float)m/n);
	fclose(d);
}


void najmladazhena()
{
    TURIST turist;
    FILE* d = fopen("danni.dan","ab+");
	if (d == 0) 
	{                                 // chete faila kato zapazva v struktura
	    printf("File open error");    // naj mladata zhena ot prochetenite dotuk
		exit(1);                      // kogato stigne do kraia
	}                                 // tova e naj mladata zhena v cialata baza danni
	rewind(d);
	int n = 200;
	TURIST najmladazhena;
	while (!feof(d))
	{
		turist.pol = 0;
        turist.godini = 0;
		fread(&turist,sizeof(TURIST),1,d);
		if ((turist.pol == 2)&&(n > turist.godini)) 
		{
			n = turist.godini;
			memmove(&najmladazhena,&turist,sizeof(TURIST));
		}
	}
	if (n == 200) printf ("\n\nNiama zheni posetili stranata ni");
	else printf("\nNaj mladata zhena posetila stranata ni e:\n\n%s zhena %s %d %s",
			    najmladazhena.ime,najmladazhena.strana,najmladazhena.godini,najmladazhena.profesia);
    fclose(d);
}


void strani()
{
    TURIST turist;
    void* stran = 0;
	char* strani;
	FILE* d = fopen("danni.dan","ab+");    //chete fajla i syzdava v dinamichnata pamet 
	fseek(d,0,SEEK_END);                   // spisyk na stranite delimitiran s '\n'
	unsigned n = ftell(d);
	rewind(d);
	stran = malloc(n);
	strani = (char*) stran;
	memset (strani,0,n);
	while(!feof(d))
	{
		turist.strana[0] = 0;
		fread(&turist,sizeof(TURIST),1,d);
		if ((turist.strana)[0] != 0) strcat(turist.strana,"\n");
		if ((strstr(strani,turist.strana)==0)) strcat(strani,turist.strana);
	}
	if (strani[0]==0) printf("Niamame nikakvi poseshtenia ot turisti");
	else 
	{
		printf("\n\nTuristite sa ot slednite strani:\n\n");
		printf(strani);    
	}
	free(stran);
	fclose(d);
}


void najmnogootkoiastrana()
{
    TURIST turist;
    void* stran = 0;
	char* strani;
	FILE* d = fopen("danni.dan","ab+"); //chete faila i sazdava v dinamichnata pamet 2 spisaka
	fseek(d,0,SEEK_END);                 // edin sas stranite, bez nito edna da se povtaria
	unsigned n = ftell(d);               // i drug sas stranite, kato vsiaka se povtaria
	rewind(d);                           // kolkoto pati se povtaria vav faila
	stran = malloc(2*n);                 // s funkciata strhowmany opredelia ot
	strani = (char*) stran;              // koia strana sa naj mnogo poseshteniata
	memset (strani,0,2*n);
	while(!feof(d))
	{
		turist.strana[0] = 0;
		fread(&turist,sizeof(TURIST),1,d);
		if ((turist.strana)[0] != 0) strcat(turist.strana,"\n");
		if ((strstr(strani,turist.strana)==0)) strcat(strani,turist.strana);
		strcat(strani+n,turist.strana);
	}
	if (strani[0]==0) printf("Niamame nikakvi poseshtenia ot turisti");
	else 
	{
		int m;
		char country[50];
		int m1 = 0;
		char country1[50];
		char* aim;
		char* chp = strani;
		int p;
		while(strani[0])
		{
			m = 0;
			memset(country,0,50);
			aim = strchr(strani,'\n');
			p = strcspn(strani,"\n");
			strncpy(country,strani,p+1);
			strani = aim +1;
			m = strhowmany(chp+n,country);
			if (m1 < m)
			{
				m1 = m;
				strcpy(country1,country);
			}
		}
		printf("\n\nNaj mnogo - %d - poseshtenia na turisti ima ot %s\n\n",m1,country1);
	}
	free(stran);
	fclose(d);
}
Ето го без goto и с малка главна програма

Обаче размества разстоянията от началото на реда и става нечетлива.

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

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

стрингове могат да се пишат в бинарнни файлове и четат добре че беше фларе да ме светне как става вижте темата всичко за един лев там съм дал пример

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Някой може ли да я направи на C++ вместо на C

 


Някой може ли да я направи на C++ вместо на C

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Някой би написал тази програма на C++. Много ми трябва.

 

 

Благодаря(предварително).

Аз съм го написал до някъде но първото, което е ,че не знам дали всичко е написано правилно и преди съм го написал но не беше както трябва.

 

#include<iostream>
#include<stdio.h>
#include<conio.h>
#include<locale>
#include<map>
#include<fstream>
#include<stdlib.h>
#include<cstring>
using namespace std;
int const N=10;
const char NAME[]="myfiles.dat";
int n;
fstream fp;

struct turist
{
string ime;
char pol;
string strana;
int god;
string prof;
};

void main(menu)
{
    setlocale(LC_ALL, "Bulgarian");
    menu();
}

void syzdavane(int &num,turist per[]);
void izvejdane(int &num,turist per[]);
void iztrivane();
void srvizrast(int &num,turist per[]);
void nmlada(int &num,turist per[]);
void strani(int &num,turist  per[]);
void nstrani(int &num,turist per[]);
void menu();

int main()
{
    while(1) menu();
    return 0;
}

void syzdavane(int &num,turist per[])
{
    cout<<endl<<"Въведете броя на туристите: ";
    cin>>n;
    fp.open("myfiles.dat",ios::binary|ios::out|ios::app);
    if(!fp)
    {
        cout<<endl<<"Грешка при създаване на файла:"<<endl;
        exit(1);
    }
    for (int i=0;i<n;i++)
    {fflush(stdin);
    cout<<endl<<"Име на турист: "<<i++<<endl;
    cin>>per.ime;
    cout<<"Пол: ";
    cin>>per.pol;
    cout<<"Страна: ";
    cin>>per.strana;
    cout<<"Години: ";
    cin>>per.god;
    cout<<"Професия: ";
    cin>>per.prof;
    }
    fp.write((char*)per,n*sizeof(turist));
    fp.close();
}

void izvejdane(int &num,turist per[])
{
    int i=0; long pos;turist p;
    cout<<endl<<"Данни на туристите:"<<endl;
    fp.open("myfiles.dat", ios::binary|ios::in);
    if(!fp)
    {
        cout<<"Грешка при прочтиване на файла!"<<endl;
    exit(1);
    }
    fp.seekg(01,ios::end);
    pos=fp.tellg();
    fp.close();
    fp.open("myfiles.dat", ios::binary|ios::in);

    for(i=0;i<pos/(sizeof(turist));i++)
    {
        fp.read((char*)&p,sizeof(turist));
        per=p;
        cout<<endl<<"Име:"<<per.ime;
        cout<<endl<<"Пол:"<<per.pol;
        cout<<endl<<"Страна:"<<per.strana;
        cout<<endl<<"Години:"<<per.god;
        cout<<endl<<"Професия:"<<per.prof;
    }
    fp.close();
}

void iztrivane() // функция за изтриване на всички записи от двоичния файл
{
    fp.open("myfiles.dat", ios::binary|ios::out); 
    fp.close();
}


void srvizrast(int &num,turist per[])
{
int suma_godini=0;
        for(int i=0;i<n;i++)
            {
    
    suma_godini+=per.god;
    

            }    cout<<"Средна възраст на туристите: "<<(suma_godini/n);
    system("pause");
}

void nmlada(int &num,turist per[])
{
    turist mlada=per[0];
    for(int i=0;i<n;i++)
    {
    if(per.pol=='f')
    {
        cout<<"Най младата жена се казва"<<per.ime<<"и е от"<<per.strana;
    }
    
    }
}

struct strana
{
    std::string ime;
    int broi;
};

void strani(int &num,turist per[])
{
std::map<int, strana> strani;
int broi=0;
            for(int i=0;i<n;i++)
                {


                }
}

 

 

Ето това е написано до някъде по точно до точката -- вкл. най-младата жена посетила страната ни. А последните 2 точки липсват.

Ще се радвам мн. ако някой може да ми помогне.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

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

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.