Felder auf gleiche Zahlen überprüfen?!



  • Hallo ersteinmal an alle.

    Ich habe gerade ein Problem mit einer Abfrage.
    Bei meinem Programm geht es um die Entschlüsselung eines Textes der aus einer Datei ausgelesen wird. Dies soll über die Buchstabenhäufigkeits Analyse aus einem String realisiert werden.
    Für den Fall das die max. Häufigkeit von Buchstaben mehr als einmal vorkommt, soll der Benutzer die Möglichkeit haben eine Auswahl zu treffen....und genau hier liegt mein Problem. Wie kann ich das Feld daraufhin untersuchen und dann ausgeben wenn beispielsweise der Buchstabe x, 5 mal vorhanden ist und der Buchstabe t ebenfalls? 😕

    Hier ist mein Code und bisher stimmt die Funktion auch. Ich hoffe es kann mir jemand helfen.

    Grüsse MissKitty

    #include <stdio.h>
    #include <ctype.h>
    #include <stdlib.h>
    
    #define MAX 200
    #define MAXB 26
    
    int main (void)
    {
     FILE *datei;
     char bstb='A',Buchst[MAXB],max,j,name[20],ch,copy[MAX]={0};
     int temp,swap,y,i=0,b,x,ABC[MAXB]={0},a=0;;
    
     printf("Dieses Programm entschluesselt einen codierten Text aus einer Datei\n\n");
    
    //---------------------------Datei einlesen---------------------------
    
    	printf("\nWo liegt die Datei(Beispiel:'C:\\test.txt')? ");
    	//gets(name);
    	scanf("%s",&name);
          datei=fopen(name,"r+");                         // Hole Datei zum Lesen
          if (!datei)
    	  { printf("\nDatei nicht gefunden\n");    //Pruefung ob Datei vorhanden
            system("pause");
            exit(-1);                                     //Programm abbruch
            }
          else
          { 
    		  ch=getc(datei);
          while (!feof(datei))
            { 
    		  putchar(ch);
    		  copy[i]=ch;
    		  i++;
    		  ch=getc(datei);
    		}
          }                  
    
    //------------------Zaehlen der Buchstabenhaeufigkeit-------------------------
    
     for (x=0;x<strlen(copy);x++)
     {      
      if(copy[x]>='A' && copy[x]<='Z')		// zaehlen                        
    	ABC[copy[x]-'A']++;
      if(copy[x]>='a' && copy[x]<='z')
    	ABC[copy[x]-'a']++;
     }
    
    //-------------------------------Buchstaben------------------------------
    
     do
      {
    	Buchst[a]=bstb;
    	bstb+=1;
    	a++;
      }while(a<=25);
    
    //-----------------------------Sortieren----------------------------------
    
     for (x=0;x<MAXB;x++)
      {
    	max=0;
    
    	for (j=0+x;j<MAXB;j++)
    	 if (ABC[j]>=max)
    		{
    		 max=ABC[j];                      // max suchen 
    		 swap=j;
    		}
    
    	temp=ABC[x];
    	ABC[x]=ABC[swap];
    	ABC[swap]=temp;
    
    	temp=Buchst[x];
    	Buchst[x]=Buchst[swap];
    	Buchst[swap]=temp;
      }
    //-----------------------------Schlüssel Berechnung--------------------------
    x=0;
    
     printf("\nDer haeufigste Buchstabe ist: %c  \n",Buchst[x]);
    
     y=Buchst[x]%69;				//Schlüssel Berechnung
     printf("\nDer Schluessel ist: %d\n\n",y);
    
    //---------------------------------Entschlüsseln-----------------------------
     b=0;
    
     do{
    	 if (isalpha (copy[b]))
    	 {
    	    copy[b]-=y;
    		if (copy[b]<65)
    		    copy[b]+=26;
    	 }
    	 b++;
    
    } while(copy[b]!='\0');
    
     printf("Der entschluesselte Text:%s ",copy);
    
     return 0;
    }
    


  • ich weiss zwar nicht genau was du meinst aber ich glaube du willst wissen wie du die anzahl des zeichens das der benutzer eingibt im array herausfinden willst!

    also ich wuerde das so machen:

    for(int i = 0; i < strlen(arrayname); i++)
       if(arrayname[i] == charAusDerBenutzerEingabe)
          counter++;
    

    da ich nicht glaube dass du dass meinst bitte beschreibe deine frage GENAUER!!

    na dann!!



  • du mußt erst mal berechnen, wieviele buchstaben gleicher maximaler häufigkeit es gibt:

    int anz=1,max_haeuf,i; /* anzahl de buchstaben gleicher maximaler häufigkeit */
    
    max_haeuf=ABC[0]; /* array ist ja bereits sortiert */
    for(i=1; i<MAXB; ++i)
      if(ABC[i]==max_haeuf)
        ++anz;
      else
        break;
    

    danach mußt du, falls anz>1 ist (mindestens einen buchstaben maximaler häufigkeit gibt es ja immer), eine abfrage machen:

    int i,c;
    
    if(anz>1)
    {
      printf("Es gibt mehrere Buchstaben maximaler häufigkeit!\n");
      printf("Wählen Sie bitte einen aus:\n");
      for(i=0; i<anz; ++i)
        printf(" %c",Buchst[i]);
      putchar('\n');
    
      for(;;) /* endlosschleife */
      {
        c=getchar();
        c=toupper(c);
        for(i=0; i<anz; ++i)
          if(c==Buchst[i])
            break;
    
        if(i<anz) break;
    
        printf("Sie müssen einen der angezeigten Buchstaben eingeben!\n");  }
      }
    
      y=Buchst[i]; /* y enthält nun den maximalen buchstaben */
    }
    

    EDIT: deine sortierroutine scheint fehlerhaft zu sein.


Anmelden zum Antworten