program v C načítanie z textu

Sekcia: Programovanie 19.02 | 13:29
Avatar caopyp linux mint 18 mate-64-bit  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;
}
    • RE: program v C načítanie z textu 20.02 | 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 | 19:22
        Avatar caopyp linux mint 18 mate-64-bit  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)

        • RE: program v C načítanie z textu 20.02 | 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 | 21:09
            Avatar caopyp linux mint 18 mate-64-bit  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 :).

            • RE: program v C načítanie z textu 20.02 | 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 | 19:50
                Avatar caopyp linux mint 18 mate-64-bit  Používateľ

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

        • RE: program v C načítanie z textu 21.02 | 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 | 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;
      }