Zadanie -tablicowanie zmiennych roznego rodzaju albo alternatywa, help :)

iliq

Użytkownik
Dołączył
Grudzień 6, 2011
Posty
2
Zadanie -tablicowanie ciągu roznego rodzaju albo inna metoda rozwiązania zad, help :)

Witam, robię poniższe zadanie:

"Przeczytaj ciąg liczb, kończąc czytanie na znaku wykrzyknika (!) Wydrukuj wartość maksymalną, minimalną i średnią, ze wszystkich przeczytanych liczb. "

Mam póki co problem, chciałem stablicować stringa jednak z tego co przeczytałem okazało się iż można tablicować tylko ciągi jednego rodzaju (albo inty albo chary, etc.) Może ktoś wie jak można inaczej zrobić to zadanie bo mój pomysł był taki:

-zrobić wszystko za pomocą stringa;
-sprawdzać każdą kolejny znak (funkcją isdigit)
-w przypadku kiedy isdigit zwracałby 0 sprawdzać czy jest '!' jeżeli tak, zakończyć dalsze sprawdzanie
-jeżeli byłby to inny znak powtórzyć prośbę o podanie poprawnego ciągu liczb zakończonego !
- na bierząco porównywać każdą liczbę z c (najmniejsza liczba)
- na bierząco porównywać każdą liczbę z b (największa liczba)
- na bierząco sumować wszystkie liczby a na sam koniec podzielić je przez długoś stringa

Poniżej załączam swój kod, jest zły ale chcę pokazać, że spędziłem nad tym parę godzin zamiast czekać na gotowca. Z tym, że zaciąłem się na tym tablicowaniu.

Kod:
#include<iostream>
using namespace std;
int main()
{
string txt;
int a,b=0,c=8,s=0,n;
cout<<"Podaj ciag liczb, zakoncz ciag znakiem '!'"<<endl;
cin>>txt;

for(n=txt.size();n>0;n--)
{
a=txt.size()-n;
cout<<a<<"okrazenie"<<endl;
if(txt[a]>b){b=txt[a];cout<<b<<endl;}
if(txt[a]<c){c=txt[a];cout<<c<<endl;}
}
cout<<"Najwieksza liczba ciagu = "<<b<<endl;
cout<<"Najmniejsza liczba ciagu = "<<c<<endl;
cout<<"Srednia ciagu = "<<s<<endl;
cout<<"a ="<<a;
return 0;
}
Ps wszystko piszę w vimie (na feodrze 16) kompiluję w g++ o ile to zmienia cokolwiek.
 
Ostatnio edytowane przez moderatora:

harbinger

Użytkownik
Dołączył
Styczeń 10, 2012
Posty
91
Moim zdaniem ogólnie tok rozumowania masz całkiem niezły. Kiedyś pisałem program, który na wejściu przyjmuje macierz w składni matlaba.. żeby to osiągnąć musiałem napisać toporny parser i w Twoim przypadku robiłbym to w ten sam sposób.
Jeśli chcesz zobaczyć o co mi chodzi to zassaj sobie źródełka http://nefarious.bad.mn/matrix.tar.gz

sam parser masz w plikach parses.c oraz parser.h

Powodzenia ;)
 

iliq

Użytkownik
Dołączył
Grudzień 6, 2011
Posty
2
Chciałem odpisać z gotowym rozwiązaniem ale to nie takie łatwe jakby się wydawało. Hardbringer szczerze to próbowałem obczaić Twój kod, zabierałem się do niego parę razy ale nieznajomość c mi trochę dokopała i nic nie kojarzyłem, już wydaje mi się, że mam wszystko ogarnięte, nie daję tylko rady z jedną rzeczą:

Kod:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
int main()
{
string ciag;
int a,max=0,min=8,avarage=0,n,ziom;
cout<<"Podaj ciag liczb, zakoncz ciag znakiem '!'"<<endl;
getline(cin,ciag);

for(a=0,n=ciag.size();n>0;n--,ziom/=10)
{
stringstream(ciag)>>ziom; //zmieniam string na inta
a=ziom%10; //biorę ostatnią liczbę zioma ale nie chce się w ogóle dzielić przez 10, nie mam pojęcia czemu, wszystko jest poprawnie a przy każdym obiegu ziom się nie zmienia. 
cout<<a<<endl;
cout<<ziom<<endl;
a>max ? max=a : max=max;
a<min ? min=a : min = min;
}
cout<<"Najwieksza liczba ciagu = "<<max<<endl;
cout<<"Najmniejsza liczba ciagu = "<<min<<endl;
cout<<"Srednia ciagu = "<<avarage<<endl;
cout<<"a ="<<a<<endl;
return 0;
}

PS jak mogę wrzucić swój kod w ramkę cytowania?
//
- cytat
//
Kod:
 - ramka kodu (taka jak wyżej)
//Wszystko jest jak się kliknie "Zaawansowana edycja"
//dodoxx6[/COLOR]
 
Ostatnio edytowane przez moderatora:

D.F.

Były Moderator
Dołączył
Listopad 4, 2009
Posty
493
Kod:
#include <iostream>
#include <string>

using namespace std;

int main(int argc, char* argv[])
{
    string ciag;
    int max = 0, min = 65535, a = 0;
    double average = 0;

    cout << "Podaj ciąg liczb zakończony znakiem !" << endl;
    cin >> ciag;
    
    for(int i = 0; i < ciag.length() - 1; ++i)
    {
        a = ciag[i]-48;
        average += a;
        if (a > max) max = a;
        if (a < min) min = a;
    }
    average = average / (ciag.length() - 1);
    cout << "Max = " << max << endl;
    cout << "Min = " << min << endl;
    cout << "Average = " << average << endl;

    system("PAUSE");
    
    return 0;
}

Pozdrowienia dla Grzonu.
 
Do góry Bottom