program v C načítanie z textu

Sekcia: Programovanie 19.02.2017 | 13:29
Avatar caopyp   Používateľ

Škola začína, problémy začínajú a človek si už nič nepamätá hlavne keď mal voľno 3 mesiace. Mam taký problem v C skôr 2.

1.už ma nebaví stale hľadať potrebné prikazy a vždy zabudnem kde čo najdem skuste poradiť niejakú dobru stranku kto je všetko po kope

2. program jednoducho mam načítať z textového suboru a uložiť do poľa ale neviem potrebný príkaz hmm asi bude porblém s tým sscanf ...

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


int main(){
FILE* f=fopen("ahoj","r");
int height;
int width;
char pismeno;
fscanf(f,"%d",&width);
fscanf(f,"%d",&height);
char world[height][width];
    for(int i=0;i<height;i++)
    {
    
        for(int j=0;j<width;j++)
        {
        sscanf(ahoj,"%s",pismeno);
            world[i][j]=pismeno;
            }
    }
printf("\n\n");

        for(int i=0;i<height;i++)
        {
        printf("\n");
            for(int j=0;j<width;j++)
            {
            printf("%c ",world[i][j]);
            }
        }
fclose(f);

    return 0;
}
Vieš aký je rozdiel medzi konšpiračnou teóriou a realitou? Asi 2 roky
    • RE: program v C načítanie z textu 20.02.2017 | 02:07
      Avatar Dušan_Kreheľ Debian  Používateľ

      1)

      2)

      char world[height][width];

      Taka definicia v C kóde nesmie byť! Je to chyba, reálne sa nealokuje alebo nemusí, alebo nemusí dostatočné. Nie je to správne podľa štandartu C. V C++ to môžeš použiť, ale nie v C.

      Napríklad (lepšie by bolo pole reťazcov načítavať zo súboru a ukladať):

      /*
       * WARNING !!!
       *     - write for unix like system
       * 
       *  - in Microsoft Windows is end line with chars '\r' '\n'
       *  - in older MAC OS is end line with chars '\r' '\r'
       */
      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      
      #define MAX_W 15
      #define MAX_H 15
      
      int main(){
          FILE *f;
          int height;
          int width;
          char pismeno;
          unsigned char world[MAX_W][MAX_H];
      
          /* open file */
          f=fopen("ahoj","r");
          if(f == NULL)
          {
              perror("file 'open'");
              return 1;
          }
      
          /* read width */
          if(fscanf(f,"%d",&width) != 1)
          {
              perror("read width");
              fclose(f);
              return 1;
          }
      
          /* read height */
          if(fscanf(f,"%d",&height) != 1)
          {
              perror("read height");
              fclose(f);
              return 1;
          }
      
          /* configuration and data in file are separate with new line */
          pismeno=fgetc(f);
          if(pismeno == EOF)
          {
              perror("read data");
              fclose(f);
              return 2;
          }
          if(pismeno != '\n')
          {
              fputs("error input - no separate configure and data in file", stderr);
              fclose(f);
              return 2;
          }
              
          /* read line */
          for(int i=0;i<height;i++)
          {
              /* read chars on line */
              for(int j=0;j<width;j++)
              {
                  pismeno=fgetc(f);
                  if(pismeno == EOF)
                  {
                      perror("read data");
                      fclose(f);
                      return 2;
                  }
                  world[i][j]=pismeno;
              }
              
              pismeno=fgetc(f);
              if(pismeno != '\n')
              {
                  putchar(pismeno);
                  fputs("bad char in input", stderr);
                  fclose(f);
                  return 3;
              }
          }
          
          printf("\n\n");
      
          /* print array */
          for(int i=0;i<height;i++)
          {
              for(int j=0;j<width;j++)
              {
                  putchar(world[i][j]);
              }
              putchar('\n');
          }
          fclose(f);
      
          return 0;
      }
      
      • RE: program v C načítanie z textu 20.02.2017 | 19:22
        Avatar caopyp   Používateľ

        Ďakujem že si si našiel čas , mam ešte jednu otázku ao potrebujem zo zadávaných hodnoť typu char (písmena) získať int(ich binárny kod alebo priradiť číslo hmm chcem vytvoriť Frekvenčnú tabuľku)

        Vieš aký je rozdiel medzi konšpiračnou teóriou a realitou? Asi 2 roky
        • RE: program v C načítanie z textu 20.02.2017 | 19:59
          Avatar WlaSaTy   Návštevník

          Čiže chceš text s číslovkami premeniť na číslo s ktorým sa dá počítať. Čo ti vyhodí príkaz man -k atoi?

          • RE: program v C načítanie z textu 20.02.2017 | 21:09
            Avatar caopyp   Používateľ

            S tým som ešte nepracoval. Malo by to vyzerať takto (kamoš poslal)

            void poradie(int pole[]){
                char c;
            int SIZE=20;
            
                for(int i = 0; i < SIZE; i++){
                    pole[i] = 0;
                }
            
                do{
                    c = getchar();
                    if(isalpha(c)){
                        pole[toupper(c) - 'A']++;
                    }
                }while(c != EOF);
            }
            tomu rozumiem menej ako ženám skúste poradiť ako to urobiť jednoducho alebo vysvetliť čo sa tu deje :).

            Vieš aký je rozdiel medzi konšpiračnou teóriou a realitou? Asi 2 roky
            • RE: program v C načítanie z textu 20.02.2017 | 21:39
              Avatar WlaSaTy   Návštevník

              To ale robí niečo iné ako si opísal.

              Ak si myslíš že spravíš zápočet len s lepením náhodného kódu nesúvisiaceho s zadaním, tak ti držím palce. Bohoslovecká fakulta?

              • RE: program v C načítanie z textu 21.02.2017 | 19:50
                Avatar caopyp   Používateľ

                nikto nepísal že ho použijem pri zápočte + to je len cvičenie + som to chcel len pochopiť .

                Vieš aký je rozdiel medzi konšpiračnou teóriou a realitou? Asi 2 roky
        • RE: program v C načítanie z textu 21.02.2017 | 17:23
          Avatar Dušan_Kreheľ Debian  Používateľ

          Nech sa Ti páči.

          V programovacom jazyku C sú dátové typy uložene v "RAW" formáte platformy. Tj. pre dátove typy char a int sú kládne čísla v priamom kóde, a záporne čísla na platforme Intel/Amd v doplnkovom kóde.

          Typ int je prirodzený pre platformu (tj. musí mať veľkosť prirodzenú pre procesor platformy => čiže velkosť typu int ma byť veĺkosť aritmetickej jednotky procesora .... štandart hovorí, že veľkosť minimálne 2 Bajty.).

          Dátový typ char ma veľkosť 1 Bajt a súčastne to je jediny dátovy typ, ktorý ma strikne definovanú veľkosť podľa C štandardu. ... Konverzia z char na int sa deje automatický vždy, keď sa premenna typu char náchadza v aritmo-logickom výraze zdrojového C programu.

          A pretypovanie.

    • RE: program v C načítanie z textu 21.02.2017 | 17:06
      Avatar Dušan_Kreheľ Debian  Používateľ

      Frekvenčná analýza

      #include <stdio.h>
      
      /*
       * Iba pre ANSI kodovanie na 8 bitov. Nefunguje napr. pre UTF-8, UTF-16.
       * 
       * Rozlisuje velkost pisma
       */
      void frequency_analyze(unsigned char **array, int height, int width)
      {
          /* Ak je jeden definovane, ostatne su nastavene na 0 - standart c.
           * Inac:
           *         1) definovat menovanim vsetkych prvkov pola
           *         2) pouzit funkciu bzero (alebo memset)
           */
          size_t frequency[256]={0};
          int i,j;
          
          if(x < 0 || y < 0)
          {
              fputs("error frequency analyze", stderr);
              return;
          }
          
          /*
           *  vykona analyzu
           */
          for(i=0;i<x;i++)
              for(j=0;j<y;j++)
                  frequency[array[i][j]]++;
          
          /*
           *  vypise analyzu
           */
          puts("no-show chars:");
          for(i=0; i<32; i++)
              printf("%d %n\n", i, frequency[i]);
          puts("show chars:");
          for(;i<256; i++)
              printf("'%c' %n\n", i, frequency[i]);
      }
      
      int main()
      {
          unsigned char data[4][3]=
          {
              {'a', 'n', 'o'},
              {'n', 'i', 'e'},
              {'j', 'o', 'j'},
              {'a', 'c', 'h'},
          };
          
          frequency_analyze(data, 4, 3);
          return 0;
      }