Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

łańcuchy, pętla for

Ostatnio zmodyfikowano 2017-12-31 18:07
Autor Wiadomość
adrian.paz
Temat założony przez niniejszego użytkownika
łańcuchy, pętla for
» 2017-12-29 18:25:56
Witam moje zadanie to po wpisaniu łańcucha wyliczyć i wyświetlić ile razy wystąpiła dana litera. Znalazłem cuś takiego:
Załóżmy, że nie rozróżniamy wielkich/małych liter. Więc tak:

0. Wczytaj stringa, np do zmiennej: zdanie
1. Zamień wszystkie litery w stringu na małe litery.
2. Utwórz tablicę 26 elementową. Np. char tablica[26]
3. Wypełnij ją zerami.
4. Pobierz długość zmiennej zdanie, zapisz np. do zmiennej X.
5. dla i = 0,1,2..,x-1 rób 6
6. tablica[zdanie-'a']++;

7. Wypisz ładnie tą tablicę.

Jeśli chodzi o tablicę:
pod indeksem 0 siedzi liczba wystąpień a, pod 1 liczba wystąpień b, itd

krok 6 działa tak:
indeksem tablicy w tym kroku jest wyrażenie: zdanie-'a'.
zdanie - i-ta litera/symbol w stringu
zdanie-'a' zwraca 0 jeśli tam siedzi a, 1 jeśli jest tam b itd

