NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Pomoc - (Dev - C++)

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jacob
Člen
Avatar
Jacob:18.12.2016 17:05

Dobrý den, potřeboval bych od Vás prosím poradit, jak mám upravit program.
Nedaří se mi načíst a seřadit vzestupně mzdy do textového dokumentu vystup11.txt
Txt se vytvoří, ale mzdy se nenačtou.
Mohli byste mi prosím poradit?
Předem děkuji za pomoc :)

 #include <stdio.h>
 #include <string.h>
main()
{
        //deklarace promennych
int sum;           //scitane hodnoty
int x[75];
int i;            //vkladane cislo z klavesnice
int j;           //pocet cisel
int max;                //maximum
int min;                //minimum
FILE *fd;
int pom;                //pomocna promenna pro serazeni v .txt



sum = 0;
j = 0;
max = 0;
min = 999999;   //inicializace na pocatku
i=0;
printf("\n\n******  MENU  *******\n\n");
printf("Program na vypocet mezd\n");
printf("Pro ukonceni zadavani zadejte 0\n");
printf("--------------------------------\n\n");
do {

i++;
printf("zadej %d. mzdu = ",i);
scanf("%d",&x[i]);
if(x[i]>max) max = x[i];
if(x[i]<min && x[i]!=0) min =x[i];
sum = sum + x[i];

j++;    //zvetseni o 1 poctu cisel

}while (x[i] !=0); // zadavame do te doby, dokud nezadame 0
printf("\nVypis mezd\n"); // vypise na obrazovku

for(i=1;i<j+1;i++)
{
if(x[i]!=0) printf("%d. mzda je %d - dan je %6.2f\n",i, x[i], x[i] * 0.23);             // %f - desetinne cisla

}

j--;            //hodnotu posledni do prumeru nepocitame

printf("maximalni mzda = %d\n", max);                                   // vypise na obrazovku maximalni mzdu
printf("minimalni mzda = %d\n", min);                                   // vypise na obrazovku minimalni mzdu
printf("prumerna dan z mezd = %6.2f\n", sum*0.23/j);  // vypise na obrazovku prumernou dan z mezd
printf("prumerna hodnota mezd = %d\n", sum/j);  //cele cislo
for(i=1;i<j+1;i++)
{
if ((sum/j)<x[i]) printf ("vetsi nez prumerna hodnota mezd je mzda: %d\n",x[i]); //vypise na obrazovku mzdy, ktere jsou vetsi nez je prumer mezd
}
printf("Zapsano do souboru vystup11.txt");
printf("\n\n");

                        // zapis do souboru .txt
*fd;
 fd = fopen("vystup11.txt","w");

 for (i=0;i<j+1;j++)
 {
                        min=i;
                        for (i=0;i<j+1;j++)
                        if(x[j]<x[min])
                        min=j;

                        pom=x[min];
                        x[min]=x[i];
                        x[i]=pom;
}

 for(i=1;i<j+1;i++)
{
  fprintf(fd, "%d\n", x[i]);
}

 fclose(fd);

system("PAUSE");

}
 
Odpovědět
18.12.2016 17:05
Avatar
Libor Šimo (libcosenior):18.12.2016 19:11

Pred zapisom do suboru si nechaj vypisat pole x[], ci v nom nieco mas.

Nahoru Odpovědět
18.12.2016 19:11
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Jacob
Libor Šimo (libcosenior):18.12.2016 19:14

Tento riadok sa mi nepozdava.

for (i=0;i<j+1;j++)

Nahoru Odpovědět
18.12.2016 19:14
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jacob
Člen
Avatar
Jacob:18.12.2016 19:24

Řádek jsem zkusil upravit na: for (i=1;i<j-1;j++), program už aspoň zapisuje, ale jen první 2 mzdy. Budu se snažit dál :)

 
Nahoru Odpovědět
18.12.2016 19:24
Avatar
Odpovídá na Jacob
Libor Šimo (libcosenior):18.12.2016 19:35

Nema to byt nahodou

for (i=0;i<j+1;i++)

Nahoru Odpovědět
18.12.2016 19:35
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Jacob
Libor Šimo (libcosenior):18.12.2016 19:41

Cely ten cyklus sa mi zda byt nejaky divoky.
Nechaj si po jeho prebehnuti vypisat pole x. Ale to uz som raz pisal. Do suboru sa ti zapisuje obsah pola a ak je prazdne, aj subor bude prazdny.

Nahoru Odpovědět
18.12.2016 19:41
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Jacob
Člen
Avatar
Jacob:18.12.2016 19:46

Zkusil jsem tedy dát bez řazení, tak se to do txt zapíše viz code, takže mám chybu asi v tom řazení.
Děkuji za rady :)

        // zapis do souboru .txt
*fd;
 fd = fopen("vystup11.txt","w");


 for(i=1;i<j+1;i++)
{
  fprintf(fd, "%d\n", x[i]);
}

 fclose(fd);
 
Nahoru Odpovědět
18.12.2016 19:46
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Jacob
DarkCoder:18.12.2016 23:35
  1. vložení hlavičkového souboru string.h je zbytečné
  2. nemá-li funkce argumenty, je vhodné používat klíčové slovo void
  3. pro určení rozsahu pole je vhodné používat direktivu preprocesoru #define
  4. inicializovat proměnné je vhodné provádět přímo v deklaraci
  5. hodnota min může být v jistým případech mimo rozsah
  6. je vhodné nemíchat významné proměnné s countery
  7. chybí ošetření vstupu
  8. chybí kontrola přetečení pole
  9. výraz x[i]!=0 při výpisu mezd je zbytečnost
  10. chybné výrazy při výpočtu min a max
  11. pro opakování se výpočtu výrazu je vhodné používat proměnnou
  12. úryvek kódu *fd; je nesprávný, fd je již definován jako FILE *fd
  13. neprovádí se kontrola na úspěšné otevření a uzavření souboru
  14. úryvek kódu s tříděním je nesprávný
Nahoru Odpovědět
18.12.2016 23:35
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Libor Šimo (libcosenior):19.12.2016 8:18

15. Hlavna funkcia by mala mat navratovu hodnotu int a kod by mal koncit prikazom return 0; :-)

Nahoru Odpovědět
19.12.2016 8:18
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.