| | |
| Stránka: 1 z 1
| [ Príspevkov: 15 ] | |
Autor | Správa |
---|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 Bydlisko: IP: 209.85.... | Napísal Logik: 02.12.2008 20:09 | |
|
Caute, mam problem so strukturou v C. Chcem vytvorit strukturu, ktora by obsahovala dynamicku premennu Priezvisko, len neviem kde mam alokovat pamat pre priezvisko:
typedef struct Student {
char *Priezvisko; //povodne: char Priezvisko[12];
//Priezvisko = (char*)malloc((sizeof(char))*12);
int ZnamkaZMatematiky;
int ZnamkaZJazyka;
struct DatumNarodenia {
int Den;
int Mesiac;
int Rok;
} datum_narodenia;
} student;
Pomozte, kto viete...
|
|
Registrovaný: 19.09.06 Prihlásený: 21.04.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... |
povedal by som, ze tesne pred pouzitim.
|
|
Registrovaný: 02.09.05 Prihlásený: 17.11.10 Príspevky: 154 Témy: 1 |
Predpokladam, ze struktura "student" je pouzita ako typ pola, cize napr.
Kód: typedef struct Student { char *Priezvisko;
int ZnamkaZMatematiky; int ZnamkaZJazyka; struct DatumNarodenia { int Den; int Mesiac; int Rok; } datum_narodenia;
} student;
student pole_studentov[25]; Vezmime si pripad, ze priezvisko nacitavame zo standartneho vstupu, teda napr. Kód: int main () { char priezvisko[255];
scanf("%s", priezvisko); } A jednoducho pri nacitani daneho prieviska alokujeme potrebny priestor (teda tolko byte, kolko znakov obsahuje premenna priezvisko + 1 -> ukoncovaci znak) v pamati v strukture "student" a skopirujeme data z pomocnej premennej priezvisko: Kód: pole_studentov[i].Priezvisko = malloc(strlen(priezvisko)*sizeof(char) + 1); strcpy(pole_studentov[i].Priezvisko, priezvisko);
_________________ Múdry nie je ten, čo veľa vie, ale ten, kto vie, čo je treba. (Thomas Alva Edison) |
|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 Bydlisko: IP: 209.85.... | Napísal autor témy Logik: 02.12.2008 21:01 | |
|
Opravil som to, ale stale to vypisuje chyby typu: cannot convert int to char a pod.
Kód: int main() { student *A; int number = 5, i, priezvisko[12], dlzka = 0;
for (i=0; i<number; i++) { fscanf(fp_input,"%s%d%d%d%d%d", &priezvisko /*A[i].Priezvisko*/, &A[i].ZnamkaZMatematiky, &A[i].ZnamkaZJazyka, &A[i].datum_narodenia.Den, &A[i].datum_narodenia.Mesiac, &A[i].datum_narodenia.Rok); printf("priezvisko:%s; mat:%d; jazyk:%d; den:%d; mesiac:%d; rok:%d\n", A[i].Priezvisko, A[i].ZnamkaZMatematiky, A[i].ZnamkaZJazyka, A[i].datum_narodenia.Den, A[i].datum_narodenia.Mesiac, A[i].datum_narodenia.Rok); } for (i=0; i<number; i++) { A[i].Priezvisko = malloc(strlen(priezvisko) * sizeof(char) + 1); strcpy(A[i].Priezvisko, priezvisko); }
Bez dynamickeho Priezviska mi program funguje, takze tie nacitavania su dobre...len ta alokacia
|
|
Registrovaný: 19.09.06 Prihlásený: 21.04.24 Príspevky: 749 Témy: 31 Bydlisko: Ružomberok&... |
skus to sem hodit cele preboha, je zvlastne uz to prve nacitavanie ked nacitavas string, davas mu adresu ako pri cisle a priezvisko je pri tom aj tak pole intov, a pred mallocom ma byt pretypovanie, na aky tap ukazuje dany smernik. nechce sa mi to totiz spajat s predchadzajucou strukturou, ked neviem presne ako to je a domyslat si zvysok
|
|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 Bydlisko: IP: 209.85.... | Napísal autor témy Logik: 02.12.2008 21:40 | |
|
Kód: #include <stdio.h> #include <string.h> #include <alloc.h> #include <conio.h>
typedef struct Student { char *Priezvisko; int ZnamkaZMatematiky; int ZnamkaZJazyka; struct DatumNarodenia { int Den; int Mesiac; int Rok; } datum_narodenia; } student;
student LepsiStudent(student* A, int size) { int i, vrat_poradie = 0; float pom = 0, pomoc = 0, max_znamka = 5; for (i=0; i<size; i++) { pomoc = (A[i].ZnamkaZMatematiky + A[i].ZnamkaZJazyka); pom = (pomoc / 2); if (pom < max_znamka) { max_znamka = pom; vrat_poradie = i; } pomoc = 0; pom = 0; }
return A[vrat_poradie]; }
int main() { student *A; int number = 0, i, priezvisko[12], dlzka = 0;
clrscr(); printf("Zadaj cislo v rozsahu <2;5>: "); do { gotoxy(30,1); scanf("%d", &number); } while (number != 2 && number != 3 && number != 4 && number != 5); //printf("zadal si cislo: %d\n\n", number);
printf("Alokacia pola pre %d studentov\n\n", number); A = (student*)malloc(number*sizeof(student));
FILE *fp_input, *fp_output; char* FileNameInput = "Student.txt"; char* FileNameOutput = "lepsiStudent.txt";
if ((fp_input = fopen(FileNameInput, "r")) == NULL) { printf("Neda sa otvorit subor %s", FileNameInput); return -1; } if ((fp_output = fopen(FileNameOutput, "w")) == NULL) { printf("Neda sa otvorit subor %s", FileNameOutput); return -1; }
for (i=0; i<number; i++) { fscanf(fp_input,"%s%d%d%d%d%d", &priezvisko /*A[i].Priezvisko*/, &A[i].ZnamkaZMatematiky, &A[i].ZnamkaZJazyka, &A[i].datum_narodenia.Den, &A[i].datum_narodenia.Mesiac, &A[i].datum_narodenia.Rok); printf("priezvisko:%s; mat:%d; jazyk:%d; den:%d; mesiac:%d; rok:%d\n", A[i].Priezvisko, A[i].ZnamkaZMatematiky, A[i].ZnamkaZJazyka, A[i].datum_narodenia.Den, A[i].datum_narodenia.Mesiac, A[i].datum_narodenia.Rok); } for (i=0; i<number; i++) { A[i].Priezvisko =(char*) malloc((strlen(priezvisko) + 1) * sizeof(char)); strcpy(A[i].Priezvisko, priezvisko); } printf("\n\nNajlepsi student je: %s, mat: %d, jazyk: %d, den: %d, mesiac: %d, rok: %d\n", LepsiStudent(A,number).Priezvisko, LepsiStudent(A,number).ZnamkaZMatematiky, LepsiStudent(A,number).ZnamkaZJazyka, LepsiStudent(A,number).datum_narodenia.Den, LepsiStudent(A,number).datum_narodenia.Mesiac, LepsiStudent(A,number).datum_narodenia.Rok); fprintf(fp_output,"Najlepsi student:\n"); fprintf(fp_output,"Priezvisko: %s\n", LepsiStudent(A,number).Priezvisko); fprintf(fp_output,"ZnamkaZMatematiky: %d\n", LepsiStudent(A,number).ZnamkaZMatematiky); fprintf(fp_output,"ZnamkaZJazyka: %d\n", LepsiStudent(A,number).ZnamkaZJazyka); fprintf(fp_output,"Den narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Den); fprintf(fp_output,"Mesiac narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Mesiac); fprintf(fp_output,"Rok narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Rok); printf("\nZapis najlepsieho studenta do suboru\n"); printf("Pre skoncenie stlac cokolvek");
free(A); fclose(fp_input); fclose(fp_output);
getchar(); getch(); return 0; }
este k tomu patri textovy subor student.txt s 5 polozkami (studentami)
|
|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 Bydlisko: IP: 209.85.... | Napísal autor témy Logik: 02.12.2008 21:48 | |
|
tu je cely obsah suboru student.txt:
Hanusova 3 2 4 1 1986
Schrobova 1 1 5 6 1987
Jasova 2 1 6 5 1988
Koncova 2 3 8 7 1989
Pitova 4 2 9 8 1990
pouzivame borland c
_________________ Tajna misia: Ignorovat dlzne a makcene. |
|
Registrovaný: 30.04.08 Prihlásený: 15.05.15 Príspevky: 884 Témy: 3 |
Opravil som len syntakticke chyby, ktore mi hadzal kompilator (Dev-C++), takze nezarucujem, ze program bude bezat podla tvojich predstav.
Kód: #include <stdio.h> #include <string.h> #include <conio.h> #include <stdlib.h>
typedef struct Student { char *Priezvisko; int ZnamkaZMatematiky; int ZnamkaZJazyka; struct DatumNarodenia { int Den; int Mesiac; int Rok; } datum_narodenia; } student;
student LepsiStudent(student* A, int size) { int i, vrat_poradie = 0; float pom = 0, pomoc = 0, max_znamka = 5; for (i=0; i<size; i++) { pomoc = (A[i].ZnamkaZMatematiky + A[i].ZnamkaZJazyka); pom = (pomoc / 2); if (pom < max_znamka) { max_znamka = pom; vrat_poradie = i; } pomoc = 0; pom = 0; }
return A[vrat_poradie]; }
int main() { student *A; int number = 0, i, priezvisko[12], dlzka = 0;
printf("Zadaj cislo v rozsahu <2;5>: "); do { scanf("%d", &number); } while (number != 2 && number != 3 && number != 4 && number != 5); //printf("zadal si cislo: %d\n\n", number);
printf("Alokacia pola pre %d studentov\n\n", number); A = (student*)malloc(number*sizeof(student));
FILE *fp_input, *fp_output; char* FileNameInput = "Student.txt"; char* FileNameOutput = "lepsiStudent.txt";
if ((fp_input = fopen(FileNameInput, "r")) == NULL) { printf("Neda sa otvorit subor %s", FileNameInput); return -1; } if ((fp_output = fopen(FileNameOutput, "w")) == NULL) { printf("Neda sa otvorit subor %s", FileNameOutput); return -1; }
for (i=0; i<number; i++) { fscanf(fp_input,"%s%d%d%d%d%d", &priezvisko /*A[i].Priezvisko*/, &A[i].ZnamkaZMatematiky, &A[i].ZnamkaZJazyka, &A[i].datum_narodenia.Den, &A[i].datum_narodenia.Mesiac, &A[i].datum_narodenia.Rok); printf("priezvisko:%s; mat:%d; jazyk:%d; den:%d; mesiac:%d; rok:%d\n", A[i].Priezvisko, A[i].ZnamkaZMatematiky, A[i].ZnamkaZJazyka, A[i].datum_narodenia.Den, A[i].datum_narodenia.Mesiac, A[i].datum_narodenia.Rok); } for (i=0; i<number; i++) { A[i].Priezvisko =(char*) malloc((strlen((const char*)priezvisko) + 1) * sizeof(char)); strcpy(A[i].Priezvisko, (const char*)priezvisko); } printf("\n\nNajlepsi student je: %s, mat: %d, jazyk: %d, den: %d, mesiac: %d, rok: %d\n", LepsiStudent(A,number).Priezvisko, LepsiStudent(A,number).ZnamkaZMatematiky, LepsiStudent(A,number).ZnamkaZJazyka, LepsiStudent(A,number).datum_narodenia.Den, LepsiStudent(A,number).datum_narodenia.Mesiac, LepsiStudent(A,number).datum_narodenia.Rok); fprintf(fp_output,"Najlepsi student:\n"); fprintf(fp_output,"Priezvisko: %s\n", LepsiStudent(A,number).Priezvisko); fprintf(fp_output,"ZnamkaZMatematiky: %d\n", LepsiStudent(A,number).ZnamkaZMatematiky); fprintf(fp_output,"ZnamkaZJazyka: %d\n", LepsiStudent(A,number).ZnamkaZJazyka); fprintf(fp_output,"Den narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Den); fprintf(fp_output,"Mesiac narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Mesiac); fprintf(fp_output,"Rok narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Rok); printf("\nZapis najlepsieho studenta do suboru\n"); printf("Pre skoncenie stlac cokolvek");
free(A); fclose(fp_input); fclose(fp_output);
getchar(); getch(); return 0; }
Pre buducnost - linky do code.
//no, ako vidim, zaslal si uz aj obsah toho suboru. Bohuzial, program spravne nefunguje, je tam nejaka logicka chyba, mozem to este skusit ceknut...
//prave som skusal pri vstupe zadat cislo 2 - a co sa nestalo? restartoval sa pocitac
_________________ Empty your memory, with a free()… like a pointer! If you cast a pointer to an integer, it becomes the integer, if you cast a pointer to a struct, it becomes the struct… The pointer can crash…, and can overflow… Be a pointer my friend… |
|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 Bydlisko: IP: 209.85.... | Napísal autor témy Logik: 02.12.2008 22:02 | |
|
super, uz mi nevyhadzuje chyby, len mi zle vypisuje, do toho priezviska mi ostane ulozene vzdy posledne priezvisko, to znamena ze kopirujem do kazdeho A[i].Priezvisko to iste priezvisko, to este treba osetrit...
_________________ Tajna misia: Ignorovat dlzne a makcene. |
|
Registrovaný: 30.04.08 Prihlásený: 15.05.15 Príspevky: 884 Témy: 3 |
Nech sa paci. Kód: #include <stdio.h> #include <string.h> #include <conio.h> #include <stdlib.h>
typedef struct Student { char Priezvisko[12]; int ZnamkaZMatematiky; int ZnamkaZJazyka; struct DatumNarodenia { int Den; int Mesiac; int Rok; } datum_narodenia; } student;
student LepsiStudent(student* A, int size) { int i, vrat_poradie = 0; float pom = 0, pomoc = 0, max_znamka = 5; for (i=0; i<size; i++) { pomoc = (A[i].ZnamkaZMatematiky + A[i].ZnamkaZJazyka); pom = (pomoc / 2); if (pom < max_znamka) { max_znamka = pom; vrat_poradie = i; } pomoc = 0; pom = 0; }
return A[vrat_poradie]; }
int main(void) { student *A; int number = 0, i, priezvisko[12], dlzka = 0;
printf("Zadaj cislo v rozsahu <2;5>: "); do { scanf("%d", &number); } while (number != 2 && number != 3 && number != 4 && number != 5);
printf("Alokacia pola pre %d studentov\n\n", number); A = (student*)malloc(number*sizeof(student));
FILE *fp_input, *fp_output; char* FileNameInput = "Student.txt"; char* FileNameOutput = "lepsiStudent.txt";
if ((fp_input = fopen(FileNameInput, "r")) == NULL) { printf("Neda sa otvorit subor %s", FileNameInput); return 1; } if ((fp_output = fopen(FileNameOutput, "w")) == NULL) { printf("Neda sa otvorit subor %s", FileNameOutput); return 1; }
for (i=0; i<number; i++) { fscanf(fp_input,"%11s%d%d%d%d%d", &A[i].Priezvisko, &A[i].ZnamkaZMatematiky, &A[i].ZnamkaZJazyka, &A[i].datum_narodenia.Den, &A[i].datum_narodenia.Mesiac, &A[i].datum_narodenia.Rok); printf("priezvisko:%s; mat:%d; jazyk:%d; den:%d; mesiac:%d; rok:%d\n", A[i].Priezvisko, A[i].ZnamkaZMatematiky, A[i].ZnamkaZJazyka, A[i].datum_narodenia.Den, A[i].datum_narodenia.Mesiac, A[i].datum_narodenia.Rok); }
printf("\n\nNajlepsi student je: %s, mat: %d, jazyk: %d, den: %d, mesiac: %d, rok: %d\n", LepsiStudent(A,number).Priezvisko, LepsiStudent(A,number).ZnamkaZMatematiky, LepsiStudent(A,number).ZnamkaZJazyka, LepsiStudent(A,number).datum_narodenia.Den, LepsiStudent(A,number).datum_narodenia.Mesiac, LepsiStudent(A,number).datum_narodenia.Rok); fprintf(fp_output,"Najlepsi student:\n"); fprintf(fp_output,"Priezvisko: %s\n", LepsiStudent(A,number).Priezvisko); fprintf(fp_output,"ZnamkaZMatematiky: %d\n", LepsiStudent(A,number).ZnamkaZMatematiky); fprintf(fp_output,"ZnamkaZJazyka: %d\n", LepsiStudent(A,number).ZnamkaZJazyka); fprintf(fp_output,"Den narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Den); fprintf(fp_output,"Mesiac narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Mesiac); fprintf(fp_output,"Rok narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Rok); printf("\nZapis najlepsieho studenta do suboru\n"); printf("Pre skoncenie stlac cokolvek");
free(A); fclose(fp_input); fclose(fp_output);
getchar(); getch(); return 0; }
A nabuduce prosim ta, dodrziavaj trochu "stabnu kulturu".
_________________ Empty your memory, with a free()… like a pointer! If you cast a pointer to an integer, it becomes the integer, if you cast a pointer to a struct, it becomes the struct… The pointer can crash…, and can overflow… Be a pointer my friend… |
|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 Bydlisko: IP: 209.85.... | Napísal autor témy Logik: 02.12.2008 22:50 | |
|
Dakujeeeem a co spravi %11s pri nacitavani priezvisk zo suboru, to som este nevidel? ale uloha bola spravit Priezvisko v strukture dynamicky... inak presne tak to ma fungovat, sikovny, dakujem krasne, a vedel by si spravit Priezvisko dynamicky? zeby bolo v stukture namiesto Priezvisko[12] => *Priezvisko...
_________________ Tajna misia: Ignorovat dlzne a makcene. |
|
Registrovaný: 30.04.08 Prihlásený: 15.05.15 Príspevky: 884 Témy: 3 |
Nie je zac.
to %11s znamena, ze sa nacita retazec dlhy maximalne 11 znakov, takze ak by bolo priezvisko napr. starablaskova (co je 13 znakov), tak by sa ulozilo len starablasko.
Tu mas aj dynamicke Priezvisko.
Kód: #include <stdio.h> #include <string.h> #include <conio.h> #include <stdlib.h>
typedef struct Student { char *Priezvisko; int ZnamkaZMatematiky; int ZnamkaZJazyka; struct DatumNarodenia { int Den; int Mesiac; int Rok; } datum_narodenia; } student;
student LepsiStudent(student* A, int size) { int i, vrat_poradie = 0; float pom = 0, pomoc = 0, max_znamka = 5; for (i=0; i<size; i++) { pomoc = (A[i].ZnamkaZMatematiky + A[i].ZnamkaZJazyka); pom = (pomoc / 2); if (pom < max_znamka) { max_znamka = pom; vrat_poradie = i; } pomoc = 0; pom = 0; }
return A[vrat_poradie]; }
int main(void) { student *A; int number = 0, i, priezvisko[12], dlzka = 0;
printf("Zadaj cislo v rozsahu <2;5>: "); do { scanf("%d", &number); } while (number != 2 && number != 3 && number != 4 && number != 5);
printf("Alokacia pola pre %d studentov\n\n", number); A = (student*)malloc(number*sizeof(student));
FILE *fp_input, *fp_output; char* FileNameInput = "Student.txt"; char* FileNameOutput = "lepsiStudent.txt";
if ((fp_input = fopen(FileNameInput, "r")) == NULL) { printf("Neda sa otvorit subor %s", FileNameInput); return 1; } if ((fp_output = fopen(FileNameOutput, "w")) == NULL) { printf("Neda sa otvorit subor %s", FileNameOutput); return 1; }
for (i=0; i<number; i++) { if ((A[i].Priezvisko=(char *)malloc(sizeof(char)*12))==NULL) return 1; fscanf(fp_input,"%11s%d%d%d%d%d", A[i].Priezvisko, &A[i].ZnamkaZMatematiky, &A[i].ZnamkaZJazyka, &A[i].datum_narodenia.Den, &A[i].datum_narodenia.Mesiac, &A[i].datum_narodenia.Rok); printf("priezvisko:%s; mat:%d; jazyk:%d; den:%d; mesiac:%d; rok:%d\n", A[i].Priezvisko, A[i].ZnamkaZMatematiky, A[i].ZnamkaZJazyka, A[i].datum_narodenia.Den, A[i].datum_narodenia.Mesiac, A[i].datum_narodenia.Rok); }
printf("\n\nNajlepsi student je: %s, mat: %d, jazyk: %d, den: %d, mesiac: %d, rok: %d\n", LepsiStudent(A,number).Priezvisko, LepsiStudent(A,number).ZnamkaZMatematiky, LepsiStudent(A,number).ZnamkaZJazyka, LepsiStudent(A,number).datum_narodenia.Den, LepsiStudent(A,number).datum_narodenia.Mesiac, LepsiStudent(A,number).datum_narodenia.Rok); fprintf(fp_output,"Najlepsi student:\n"); fprintf(fp_output,"Priezvisko: %s\n", LepsiStudent(A,number).Priezvisko); fprintf(fp_output,"ZnamkaZMatematiky: %d\n", LepsiStudent(A,number).ZnamkaZMatematiky); fprintf(fp_output,"ZnamkaZJazyka: %d\n", LepsiStudent(A,number).ZnamkaZJazyka); fprintf(fp_output,"Den narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Den); fprintf(fp_output,"Mesiac narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Mesiac); fprintf(fp_output,"Rok narodenia: %d\n", LepsiStudent(A,number).datum_narodenia.Rok); printf("\nZapis najlepsieho studenta do suboru\n"); printf("Pre skoncenie stlac cokolvek");
free(A); fclose(fp_input); fclose(fp_output);
getchar(); getch(); return 0; }
_________________ Empty your memory, with a free()… like a pointer! If you cast a pointer to an integer, it becomes the integer, if you cast a pointer to a struct, it becomes the struct… The pointer can crash…, and can overflow… Be a pointer my friend… |
|
Registrovaný: 10.07.07 Prihlásený: 02.11.17 Príspevky: 1060 Témy: 0 Bydlisko: Bratislava |
no pri "stabnej kulture"
minimalne..ak zavriem vsetky oci, aj tak
FILE *fp_input, *fp_output;
char* FileNameInput = "Student.txt";
char* FileNameOutput = "lepsiStudent.txt";
nemaju co hladat za
int main(void) {
_________________ Nebo je modre, voda je mokra... |
|
Registrovaný: 23.11.08 Príspevky: 187 Témy: 34 Bydlisko: IP: 209.85.... | Napísal autor témy Logik: 02.12.2008 23:18 | |
|
Cela izba na intraku ti dakujeme To by sme na to neprisli vymazat & pri nacitani priezviska zo suboru....vdaka
_________________ Tajna misia: Ignorovat dlzne a makcene. |
|
Registrovaný: 30.04.08 Prihlásený: 15.05.15 Príspevky: 884 Témy: 3 |
Nie je zac. To je len tym, ze funckia scanf ocakava adresu, pricom hodnota pointra Priezvisko je adresa, takze sa tam & dat v takomto pripade nemoze.
_________________ Empty your memory, with a free()… like a pointer! If you cast a pointer to an integer, it becomes the integer, if you cast a pointer to a struct, it becomes the struct… The pointer can crash…, and can overflow… Be a pointer my friend… |
|
| Stránka: 1 z 1
| [ Príspevkov: 15 ] | |
| Nemôžete zakladať nové témy v tomto fóre Nemôžete odpovedať na témy v tomto fóre Nemôžete upravovať svoje príspevky v tomto fóre Nemôžete mazať svoje príspevky v tomto fóre
|
|