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

[C++] Sortowanie napisów ze względu na ilość małych liter (błąd)

Ostatnio zmodyfikowano 2017-03-05 10:10
Autor Wiadomość
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-03-05 02:47:22
Nadal nie rozumiem jak poprawić ten błąd z przyjęciem przez funkcję tablicy napisów.

Poprawiony kod (chyba):

C/C++
#include <iostream>
#include <string>
#include <math.h>
#include <cstdlib>
#include <ctime>
#include <ctype.h>
using namespace std;






int ilemalych( const string napis )
{
    int licznik = 0;
    for( int i = 0; i < napis.length(); i++ ) { // tutaj przechodzisz dany wyraz litera po literze
        if( islower( napis[ i ] ) ) // sprawdzenie czy dana litera jest małą
             licznik++;
       
    }
    return licznik;
}
int main()
{
   
    int ilosc;
    string napis[ 9 ];
   
    do {
       
        cout << "Podaj ilosc napisow : \n ";
        cin >> ilosc;
    } while( ilosc > 10 && ilosc < 0 );
   
   
    for( int i = 0; i < ilosc; i++ ) {
       
       
        cout << "Podaj  napis : \n ";
        cin >> napis[ i ];
       
       
    }
    cout << "Przed  sortowaniem : \n ";
    for( int i = 0; i < ilosc; i++ )
         cout << napis[ i ] << " ";
   
    cout << endl;
   
   
    ilemalych( napis );
   
    cout << "Po  sortowaniu : \n ";
   
   
    for( int i = 0; i < ilosc; i++ )
         cout << napis[ i ] << " ";
   
    cout << endl;
   
   
}

-Zamieniłem tab na napis
- zamieniłem funkcję Karamby na funkcję z treści zadania
P-158571
maly7
» 2017-03-05 02:48:26
Ja zwrócę uwagę jeszcze na jedno, już jak chcesz można używać size_t, ale po co mieszać z taką inicjalizacją
licznik { };
skoro można
licznik = 0;

Wg mnie przejrzyściej wygląda, nie potrzeba dołączać standardu c++11 i na pewno to miał (jak zapytają go będzie wiedział o co chodzi ^^).

@add
nowawieza, bo w dalszym ciągu przekazujesz do funkcji tablicę! a masz przekazać tylko jeden napis czyli w twoim wypadku np.
ilemalych( napis[ 0 ] );

Tablicę napisów jako argument ma przyjmować funkcja sortująca, jeszcze jej nie napisałeś. Ta funkcja nie sortuje tylko sprawdza ile małych liter ma napis.
P-158572
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-03-05 03:00:20
No dobra.

Ale jeśli dam napis[0] to do funkcji wejdzie tylko jeden napis...
Kurcze bardzo można to zagmatwać no :/

Moje myślenie - niby pseudokod:
C/C++
Podaj ilo ś c napis ó w
Podaj napisy
Zapisz napisy w tablicy
----------

I tu się zaczyna problem, bo z zadania wynika, że powinienem zrobić dwie osobne funkcje do sortowania i do sprawdzania ilości małych liter.

Więc jak mamy osobne funkcje to:
C/C++
Pobierz do funkcji napis z tablicy.
Ilo ś ć zwracan ą zapisz do nowej tablicy ż eby si ę tamte napisy nie skasowa ł y

Do funkcji sortuj ą cej pobierz tablic ę napis ó w( ??? ) i je posortuj.

Wypisz tablic ę posortowan ą.


Na kod karamby jestem obecnie zbyt głupi i jego funkcji nie zrozumiem. A nawet jak zrozumiem to nie chcę jej użyć, bo jak za 2 dni ktoś mnie spyta o co chodzi w tej funkcji to już nic nie będę pamiętał :/ A drugi raz takiej funkcji bym nie napisał sam xD

P-158573
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-03-05 03:07:05
Dobra użyłem chyba trochę mózgu i wyszło coś takiego:
- Dodana funkcja sortowania (jakiś błąd :D)
- Dodana pętla dodająca napisy do tej funkcji ilemalych()

C/C++
#include <iostream>
#include <string>
#include <math.h>
#include <cstdlib>
#include <ctime>
#include <ctype.h>
using namespace std;






