Programovani C

Začínáte programovat, potřebujete s něčím poradit nebo máte snad nějaký návod? Pak je tato sekce přímo pro Vás!
Odpovědět
Uživatelský avatar
Daveedek
V.I.P
V.I.P
Příspěvky: 461
Registrován: 09 říj 2005 20:51
Dal poděkování: 24 poděkování
Dostal poděkování: 5 poděkování

Programovani C

Příspěvek od Daveedek » 16 lis 2010 20:08

Zdarec... mam za ukol pomoci poli vypsat N nejvyssich cisel z tech co jsem zadal... mam to naprogramovany... delam to tedka pro trojku..viz treti radek programu, tak to musi zustat... akorat mi to vypisuje 2 nejvyssi a treti cislo v poradi zadany:( tzn ze to treti cislo v poli se neprepisuje... pomozte mi s tim prosim... dam ten zbytek W4AM co mam a thx...

Kód: Vybrat vše

#include <stdio.h>
#include <stdlib.h>
#define N 3
int main()
{
  int a,i=1,n=0,b,d,index=-1,minimum,r;
  int pole[N];
  for (;;)
  {

    printf("Zadejte cislo");
    scanf("%d",&a);
 
    if(i<=N)
      {
       pole[i]=a;
       i++;
      }
    else
      {
       minimum=pole[0];
       for(r=1;r<N;r++) 
          {
           if(minimum>pole[r])
            {
             minimum=pole[r];
             index=r;
            }
          }
     if(a>=minimum)
      {
       pole[index]=a;}
      }
    if (a==0)
    {
     printf("Ulozena cisla jsou:\n ");
     for(d=1;d<i;d++)
        {
         printf("%d \n",pole[d]);}
         printf("VLOZENIM NULY UKONCITE PROGRAM:\n ");
         scanf("%d",&b);
         if (b==0)
          {
           break;
           break;
           break;
           break;
          }
        }

    }
    return 0;
}

Uživatelský avatar
marz
Technik
Technik
Příspěvky: 482
Registrován: 23 říj 2006 15:43
Bydliště: Strahov - přechodně
Dal poděkování: 1 poděkování
Dostal poděkování: 15 poděkování
Kontaktovat uživatele:

Programovani C

Příspěvek od marz » 16 lis 2010 20:53

Osobně se mi to zdá děsně nepřehledné. Rozhodně bys měl dát příště pár komentářů.
Nechápu, proč jedeš přes nekonečný for, radši si tam dej while ( a != 0 ){ ... } - co jsem pochopil, tak pokud a == 0, pak má program skončit a vypsat čísla.

A jinak - tady máš ten opravený kód (mně to funguje), snad jsem tam na nic nezapomněl. Pokud ti to nebude fungovat, tak napiš třeba na jakém vstupu nefunguje. Neošetřuji to proti blbosti uživatele....

Kód: Vybrat vše

#include <stdio.h>
#include <stdlib.h>
#define N 3
int main()
{
  int a = 1,i=0,n=0,b,d,index=-1,minimum,r;
  int pole[N];
  while (a != 0)
  {

    printf("Zadejte cislo");
    scanf("%d",&a);

    if(i<N)
      {
       pole[i]=a;
       i++;
      }
    else
      {
       minimum=pole[0];
       index = 0;
       for(r=1;r<N;r++) 
          {
           if(minimum>pole[r])
            {
             minimum=pole[r];
             index=r;
            }
          }
     if(a>minimum)
      {
       pole[index]=a;}
      }
    if (a==0)
    {
     printf("Ulozena cisla jsou:\n");
     for(d=0;d<i;d++)
        {
         printf("%d \n",pole[d]);}
         printf("Pokracuj stisknutim <ENTER>.");

         getchar();
         getchar();
        }
    }
    return 0;
}
Najdi si tam nějaký diffem, kde jsi tam měl chyby. Minimálně tam byla chyba, když inicializuješ minimum=pole[0];, tak jsi zapomněl dát index = 0; a při vypisování jsi měl jet od nuly v tom foru a ne od jedničky.
...::||::... I blbci letí vzhůru!!! ...::||::... Nesnáším spamery!!! ...::||::... Když můžu, tak pomůžu. ...::||::...
Obrázek
Uživatelský avatar
Daveedek
V.I.P
V.I.P
Příspěvky: 461
Registrován: 09 říj 2005 20:51
Dal poděkování: 24 poděkování
Dostal poděkování: 5 poděkování

Programovani C

Příspěvek od Daveedek » 16 lis 2010 21:06

Super diky moc... a ma se mi to ale ukoncovat druhou nulou... tzn zadam nulu vypise to cisla a kdyz zadam potom dalsi nulu vypne se to, pokud cislo jiny tak pokracuju
Uživatelský avatar
Daveedek
V.I.P
V.I.P
Příspěvky: 461
Registrován: 09 říj 2005 20:51
Dal poděkování: 24 poděkování
Dostal poděkování: 5 poděkování

Programovani C

Příspěvek od Daveedek » 26 pro 2010 16:01

Zdarec tak potrebuju zase pomoct...
Mam textovy soubor kde je toto:

Kód: Vybrat vše

Karel
33
80
Jana
45
55
Radek
23
60
a potrebuju tyhle data nacist do programu a ulozit do struktury osoba.. aby kazda osoba mela jmeno vek a vahu podle toho textoveho souboru...
zatim jsme udelal tohle:

Kód: Vybrat vše

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

int main(int argc, char *argv[])
{
  FILE * fin,* fout;
  int vek,vaha;
  char c,d;
  fin=fopen("lidi.txt","r");

while(c!='\n'){
  c=getc(fin);
printf("%c",c);
}
fscanf(fin,"%d\n",&vek);
fscanf(fin,"%d\n",&vaha);

printf("Vek: %d\nVaha %d \n",c,vek,vaha);


  fclose(fin);
  
  system("PAUSE");	
  return 0;
}
Potrebuju poradit... jak ziskat ze souboru jmeno - takle se mi sice vypise ale po znacich - tudiz nemuzu s tim dal pracovat (tudiz jak z tech jednotlivych znaku udelat retezec)... a potom jak to poporade nacist - nacteni - Os1.jmeno Os1.vaha Os1.vek Os2.jmeno Os2.vaha Os2.vek

jinak nejde mi o to dostat napsany kod ale spis to pochopit a nejak se k tomu doplacat
Uživatelský avatar
spyware4me
Pilot
Pilot
Příspěvky: 638
Registrován: 23 srp 2005 21:49
Bydliště: Spyware
Dal poděkování: 5 poděkování
Dostal poděkování: 27 poděkování
Kontaktovat uživatele:

Programovani C

Příspěvek od spyware4me » 26 pro 2010 17:34

Jednoduchý, ale naprosto špatný přístup:

Kód: Vybrat vše

char name[33];
fscanf(fin, "%s\n", name);
Lepší, ale stále nepříliš dobrý:

Kód: Vybrat vše

char name[33];
fscanf(fin, "%32s\n", name);

Scanf/fscanf je taková dost záludná funkce.
Na první pohled úžasně ulehčuje práci, ale jak dojde na ošetřování výjimek, není o co stát.

Např. první uvedený přístup umožňuje načíst řetězec libovolné délky, ale vstupní pole dokáže uchovat jen řetězec o maximální délce 32 znaků.
Pokud bude vstupní posloupnost delší než 32 znaků, dojde k chybám - program může neočekávaně skončit či dojít k nesprávnému běhu.

Druhý případ je lepší v tom, že omezuje délku vstupního řetězce na 32 znaků a tedy nemůže dojít k chybám jako v prvním případě.

Oba přístupy mají ale pořád dost dalších nevýhod.
Špatně se řeší nesprávně formátovaný vstup, nelze načítat řetězce s dynamickou délkou (tzn. omezenou jen velikostí paměti), nejednoznačné návratové hodnoty funkce (Je načtení jen 10 znaků chyba? Co další znaky? Už je konec souboru?), ...


Jediný správný přístup je použítí dynamických polí a načítání po jednotlivých znacích.
Vyžaduje to už ale hlubší znalosti o dynamickém přidělování paměti.

Kód: Vybrat vše

#define INIT_SIZE 32
#define SIZE_INC 16

typedef struct {
   size_t len;
   size_t alloc;
   char *data;
} str_t

str_t *str_init(){
   str_t *str = (str_t *) malloc(sizeof(str_t));
   if (str == NULL){
      return NULL;
   }

   str->data = (char *) malloc(INIT_SIZE * sizeof(char));
   if (str->data == NULL){
      free(str);
      return NULL;
   }

   str->len   = 0;
   str->alloc = INIT_SIZE;
   str->data[0] = 0;
   return str;
}

void str_free(str_t *str){
   free(str->data);
   free(str);
}

bool str_add_char(str_t *str, char c){
   if (str->alloc <= str->len + 2){ // '+2' => +1 kvůli novému znaku, +1 kvůli zarážce
      char *tmp = (char *) realloc(str->data, (str->alloc + SIZE_INC) * sizeof(char));
      if (tmp == NULL){
         // realokace neproběhla úspěšně
         return false;
      }

      str->data  = tmp;
      str->alloc += SIZE_INC;
   }

   str->data[str->len++] = c;
   str->data[str->len] = 0;
   return true;
}


// někde ve funkci
FILE *fin = fopen("mujsoubor.txt", "r");
if (fin == NULL){
   return 1;
}

str_t *str = str_init();
if (str == NULL){
   fclose(fin);
   return 2;
}

int c;
while ((c = fgetc(fin)) != EOF){
   if (!str_add_char(str, c)){
      str_free(str);
      fclose(fin);
      return 3;
   }
}

fclose(fin);

char *data = str->data;
// teď se s proměnnou "data" dá nakládat jako s normálním céčkovským řetězcem
// před každým ukončením funkce je ale nutno zavolat str_free
There are 10 types of people. Those who understand binary and the others.
Uživatelský avatar
Daveedek
V.I.P
V.I.P
Příspěvky: 461
Registrován: 09 říj 2005 20:51
Dal poděkování: 24 poděkování
Dostal poděkování: 5 poděkování

Programovani C

Příspěvek od Daveedek » 28 pro 2010 16:19

diky moc... staci mi to pres fscanf (pozitivni pro me je ze chapu proc to neni idealni), jeste bych potreboval dat dohromady aby mi to tedka z ty funkce nacticloveka mi to nacetlo ty prvky pole do pole blbci... jak to udelam? takle to nefacha:(

Kód: Vybrat vše

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

typedef struct OSOBA{
    char jmeno[255];
    int vek;
    int vaha;
    }OSOBA;

OSOBA nacticloveka()
{
        FILE *fin;
        fin=fopen("lidi.txt","r");
        OSOBA osoba;
        int i;
        OSOBA nasilidi[3];
        for(i=0;i<3;i++){
        fscanf(fin,"%s\n",&osoba.jmeno);
        fscanf(fin,"%d\n",&osoba.vek);
        fscanf(fin,"%d\n",&osoba.vaha);
        nasilidi[i]=osoba;
        /*printf("%s\n",nasilidi[i].jmeno);
        printf("%d\n",nasilidi[i].vek);
        printf("%d\n",nasilidi[i].vaha);*/
        }
        return nasilidi[3];

        fclose(fin);

}

int main(int argc, char *argv[])
{
OSOBA blbci[3];
int i;
blbci[3]= nacticloveka();



for(i=0;i<=3;i++){
printf("%s\n",blbci[i].jmeno);
printf("%d\n",blbci[i].vek);
printf("%d\n",blbci[i].vaha);}

  system("PAUSE");
  return 0;
}
Uživatelský avatar
spyware4me
Pilot
Pilot
Příspěvky: 638
Registrován: 23 srp 2005 21:49
Bydliště: Spyware
Dal poděkování: 5 poděkování
Dostal poděkování: 27 poděkování
Kontaktovat uživatele:

Programovani C

Příspěvek od spyware4me » 28 pro 2010 17:08

Kód: Vybrat vše

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

typedef struct {
    char jmeno[255];
    int vek;
    int vaha;
} OSOBA;

void nacticloveka(OSOBA nasilidi[3])
{
        FILE *fin = fopen("lidi.txt", "r");
        // osetrit fin == NULL

        int i;
        for(i = 0; i < 3; i++){
            fscanf(fin,"%s\n", nasilidi[i].jmeno);
            fscanf(fin,"%d\n", &nasilidi[i].vek);
            fscanf(fin,"%d\n", &nasilidi[i].vaha);
        }

        fclose(fin);
}

int main(int argc, char *argv[])
{
    OSOBA blbci[3];
    nacticloveka(blbci);

    int i;
    for(i = 0; i < 3; i++){
        printf("%s %d %d\n", blbci[i].jmeno, blbci[i].vek, blbci[i].vaha);
    }

    system("PAUSE");
    return 0;
}
There are 10 types of people. Those who understand binary and the others.
Odpovědět

Zpět na „Programování“