c++ / zliczanie liter w zdaniu i wyswietlanie ich statystyki

vmastermac
Użytkownik
Użytkownik
Posty: 7
Rejestracja: 13 maja 2007, o 20:16
Płeć: Mężczyzna
Lokalizacja: Rzeszow
Podziękował: 2 razy

c++ / zliczanie liter w zdaniu i wyswietlanie ich statystyki

Post autor: vmastermac »

Witam, mam problem z takim o to zadaniem:

Napisz program, który liczy wszystkie wystąpienia poszczególnych liter we wczytanym zdaniu i wyświetla
ich statystykę. Na końcu znajdź i wyświetl literę/litery, które najczęściej występowały wraz z ich liczbą wystąpień.

Wprowadz zdanie: To jest to.
T ----- 1
o ----- 2
------ 2
j ----- 1
e ----- 1
s ----- 1
t ----- 2
----- 2
t ----- 2
o ----- 2
. ----- 1

Najczesciej wystąpily: o, ,t po 2 razy.

Aktualnie przerabiam tablice, wskazniki i dynamiczna alokacje .. i z tym zadaniem mam najwiekszy klopot ...
Bardzo dziekuje za wszelka pomoc, pozdrawiam
Awatar użytkownika
kadiii
Użytkownik
Użytkownik
Posty: 642
Rejestracja: 20 gru 2005, o 21:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Pomógł: 130 razy

c++ / zliczanie liter w zdaniu i wyswietlanie ich statystyki

Post autor: kadiii »

Weż stwórz sobie tablicę intów i wyzeruj ją. Pobieraj literka po literce(np.getch) albo całego stringa (i stamtąd odczytywać wartości) i zwiększaj ta komórkę tablicy o indeksie odpowiadającym wartości ASCII tego znaku :
- -'A' jeśli (znak>64)&&(znak96)&&(znak<123)
^Ten warunek dlatego, że w kodzie ascii są inne znaki pomiedzy dużymi i małymi literami.
Zwiększenie komórki tablicy to oczywiście: alfabet[znak-'A']++;(lub alfabet[znak-'a']++;w zależności od spełnienia warunku).
Masz w tablicy cały alfabet, a poszczególne komórki mają wartość taką jak ilość wystąpień odpowiadającej jej literce.
Teraz sobie szukasz maksimum(maksima) w tej tablicy(chyba potrafisz?) i wypisujesz wartość komórek z maksimum oraz chary o kodzie ascii równym indeksowi plus 65 dla pierwszych 25 komórek lub plus 97 dla pozostałych. To by było na tyle. Pozdrawiam.
smiechowiec
Użytkownik
Użytkownik
Posty: 374
Rejestracja: 21 cze 2007, o 11:28
Płeć: Mężczyzna
Lokalizacja: Łostowice
Pomógł: 146 razy

c++ / zliczanie liter w zdaniu i wyswietlanie ich statystyki

Post autor: smiechowiec »

Czasem wystarczy przejrzeć tematy, które już były na forum, bo taki program już 2 razy był tu prezentowany :)

Kod: Zaznacz cały

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

/* Maksymalna dlugosc linii */
#define MAXLINIA 5000


/* dodaje znaki z lini do tablicy wystapien */
int zlicznaki(char *s, int tiznakow[]) {
  int i; /* licznik petli */
  if ((s != NULL) && (strlen(s) > 0)) {
    for(i = 0; i < strlen(s); i++)
      tiznakow[ (unsigned char) s[i] ]++;
  }
  return 0;
}


int main(int argc, char *argv[]) {
  char slinia[MAXLINIA];
  int i; /* licznik petli */
  int imax = 0; /* ilość litery wytępujej najczęściej */
  int ilosc = 0; /* ilość wystpapień najczestszego znaku */
  int tiznakow[256]; /* Tablica zmiennych podliczjaca liczbe wystapien poszczegolnych znakow */
 
  /* Wyzerowanie tablicy zliczjacej znaki */
  for(i = 0; i < 256; i++)
    tiznakow[i] = 0;
  printf("Wprowadz zdanie: ");
  fgets(slinia, MAXLINIA, stdin);
  zlicznaki(slinia, tiznakow);
 
  for(i = 0; i < strlen(slinia); i++)
    if ((unsigned char) slinia[i] > 30)
      printf("%c ----- %3i\n", slinia[i], tiznakow[(unsigned char) slinia[i] ]);
    
  for(i = 31; i < 256; i++)
    if (tiznakow[(unsigned char) i ] > imax)
      imax = tiznakow[(unsigned char) i ];
    
  printf("Najczesciej wystapily: ");
  for(i = 31; i < 256; i++)
    if (tiznakow[(unsigned char) i ] == imax) {
      if (ilosc++)
        printf(", '%c'", (unsigned char) i );
      else
        printf("'%c'", (unsigned char) i );
    }
  printf(" - %i razy\n", imax);
  
  return 0;
}
ODPOWIEDZ