i mam coś takiego(tylko że jest do dupy :( )
C/C++
#include <iostream>
#include <cstdlib>
#include <algorithm>
using namespace std;
string napis;
void licznik()
{
    transform( napis.begin(), napis.end(), napis.begin(),::tolower );
    char tablica[ 26 ];
    for( int i = 0; i <= 26; i++ )
    {
        tablica[ i ] = 0;
    }
    int d = napis.length();
    for( int i = 0; i < d; i++ )
   
    {
        tablica[ napis[ i ] - 'a' ] ++;
    }
    cout << tablica;
}

int main()
{
    cout << "Wczytaj lancuch, a wyswietle Ci ile razy wystapila w nim dana litera!" << endl;
    getline( cin, napis );
    licznik();
    system( "PAUSE" );
    return 0;
}
P-168212
mateczek
» 2017-12-29 20:44:03
C/C++
#include <iostream>
#include <algorithm>
using namespace std;
void licznik( string & napis )
{
    transform( napis.begin(), napis.end(), napis.begin(),::tolower );
    int tablica[ 26 ]; //wygodniej int nie char
    for( int i = 0; i < 26; i++ ) //tablica indeksujesz od 0 do 25 co da ci 26 elemetnów!!!!
    {
        tablica[ i ] = 0;
    }
    int d = napis.length();
    for( int i = 0; i < d; i++ )
   
    {
        tablica[ napis[ i ] - 'a' ] ++;
    }
    // cout << tablica; //bez sensu
    for( int i = 0; i < 26; i++ ) //tablica indeksujesz od 0 do 25 co da ci 26 elemetnów!!!!
    {
        if( tablica[ i ] ) cout << "litera " <<( char )( 'a' + i ) << " wystapila razy " << tablica[ i ] << endl;
       
    }
}

int main()
{
    string napis;
    cout << "Wczytaj lancuch, a wyswietle Ci ile razy wystapila w nim dana litera!" << endl;
    getline( cin, napis );
    licznik( napis );
    return 0;
}
P-168218
pekfos
» 2017-12-29 23:47:22
A gdzie warunek, czy znak jest poprawny? Napisanie spacji sypnie ten program.
P-168231
adrian.paz
Temat założony przez niniejszego użytkownika
» 2017-12-30 13:58:49
Dziękuję bardzo za pomoc ale proszę jeszcze o chwile cierpliwości i wytłumaczenie co robią dwie rzeczy, bo w ogóle nie wiem co tu jest napisane... Chodzi mi o :
C/C++
for( int i = 0; i < d; i++ )

{
    tablica[ napis[ i ] - 'a' ] ++;
}

C/C++
if( tablica[ i ] ) cout << "litera " <<( char )( 'a' + i ) << " wystapila razy " << tablica[ i ] << endl;

Zwłaszcza w tym drugim bo tu za dużo rzeczy się dzieje :D
P-168235
mateczek
» 2017-12-30 14:39:39
C/C++
for( int i = 0; i < d; i++ )

{
    tablica[ napis[ i ] - 'a' ] ++; //zwiększa o jeden wartość w elemencie tablicy której indexem jest literka. jeśli literka będzie  'a';to index tablicy 'a'-'a'=0;jeśli liteką bedzie 'b' to index= 'b'-'a' = 1. W ten sposób każda litera ma swój Index w 26-elementowej tablicy
}


C/C++
if( tablica[ i ] ) { // jeśli wartość w tablicy jest większa od zera (litera wystąpiła minimum raz)
    cout << "litera " <<( char )( 'a' + i ) // i=0 to litera =a. Jeśli i=1 to litera=a+1=b
    << " wystapila razy " << tablica[ i ] << endl; // to zwyczajny licznik wystąpień
P-168239
adrian.paz
Temat założony przez niniejszego użytkownika
» 2017-12-31 14:39:50
Powiedz mi jeszcze coś bo ja coś oporny jestem :D
tablica[ napis[ i ] - 'a' ] ++; //zwiększa o jeden wartość w elemencie tablicy której indexem jest literka.
 Po co jest to zwiększenie? Po to żeby dla np litery 'a' nie było 0 bo wtedy w if wyjdzie że nie ma litery? Ale jak zwiększy o 1 to potem w ifie skąd wie ile jest literek? jak to się dzieje? Mam przykładowo wyraz "rama". Kolejne literki mają wartości [17,1,13,1] podaj mi prosze na przykladzie tym jak komputer to liczy i wstawia do tablicy.
P-168281
mateczek
» 2017-12-31 17:20:40
literę traktuje jako Index

tablica[0] to inaczej tablica['a'-'a']
tablica[1] to inaczej tablica['b'-'a']
tablica[2] to inaczej tablica['c'-'a']

mamay napis "aaca"
litera 'a' czyli tablica[0]++ czyli równa 1
litera 'a' czyli tablica[0]++ czyli równa 2
litera 'c' czyli tablica[2]++ czyli równa 1
litera 'a' czyli tablica[0]++ czyli równa 3 

w tablica[0] masz ilość wystąpień litery 'a'
w tablica[25] masz ilość wystąpień litery 'z'

ifa se pomiń jak cię wk...wia :P i sam zobacz co wypluje program wtedy zobaczysz jaki ma cel ten if
C/C++
void licznik( string & napis )
{
    transform( napis.begin(), napis.end(), napis.begin(),::tolower );
    int tablica[ 26 ]; //wygodniej int nie char
    for( int i = 0; i < 26; i++ ) //tablica indeksujesz od 0 do 25 co da ci 26 elemetnów!!!!
    {
        tablica[ i ] = 0;
    }
    int d = napis.length();
    for( int i = 0; i < d; i++ )
   
    {
        tablica[ napis[ i ] - 'a' ] ++;
    }
    // cout << tablica; //bez sensu
    for( int i = 0; i < 26; i++ ) //tablica indeksujesz od 0 do 25 co da ci 26 elemetnów!!!!
    {
        cout << "litera " <<( char )( 'a' + i ) << " wystapila razy " << tablica[ i ] << endl;
       
    }
}
P-168292
adrian.paz
Temat założony przez niniejszego użytkownika
» 2017-12-31 17:57:58
Bardzo dziekuje za pomoc :D Wszystko juz (w końcu) ogarnąłem :D Powiedz mi jeszcze skąd się bierze zapis 'char' w nawiasie? Skąd taki pomysł/metoda? Kiedy takie coś się robi? Pierwszy raz widzę taki zapis
P-168294
« 1 » 2
  Strona 1 z 2 Następna strona