int ilemalych( const string napis )
{
    int licznik = 0;
    for( int i = 0; i < napis.length(); i++ ) { // tutaj przechodzisz dany wyraz litera po literze
        if( islower( napis[ i ] ) ) // sprawdzenie czy dana litera jest małą
             licznik++;
       
    }
    return licznik;
}

void Sortowanie( int napis[], int ilosc )
{
    for( int i = 0; i < ilosc; i++ )
    {
        for( int j = 0; j < ilosc - 1; j++ )
        {
            if( napis[ j ] > napis[ j + 1 ] )
                 swap( napis[ j ], napis[ j + 1 ] );
           
        }
    }
}

int main()
{
   
    int ilosc;
    string napis[ 9 ];
   
    do {
       
        cout << "Podaj ilosc napisow : \n ";
        cin >> ilosc;
    } while( ilosc > 10 && ilosc < 0 );
   
   
    for( int i = 0; i < ilosc; i++ ) {
       
       
        cout << "Podaj  napis : \n ";
        cin >> napis[ i ];
       
       
    }
    cout << "Przed  sortowaniem : \n ";
    for( int i = 0; i < ilosc; i++ )
         cout << napis[ i ] << " ";
   
    cout << endl;
    ////////////////////////////
    // sprawdzanie ilosci malych liter
    for( int i = 0; i < ilosc; i++ ) {
       
        ilemalych( napis[ i ] );
    }
   
   
    ///////////////////////////
    // Sortowanie
   
    Sortowanie( napis[], ilosc )
   
   
   
   
   
    //////////////////////////
    cout << "Po  sortowaniu : \n ";
   
   
    for( int i = 0; i < ilosc; i++ )
         cout << napis[ i ] << " ";
   
    cout << endl;
   
   
}

Jest jeden błąd:

C/C++
C:\U sers\filip\Desktop\programowanie\semestr 2\lab 1 zad 2.cpp In function 'int main()':
75 18 C:\U sers\filip\Desktop\programowanie\semestr 2\lab 1 zad 2.cpp[ Error ] expected primary - expression before ']' token
P-158574
maly7
» 2017-03-05 03:09:22
Ja bym właśnie zrobił tak, że sprawdził ile małych liter ma każdy napis i zapisał te ilości w kolejnej tablicy (żeby kolejności były odpowiedznie tj. trzecia wartość odpowiada ilości małych liter trzeciego napisu).
Następnie przekazał do funkcji sortującej te dwie tablice. Funkcja sortująca posortuje tablicę z ilościami małych liter przy okazji sortując tablice napisów. W takim sensie, że jeśli w tej tablicy zamienia element 3 z 5 to tak samo zamienić elementy tablicy z napisami.

Algrytmów sortowania jest wiele. Pomysłów na rozwiązanie tego zadania może być tyle co programistów, więc możesz już to robić jak chcesz i na tym polega głównie problem zadania :D

Problem leży w tej linijce:
Sortowanie( napis[], ilosc )
Tablicę przekazujesz bez żadnych dodatków (przekazuje wskaźnik na początek tablicy) czyli:
Sortowanie( napis, ilosc );

Oraz w nagłówku funkcji Sortowanie typ tablicy się nie zgadza, przekazujesz tablicę stringów więc powinno być:
void Sortowanie( string napis[], int ilosc )
P-158575
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-03-05 03:11:06
No to jeszcze będę potrzebował pomocy z użyciem tej funkcji sortującej i zrobieniem nowej tablicy.
Spróbuję coś tam zrobić :D

Powyżej masz kod który przed chwilą napisałem.
P-158576
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-03-05 03:14:30
Teraz została chyba do zrobienia tylko funkcja która używa tych dwóch tablic i dobrze wszystko zamienia.
Zrobiłbyś? :D


Kod po dodaniu nowej tablicy itd.

C/C++
#include <iostream>
#include <string>
#include <math.h>
#include <cstdlib>
#include <ctime>
#include <ctype.h>
using namespace std;






