C Program (nem iskolai)

Kezdőlap Fórumok Programozás C Program (nem iskolai)

6 bejegyzés megtekintése - 1-6 / 6
  • Szerző
    Bejegyzés
  • #2015643
    Morzel
    Felhasználó

      Sziasztok!

      Egy olyan programot irok c-ben, ami egy külsõ text fájlból olvas be kérdéseket, majd utána a valászokat. Ez végülis egy teszt program. Már megirtam, de nem ugy mûxik, ahogy neki kéne, és nagyon nem tudom, hogy mi a baja. Már 2-szer átirtam, de nagyon nem akarja adni magát.

      Valakit megkérhetnék, hogyha van egy kis ideje, akkor átböngéssze, hogy mi lehet a gond.

      A külsõ fájlban tárolt kérdés elõtt legyen # karakter, a válaszok elõtt pedig @.

      #kérdés
      @jó válasz
      @rossz válasz
      @még rosszabb válasz
      #másik kérdés
      @jó válasz
      @rossz válasz
      (ez a tárolási mód egy késõbbi munka miatt kéne)

      Elõre is kösz!
      email cimem: rambowen@vipmail.hu
      [align=right][snapback]133522[/snapback][/align]

      Hol akadtal el?
      Kod/kodreszlet?

      #2015644
      Rambowen
      Felhasználó

        Hol akadtal el?
        Kod/kodreszlet?
        [align=right][snapback]133525[/snapback][/align]

        Basszus, bocs a csatolás nincs itt. Pill…
        Nem tudom csatolni, valami baj van vele. Mind1, itt a kód.


        #include
        #include
        #include

        typedef char t[200], tomb;

        int hasonlit(char valasz[200],char megold[200])
        {
        int hossz1, hossz2;

        hossz1 = strlen(megold);
        hossz2 = (strlen(valasz)-1);

        if ( (hossz1 == hossz2) && ((strstr(valasz,megold)) != NULL)) return 1;
        else return 0;
        }

        void main (void)
        {
        FILE *f;
        char c;
        int vank, vanv, i;
        char valasz[200];
        char megold[200];
        int jo;
        float osszjo;
        float kerdszama;
        float ertek;

        /* fajlellenorzes */
        f = fopen(„data.txt”,”rt”);
        if (f == NULL)
        {
        fprintf(stderr, „Sikertelen fajlmegnyitas!n”);
        exit(-1);
        }

        /* ertekadas */
        printf(„f”);
        osszjo = 0;
        jo = 0;
        i = 0;
        kerdszama = 0;

        while ( (c = getc(f)) != EOF) /* fajl vegeig tart az ellenorzes */
        {
        if (c==’#’) /* kerdesek keresese */
        {
        kerdszama++;
        if (vanv == 1 )
        {
        megold = ‘’;
        }
        if (( (vanv == 1) && (hasonlit(megold,valasz))) != NULL) jo++;
        i=0;
        vank = 1;
        vanv = 0;
        }

        if (c==’@’) /* valaszok keresese */
        {
        if (vanv == 1)
        {
        megold
        = ‘’;
        if ((hasonlit(megold,valasz)) != NULL)
        {
        jo++;
        i=0;
        }
        }

        if (vanv == 1) i = 0;
        if (vank == 1)
        {
        i = 0;
        printf(„n Mi a valasza: „);
        gets(valasz);
        printf(„n”);
        }

        vank = 0;
        vanv = 1;
        continue;
        }

        if (vanv == 1)
        {
        megold
        = c;
        i++;
        }

        if (vank == 1) printf(„%c”,c);
        }

        /* kiiratas */
        printf(„n


        „);
        printf(„nn Osszes kerdesek szama: %5.0f”, kerdszama-1);

        printf(„n Ebbol a jo megoldasok szama: %d”, jo);
        ertek = jo / ((kerdszama-1)/100);
        printf(„n


        „);
        printf(„n Ez %2.2f szazalekos teljesitmeny”,ertek);
        getchar();
        fclose(f);
        return(0);
        }


        #2015645
        pointux
        Felhasználó

          Hát inkább azt mondanám, hogy én hogy csinálnám:

          beolvasnám a sort… (itt persze lehet, hogy ügyelni kell a whitspace-ekre, üres sorokra stb. Ha nincs akkor csak jó, mert egyszerûbb lesz. Nekem általában olyan kell, amikor ezekre figyelni kell.)

          Code:
          void scanline( FILE *fp, char *str ) {
           i = 0;
           while ( !((feof( fp )) | (c == ‘n’)) ) {
             c = getc( fp );
             str[ i ] = c;
             i++;
           }
           str[ i ] = ‘’;
          }

          void main() {
           char str[ 200 ];
           FILE *fp;
           …
           scanline (fp, str);
           if ( str[ 0 ] == ‘#’ )
           …
          }

          Csak átláthatóbb így, nem?
          Remélem mûködõképesre írtam :))

          De, ha pl. mindig 1 kérdés, három válasz van 1. darab struktúrába olvasnám be. Bár nem értem minek vannak a #, @ jelek.

          Code:
          struct obj {
           char q[200];
           char a[3][200];
          }

          struct obj Obj[258];

          void scanstruct(obj Obj) {
            scanline (fp, Obj.q);
            scanline (fp, Obj.a[0]);
          }

          Ez kötött rendszer?
          Ha rajtam múlna úgy raknám be, hogy:
          „kérdés
          válasz_1
          válasz_2
          válasz_3
          jó_válasz_száma”

          Vagy mindig az elsõ a jó, és akkor random kell kirakni.
          Akkor az obj meg kell még egy int-tel, nyomni, be kell olvasni az egész tesztet ahogy van (van memória nem). Aztán kinyomatni.

          #2015646
          Rambowen
          Felhasználó

            Csak átláthatóbb így, nem?

            Jaja, igy tényleg jobban néz ki. 🙂

            Bár nem értem minek vannak a #, @ jelek

            Feltétlenül igy kellene, nem magyarázom hogy miért, hosszú lenne.

            Vagy mindig az elsõ a jó, és akkor random kell kirakni.

            Igen, randomban kéne kiiratni, de arra még sajna nem jöttem rá.
            Köszi, hogy foglalkoztál vele, majd megpróbálom igy. :rolleyes:

            #2015647
            pointux
            Felhasználó

              Közben találtam egy garantáltan kipróbált algoritmust a programjaim között:

              Code:
              int _read_line( FILE *fp, char *line ) {
              int i = 0;

              while ( !( feof( fp ) | line[ i – 1 ] == ‘n’ ) ) {
               line[ i ] = getc( fp );
               i++;
              }

              line[ i – 1 ] = ‘’;

              if ( feof( fp ) )
               return 1;
              else
               return 0;
              }

              Ez azt is jelzi, ha elfogyott a file…

              Talán ezt is tudod használni:

              Code:
              int _read_lines( FILE *fp, char **lines ) {
              int i, s;
              char *line;

              if ( !( line = ( char * ) calloc( 512, sizeof( char ) ) ) ) {
               printf( „Fatal error: function ‘_read_lines’: Memory allocation errorn” );
               return 0;
              }

              i = 0;
              s = 0;
              while ( !s ) {
               s = _read_line( fp, line );
               if ( _filter_line( lines[ i ], line ) != NULL )
                i++;
              }

              free( line );
              return i;
              }

              Ugyan a _filter_line a szóközöket, tabokat, meg kommentárokat szûri, hátha érdekes.

              „Igen, randomban kéne kiiratni, de arra még sajna nem jöttem rá.”
              #include

              Egyébként man random

              #1879554
              csaba
              Felhasználó

                Sziasztok!

                Egy olyan programot irok c-ben, ami egy külsõ text fájlból olvas be kérdéseket, majd utána a valászokat. Ez végülis egy teszt program. Már megirtam, de nem ugy mûxik, ahogy neki kéne, és nagyon nem tudom, hogy mi a baja. Már 2-szer átirtam, de nagyon nem akarja adni magát.

                Valakit megkérhetnék, hogyha van egy kis ideje, akkor átböngéssze, hogy mi lehet a gond.

                A külsõ fájlban tárolt kérdés elõtt legyen # karakter, a válaszok elõtt pedig @.

                #kérdés
                @jó válasz
                @rossz válasz
                @még rosszabb válasz
                #másik kérdés
                @jó válasz
                @rossz válasz
                (ez a tárolási mód egy késõbbi munka miatt kéne)

                Elõre is kösz!
                email cimem: rambowen@vipmail.hu

              6 bejegyzés megtekintése - 1-6 / 6
              • Be kell jelentkezni a hozzászóláshoz.