#6 KIIV
Mnohokrát děkuji, vše funguje jak má. Nyní už vidím i ty absurdní chyby, které jsem udělal (např: úplné vynechání fclose a spoustu dalších věcí).
Jsem pouze samouk začátečník, každopádně děkuji za lekci.
#2 KIIV
Trochu jsem to pozměnil v téhle části, kde jsem myslel, že by mohl být zakopaný pes, ale bohužel.
Alespoň nějaký konkrétnější tip, v čem by to mohlo být ?
poleStudentu = (Student *) calloc(100, sizeof(Student));
if(poleStudentu == NULL) {
printf("Nedostatek pameti!\n");
getchar();
exit(1);
}
while(1){
for (int i = 0; i < p; i++){
if(fscanf(vstup, "%s %s %f", poleStudentu[i].Jmeno , poleStudentu[i].Prijmeni , &poleStudentu[i].znamka) == EOF){
p = 0;}
}}
int pocetPrvku=sizeof(poleStudentu)/sizeof(Student);
poleStudentu = (Student*)realloc(poleStudentu, pocetPrvku * sizeof(Student));
if(poleStudentu == NULL) {
printf("Nedostatek pameti!\n");
getchar();
exit(1);
}
qsort(poleStudentu, pocetPrvku, sizeof(Student), &porovnejStudenty);
Dobrý večer, při spuštění mého kódu a zadání názvu souboru mi vyskočí chyba program ......exe přestal pracovat. Kód jsem si procházel několikrát a chybu nemohu najít. Překladač žádný error ani warning nevyhazuje.(používám CodeLite s TDM-GCC)
Jen kdyby náhodou, vstupní soubor vypadá nějak takhle:
Jarmila Adamkova 36
Jiri Lapcik 22
Milan Petru 12.7
Milena Novakova 37.5
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *vstup;
typedef struct
{
char * Jmeno;
char * Prijmeni;
float znamka;
} Student;
int porovnejZnamky(float a, float b){
if (a<b) return -1;
if (a>b) return 1;
return 0;
};
int porovnejStudenty(const void *n1,const void *n2){
if ((strcmp (((Student*)n1)->Prijmeni,((Student*)n2)->Prijmeni))==0) {
if ((strcmp (((Student*)n1)->Jmeno,((Student*)n2)->Jmeno))==0) {
porovnejZnamky(((Student*)n1)->znamka,((Student*)n2)->znamka);
}
else return strcmp (((Student*)n1)->Jmeno,((Student*)n2)->Jmeno);
}
else return strcmp (((Student*)n1)->Prijmeni,((Student*)n2)->Prijmeni);
};
Student *poleStudentu;
int main(int argc, char **argv)
{
char soubor[256];
int p = 255;
if (argc>1){
vstup = fopen(argv[1], "r");
if (vstup == NULL){
printf("\nVstupni soubor nelze otevrit\n");
return 1;
}
}
else{
printf("\nZadejte nazev vstupniho souboru: ");
gets(soubor);
vstup = fopen(soubor, "r");
if (vstup == NULL){
printf("\nVstupni soubor nelze otevrit\n");
return 1;
}
}
poleStudentu = (Student *) malloc(10 * sizeof(Student));
if(poleStudentu == NULL) {
printf("Nedostatek pameti!\n");
getchar();
exit(1);
}
while(1){
for (int i = 0; i < p; i++){
if (i%10==0){
poleStudentu = (Student*)realloc(poleStudentu, (i+10) * sizeof(Student));}
if(poleStudentu == NULL) {
printf("Nedostatek pameti!\n");
getchar();
exit(1);
}
if(fscanf(vstup, "%s %s %f", poleStudentu[i].Jmeno , poleStudentu[i].Prijmeni , &poleStudentu[i].znamka) == EOF){
p = 0;}
}}
int pocetPrvku=sizeof(poleStudentu)/sizeof(Student);
qsort(poleStudentu, pocetPrvku, sizeof(Student), &porovnejStudenty);
printf("Serazeni studenti: \n");
for (int i = 0; i < pocetPrvku; i++){
printf("\n%s %s %0.2f", poleStudentu[i].Jmeno, poleStudentu[i].Prijmeni, poleStudentu[i].znamka);}
free(poleStudentu);
getchar();
return 0;
}
Děkuji oběma borcům za pomoc s řešením, nejspíš jsem už i přišel na to v čem jsem měl chybu.
#4 BDS
ano to vím, nicméně to byla pouze moje snaha vyvarovat se tomuto výstupu:
při zadávání čísel musím vždy zadat jedno navíc které se jakoby do pole nezapíše(počet čísel 5 musím zadat 6) a také mám nejspíš nějakou chybu v cyklu for(j = 2; ....)
#2 BDS
#include <stdio.h>
int i, j, p, k;
double a = 0.0 , b = 10.0;
double cislo;
int main()
{
printf("Zadej pocet cisel v poli: ");
scanf("%d",&p);
double* pole = (double*)malloc(p * sizeof(double));
for(i = 1;i <= p;i++) {
printf("Zadej cisla: ");
scanf(" %lf ", &(*(pole+i)));
}
printf("Vypis pole: \n");
for(i = 1; i <= p; i++) {
printf("%.2lf ", *(pole+i)); }
printf("\n");
printf("Zadej pocet kategorii (0-10,10-100,100-1000,atd.): ");
scanf(" %d ", &k);
k++;
printf("Kategorie 0 - 10: \n");
for(i = 1; i <= p; i++) {
if ((*(pole+i) >= a) && (*(pole+i) <= b)){
printf("%.2lf ", *(pole+i));} }
a = 10.0;
b= 100.0;
for(j = 2; j < k; j++) {
printf("Kategorie %.0lf - %.0lf: \n" , a ,b);
for(i = 1; i <= p; i++) {
if ((*(pole+i) >= a) && (*(pole+i) <= b)){
printf("%.2lf ", *(pole+i));}
} printf("\n");
a = a * 10.0;
b = b * 10.0;
}
free(pole);
return 0;
}
upraveno na dynamické pole(zatím bez ošetření), ale stále mi to vypisuje nekonečný počet kategorií... přitom tohle mám ošetřeno cyklem for.
Dobrý den ve spolek, mám zadání vytvořit histogram ze vstupních hodnot. Kategorie 0-10, 10-100 atd. Počet kategorií má být proměnná. Něco jsem již splácal, ale má to své mouchy. Potřeboval bych poradit jak se jich zbavit.
#include <stdio.h>
int i, j, p, k;
double a = 0.0 , b = 10.0;
double cislo;
int main()
{
printf("Zadej pocet cisel v poli: ");
scanf("%d",&p);
double pole[p];
for(i = 1;i <= p;i++) {
printf("Zadej cisla: ");
scanf(" %lf ", &pole[i]);
}
printf("Vypis pole: \n");
for(i = 1; i <= p; i++) {
printf("%.2lf ", pole[i]); }
printf("\n");
printf("Zadej pocet kategorii (0-10,10-100,100-1000,atd.): ");
scanf(" %d ",&k);
k++;
printf("Kategorie 0 - 10: \n");
for(i = 1; i <= p; i++) {
if ((pole[i] >= a) && (pole[i] <= b)){
printf("%.2lf ", pole[i]);} }
printf("\n");
a = 10.0;
b= 100.0;
for(j = 2; j < k; j++) {
printf("Kategorie %.0lf - %.0lf: \n" , a ,b);
for(i = 1; i <= p; i++) {
if ((pole[i] >= a) && (pole[i] <= b)){
printf("%.2lf ", pole[i]);}
} printf("\n");
a = a * 10.0;
b = b * 10.0;
}
return 0;
}