int ilemalych( const string napis )
{
    int licznik = 0;
    for( int i = 0; i < napis.length(); i++ ) { // tutaj przechodzisz dany wyraz litera po literze
        if( islower( napis[ i ] ) ) // sprawdzenie czy dana litera jest małą
             licznik++;
       
    }
    return licznik;
}

void Sortowanie( int napis[], int ilosc )
{
    for( int i = 0; i < ilosc; i++ )
    {
        for( int j = 0; j < ilosc - 1; j++ )
        {
            if( napis[ j ] > napis[ j + 1 ] )
                 swap( napis[ j ], napis[ j + 1 ] );
           
        }
    }
}

int main()
{
   
    int ilosc;
    int tab[ 100 ];
    string napis[ 9 ];
   
    do {
       
        cout << "Podaj ilosc napisow : \n ";
        cin >> ilosc;
    } while( ilosc > 10 && ilosc < 0 );
   
   
    for( int i = 0; i < ilosc; i++ ) {
       
       
        cout << "Podaj  napis : \n ";
        cin >> napis[ i ];
       
       
    }
    cout << "Przed  sortowaniem : \n ";
    for( int i = 0; i < ilosc; i++ )
         cout << napis[ i ] << " ";
   
    cout << endl;
    ////////////////////////////
    // sprawdzanie ilosci malych liter
    for( int i = 0; i < ilosc; i++ ) {
       
        tab[ i ] = ilemalych( napis[ i ] );
    }
   
   
    ///////////////////////////
    // Sortowanie
   
    Sortowanie( napis[], tab )
   
   
   
   
   
    //////////////////////////
    cout << "Po  sortowaniu : \n ";
   
   
    for( int i = 0; i < ilosc; i++ )
         cout << napis[ i ] << " ";
   
    cout << endl;
   
   
}
P-158577
maly7
» 2017-03-05 03:19:07
Już sam się chyba pogubiłem, zobacz czy to działa jak powinno:

C/C++
#include <iostream>
#include <string>
#include <math.h>
#include <cstdlib>
#include <ctime>
#include <ctype.h>
using namespace std;

int ilemalych( string napis )
{
    int licznik = 0;
    for( int i = 0; i < napis.length(); i++ ) {
        if( islower( napis[ i ] ) )
             licznik++;
       
    }
    return licznik;
}

void Sortowanie( string napis[], int ilosci[], int ilosc )
{
    for( int i = 0; i < ilosc; i++ )
    {
        for( int j = 0; j < ilosc - 1; j++ )
        {
            if( ilosci[ j ] > ilosci[ j + 1 ] )
            {
                swap( napis[ j ], napis[ j + 1 ] );
                swap( ilosci[ j ], ilosci[ j + 1 ] );
            }
        }
    }
}

int main()
{
    int ilosc, ilosci[ 9 ];
    string napis[ 9 ];
   
    do {
        cout << "Podaj ilosc napisow : \n ";
        cin >> ilosc;
    } while( ilosc > 10 && ilosc < 0 );
   
    for( int i = 0; i < ilosc; i++ ) {
        cout << "Podaj  napis : \n ";
        cin >> napis[ i ];
    }
    cout << "Przed  sortowaniem : \n ";
    for( int i = 0; i < ilosc; i++ )
         cout << napis[ i ] << " ";
   
    cout << endl;
    ////////////////////////////
    // sprawdzanie ilosci malych liter
    for( int i = 0; i < ilosc; i++ ) {
        ilosci[ i ] = ilemalych( napis[ i ] );
    }
    ///////////////////////////
    // Sortowanie
    Sortowanie( napis, ilosci, ilosc );
    //////////////////////////
    cout << "Po  sortowaniu : \n ";
    for( int i = 0; i < ilosc; i++ )
         cout << napis[ i ] << " ";
   
    cout << endl;
}

A i jeszcze gdy pobierasz ilość napisów powinno być:
while( ilosc > 9 && ilosc < 0 );
Ponieważ dozwolona ilość to 0-9. Jeśli zostawisz 0-10 to musisz zwiększyć tylko rozmiar tablicy do 10.
P-158578
1 2 3 4 « 5 » 6
Poprzednia strona Strona 5 z 6 Następna strona