Problem in C mit einem Programm zum Zeichen zählen



  • Hey,

    genau solche Antworten wollte ich die sich auf meinen Quellcode beziehen.
    Weil ich denke Programmieren ist ein Stück Weit "Kunst" jeder macht es anders.

    Das mit der Hex Ausgabe funktioniert nicht so wirklich.

    void printTable(char *treffer, int *anzTreffer)
    {
    int i;
    for (i=15; i <=256-4; i+=4)
    {
    if(anzTreffer!=0)
    printf("%c %i | %c %i | %c %i | %c %i \n", treffer[i], anzTreffer[i], treffer[i+1], anzTreffer[i+1], treffer[i+2], anzTreffer[i+2], treffer[i+3], anzTreffer[i+3]);
    }
    }
    Da müsste man ja noch ein Parameter übergeben oder? Oder wie kann ich das realisieren.

    Und zu der Groß und Kleinschreibung.
    Muss ich die Fuktion selber schreiben?
    Ich brauch ja eig nur eine und zwar die GroßzuKlein Buchstabe.

    Hier ist nochmal die Aufgabe Detailiert:
    http://public.beuth-hochschule.de/~kempfer/2009ws2010/ueb10/ueb10.pdf
    edit: unten im Link ist ein Beispiel wie es aussehen soll.

    achso und was noch fehlt ist das nur die zeichen angezeigt werden die auch nur vorhanden sind 😃 vielen Dank nochmal für die Hilfe

    Lg



  • TeamNoX schrieb:

    Das mit der Hex Ausgabe funktioniert nicht so wirklich.

    void printTable(char *treffer, int *anzTreffer)
    {
    int i;
    for (i=15; i <=256-4; i+=4)
    {
    if(anzTreffer!=0)
    printf("%c %i | %c %i | %c %i | %c %i \n", treffer[i], anzTreffer[i], treffer[i+1], anzTreffer[i+1], treffer[i+2], anzTreffer[i+2], treffer[i+3], anzTreffer[i+3]);
    }
    }

    ersetze er mal diese ganzen %c gegen %02x.

    TeamNoX schrieb:

    Und zu der Groß und Kleinschreibung.
    Muss ich die Fuktion selber schreiben?

    nee, die gibts schon fertig: http://www.cplusplus.com/reference/clibrary/cctype/tolower/
    🙂



  • na ja, weils anscheinend pressiert ( Abgabe spätestens 22.1 😉
    hier mal die ausgabe

    void printTable(char *treffer, int *anzTreffer){
      int i,spalte=0;
    	char c2;
    	printf("|-------------------------------------------------------|\n|");
      for (i=0; i <=255; i++)  {
        if(anzTreffer[i]>0){
    		c2=(treffer[i]>' ')?treffer[i]:' ';
        	printf(" %c (0x%02X): %d |",c2,i,anzTreffer[i]); 
    		spalte++;
    		if(spalte>=4){
    			printf("\n|");
    			spalte=0;
    		}
    
    	}
      }
    	//rest der letzten zeile ausgeben, falls noetig
    if (spalte>0){ 
      	for (i=spalte;i<4;i++){
    		printf("             |");
    	}
    	printf("\n");
    
    }
    	printf("|-------------------------------------------------------|\n");
     }
    

    kleiner tipp noch, in der windows dos box kann man mit "Alt"+ziffern (3 stellig) ueber numblock den asci code direkt eingeben, so kann man pruefen, ob auch das zeichen #255 korrekt erkannt u. gezaehlt wird.
    wenn nix eingegeben wird, wird aber noch ein "|" zuviel ausgegeben, das könnte man auch noch wegoptimieren, oder man zaehlt den zeilenumbruch "\n" generell mit 😉



  • ^^also die formatierung von dem code ist ja wohl gruselig. rück den mal vernünftig ein, öffnende { in die nächste zeile und so. so mag das ja keiner lesen. *fg*
    🙂



  • Naja ich denke jedem seins 🙂

    Gibt ja keinen offiziellen Standart oder?

    Was macht denn die Zeile.
    Die versteh ich nicht so ganz.

    c2=(treffer[i]>' ')?treffer[i]:' ';
    

    Des weitern habe ich die Funktion tolower eingesetzt hier in der Einlesen Funktion.

    void Einlesen(char *treffer,int *anzTreffer)
    {
       char kette[151];
       int i;
       int j;
       int c;
       printf("Bitte Zeichenkette (max.150) eingeben: ");
       fgets(kette ,151,stdin);
       for (i = 15; i < 256; i++)
       {
          c=intToChar(i);
           while (kette[i])
           {
              c=kette[i];
              putchar (tolower(c));
              i++;
           }
    
          for (j = 0;j <strlen(kette);j++)
          {
              if(c==kette[j])
              {
                 anzTreffer[i]++;
                 treffer[i]=c;
              }
          }
        }
    }
    

    Aber er macht mir die nicht groß. Die Funktion muss doch das Arry kette durchgehen und jeden eingegeben Buchstaben klein umwandeln oder?
    Oder wo muss ich sie einsetzen?

    Lg



  • TeamNoX schrieb:

    Naja ich denke jedem seins 🙂

    Gibt ja keinen offiziellen stan**** oder?

    nein aber es gibt definitive nogo's 😉



  • du meinst mit den { direkt hinter der anweisung?
    also

    if (a>b) {
    

    ?

    Weil sonst fällt mir nichts an der Formatierung von kermitaner.
    Macht auch 3 Leerzeichen immer usw.

    Lg



  • sowas zum beispiel 🙄

    for (i=spalte;i<4;i++){
        printf("             |");
    }
    printf("\n"); 
    
    //oder
    
      int i,spalte=0;
        char c2;
    
    //oder
    
    }
        printf("|-------------------------------------------------------|\n");
     }
    

    egal welchen stil man verwendet das lässt dir keiner durchgehen...
    außer er ist masochist, solls ja auch geben 😃

    lg lolo



  • naja ich konnte es lesen ^^
    das reicht.

    Aber du könntest du mir helfen bei dieser toLower Sache.
    Das will er mir nicht so richtig machen.

    Lg



  • Aber du könntest du mir helfen bei dieser toLower Sache.
    Das will er mir nicht so richtig machen.

    kette[i]=tolower(kette[i]);
    

    😕

    falls du dich fragst wie so ein code dann ausschauen muß damit einem da richtig einer ab geht :p

    http://www0.us.ioccc.org/years.html

    also entweder ganz oder gar nicht in deinem fall eher garnicht 😉



  • TeamNoX schrieb:

    Was macht denn die Zeile.
    Die versteh ich nicht so ganz.

    c2=(treffer[i]>' ')?treffer[i]:' ';
    

    das ist so'ne kurzschreibweise für:

    if (treffer[i] > ' ')
      c2 = treffer[i];
    else
      c2 = ' ';
    

    ^^naja, eigentlich wäre eine funktion der bessere ersatz. das 'conditional' ist sozusagen ein 'if'-ausdruck mit rückgabewert, aber egal, das spielt hier keine geige.

    TeamNoX schrieb:

    Des weitern habe ich die Funktion tolower eingesetzt hier in der Einlesen Funktion.

    ...
    

    Aber er macht mir die nicht groß.

    tolower() macht ja auch alles klein. mit toupper() machste alles gross.
    🙂



  • noobLolo schrieb:

    kette[i]=tolower(kette[i]);
    

    Und wohin muss das?

    edit:

    das mit dem i hat mich irritiert 🙂

    es muss j heißen.

    void Einlesen(char *treffer,int *anzTreffer)
    {
       char kette[151];
       int i;
       int j;
       int c;
       printf("Bitte Zeichenkette (max.150) eingeben: ");
       fgets(kette ,151,stdin);
       for (i = 15; i < 256; i++)
       {
          c=intToChar(i);
          for (j = 0;j <strlen(kette);j++)
          {
              kette[j]=tolower(kette[j]);
              if(c==kette[j])
              {
                 anzTreffer[i]++;
                 treffer[i]=c;
              }
          }
        }
    }
    

    Lg



  • Es gibt aber noch ein Problem.

    Er macht mir macht mir Ä Ö Ü nicht klein 😞

    void printTable(char *treffer, int *anzTreffer)
    {
       int i,spalte=0;
       printf("|-------------------------------------------------------|\n|");
       for (i=1; i <=256; i++)
       {
           if(anzTreffer[i]>0)
           {
              printf("%c (0x%02X): %d |",(unsigned char)i,i,anzTreffer[i]);
              spalte++;
              if(spalte>=4)
              {
                 printf("\n|");
                 spalte=0;
              }
          }
        }
       if (spalte>0)
       {
          for (i=spalte;i<4;i++)
          {
             printf("             |");
          }
          printf("\n");
       }
       printf("|-------------------------------------------------------|\n");
    }
    
    void Einlesen(char *treffer,int *anzTreffer)
    {
     char kette[150];
     int i;
     int j;
     int c;
     printf("Bitte Zeichenkette (max.150) eingeben: ");
     fgets(kette ,151,stdin);
      for (i = 15 ; i < 256; i++)
     {
         c=intToChar(i);
         for (j = 0;j <strlen(kette);j++)
         {
             kette[j]=tolower(kette[j]);
             if(c==kette[j])
             {
    
                anzTreffer[i]++;
                treffer[i]=c;
             }
          }
     }
    }
    


  • Hey ich habe noch eine andere Iddee gehabt.
    Ist jetzt auch viel einfacher 🙂

    Hier ist der Code dazu.

    Nochmal danke für die Hilfe

    #include <string.h>
    #include <stdio.h>
    #include <ctype.h>
    char intToChar(int);
    void Einlesen(char *treffer,int *anzTreffer);
    void printTable(char *treffer, int *anzTreffer);
    int askAgain(void);
    int main()
    {
     do
     {
     char treffer[256]; int anzTreffer[256];
     char weiter;
     int i=0;
     for (i;i<256;i++)
     {
        treffer[i]=' ';
        anzTreffer[i]=0;
     }
    
      printf("========================\n");
      printf("||                     ||\n");
      printf("||  Zeichenzaehler     ||\n");
      printf("||                     ||\n");
      printf("========================\n");
      Einlesen(treffer, anzTreffer);
      printTable(treffer,anzTreffer);
    
     }while (askAgain());
     return 0;
    }
    char intToChar(int i)
    {
       char c;
       if (i<256)   
       {
           c=(char)i;
           return c;
       }
       return '\n';
    }
    
    void Einlesen(char *treffer,int *anzTreffer)
    {
     unsigned char kette[151];
     int i;
     int j;
     int c;
    
     do
     {
        kette[0] = '\0';
        printf("Bitte Zeichenkette (max.150) eingeben: ");
        scanf("%150[^\n]", kette);
        clearBuffer();
        //fgets(kette ,150,stdin);
     } while (kette[0] == '\0');
    
     j = 0;
     while (kette[j] != '\0')
     {
        kette[j] = tolower(kette[j]);
        anzTreffer[kette[j]]++;
        j++;
     }
    /*
     for (i = 15 ; i < 256; i++) 
     {
         c=intToChar(i);
         for (j = 0;j <strlen(kette);j++)
         {
             kette[j]=tolower(kette[j]);
    	 if(c==kette[j])
    	 {
    
                anzTreffer[i]++;
                treffer[i]=c;
             }
          }
     }*/
    }
    void printTable(char *treffer, int *anzTreffer){
      int i,spalte=0;
      char c2;
      printf("|-----------------------------------------------------------|\n");
      for (i=0; i <=255; i++)
      {
         if(anzTreffer[i]>0)
         {
         	if (i < 32)
    	   printf("|   ");
    	else
    	   printf("| %c ", i);
            printf("(%#04x):%3d ", i, anzTreffer[i]);
            spalte++;
            if(spalte>=4)
            {
               printf("|\n");
               spalte=0;
            }
         }
      }
      if (spalte > 0)
      {
         for ( ; spalte < 4; spalte++)
         {
            printf("|              ");
         }
         printf("|\n");
      }
      printf("|-----------------------------------------------------------|\n");
    }
    
    int askAgain()
    {
    char weiter;
    do
    {
    	printf("Moechten Sie das Programm noch einmal starten  (j/n)?");
    	scanf("%c",&weiter);
    	clearBuffer();
    }
    while(weiter == 'n' &&  weiter == 'N' &&  weiter == 'j' && weiter == 'J');
    if(weiter == 'n' || weiter == 'N')
    	return 0;
    return 1;
    }
    void clearBuffer()
    {
    	char dummy;
    	do
    	{
    		scanf("%c", &dummy);
    	} while (dummy != '\n');
    }
    

Anmelden zum Antworten