Odczytanie z pliku; podzielnosc liczb binarnych

0

W pliku mam 1000 liczb binarnych niedluzszych niz 250 znakow, kazda kolejna odzielona znakiem bialym.
Sprawdzam, ktore sa podzielne przez 2 (ostatnia cyfra ==0), a ktore podzielne przez 8 (ostatnie 3 cyfry ==0)
Program wylicza wartosci licz_dwa i licz_osiem ale wynoszą one 0 i 0.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    fstream plik;
    plik.open("liczby.txt", ios::in);

    if(plik.good()==false)
    {
        cout<<"Blad wczytu!";
        return 1;
    }

    string zmienna;
    int licz_dwa = 0;
    int licz_osiem = 0;

    while(plik>>zmienna)
    {
            if(zmienna[zmienna.size()]=='0') licz_dwa++;
            if(zmienna[zmienna.size()]=='0' && zmienna[zmienna.size()-1]=='0' && zmienna[zmienna.size()-2]=='0') licz_osiem++;
    }
            cout<<licz_dwa<<endl<<licz_osiem;

    return 0;
}
3

zmienna[zmienna.size()] to element za ostatnim - indeksujemy od zera - więc nigdy nie będzie równy '0'

0

Dziękuję. Mam jeszcze jeden problem. W pliku dla uproszczenia dałem tylko 5 cyfr binarnych
program mam bardziej zlozony, lecz ogolnie chce pracowac na funkcji .size() w tablicach (np porownac [i] wyraz z [i+1])
domyslam, sie ze tak nie mozna, ale nie moge zrozumiec dlaczego
zmienna3.size()[i] + zmienna3.size()[i+1] w pętli to dla mnie dodanie długości pierwszego i drugiego wyrazu z pliku do siebie.

błąd kompilatora przy cout: *error: invalid types 'std::basic_string<char>::size_type {aka unsigned int}[int]' for array subscript| *

    fstream plik3;
    string zmienna3;
    plik3.open("liczby.txt", ios::in);

        for(int i=0; i<5; i++)
        {
            plik3>>zmienna3;
            cout<<zmienna3.size()[i];
        }
1

To nie jest błąd kompilatora. zmienna3.size() to np. 5. Jaki sens ma 5[i]? Indeksuj zmienna3 od razu (i na Świętowita, nazywaj zmienne jakoś normalnie i po angielsku).

0

No tak, ale jeśli np chce zrobić if'a:

if(zmienna3[i] > zmienna3[i+1]

to porówna mi dwie liczby np 10001 i 100001. A ja chcę, żeby porównał ich długości czyli 5 i 6.

1

Nie, to porówna odpowiednie znaki tego stringa.

string s = "abcd";
s[1] == 'b';
s[2] == 'c';
0

To jak mogę zaimplementować porównanie w pętli długości dwóch stringów np z [i] i [i+1]

1
string a,b;
// uzupełnij
if(a.size() == b.size()) {
}
0

Moze ja podam o co chodzi mi w kodzie
W oryginalnym zadaniu pracuje na b. duzych liczbach, nawet 250 bitowych
Chce, by znalazl najwieksza i najmniejsza liczbe w pliku (poprzez porownanie dlugosci, jeszcze nie rozpatrzylem przypadku co, gdy dlugosci sa rowne) oraz zapisal w ktorym wierszu one sie znajduja
sorki za te nazewnictwo zmiennych, ale tak mi latwiej sie polapac :P

    int wiersz_najwiekszy;
    int wiersz_najmniejszy;
    int wiersz = 0;
    fstream plik3;
    string zmienna3;
    plik3.open("liczby.txt", ios::in);

        for(int i=0; i<5; i++)
        {
            wiersz++;
            plik3>>zmienna3;
            if(zmienna3.size()[i]<zmienna3.size()[i+1]) wiersz_najmniejszy = wiersz;
            else if (zmienna3.size()[i]>zmienna3.size()[i+1]) wiersz_najwiekszy = wiersz;
}
1

Żeby porównać dwa stringi, musisz mieć dwa stringi. Jak wczytujesz nowy string, zgadnij co się dzieje ze starym ;​) Utwórz nową zmienną, do której będziesz przypisywał poprzedni string.

0

Wczytalem 2 stringi, tylko wciaz nie moge zrozumiec logicznie jak uzaleznic te stringi od petli
nie chce by tworzyly sie pary, tylko zeby po iteracji zmienna3 wskoczyla na zmienna4, a zmienna4 przesunela sie wiersz do przodu

for(int i=0; i<11; i++)
        {
            wiersz++;
            plik3>>zmienna3>>zmienna4;
            if(zmienna3.size()<zmienna4.size()) wiersz_najmniejszy = wiersz;
        }

0
string previous, current;
file >> previous;
while(file >> current) {
    if(current.size() < previous.size())
        smallest = current;
    previous = current;
}
0

Strasznie mi glupio juz ciebie pytac o pomoc, bo rozwiazania mi wylozyles na tacy
Analizuje juz dlugo i nie mam pojecia gdzie lezy blad. Kompiluje sie, ale podaje niepoprawne wiersze (chce, by wskazal mi wiersze w ktorych znajduje sie najwieksza i najmniejsza liczba)

    int wiersz_najwiekszy;
    int wiersz_najmniejszy;
    int wiersz = 1;
    fstream plik3;
    string zmienna3;
    string zmienna4;

    plik3.open("liczby.txt", ios::in);

    plik3>>zmienna3;

        while(plik3>>zmienna4)
        {
            if(zmienna3.size()<zmienna4.size()) wiersz_najmniejszy = wiersz;
            else if (zmienna3.size()>zmienna4.size()) wiersz_najwiekszy = wiersz;
            else if(zmienna3.size()==zmienna4.size())
            {
/*Jesli dlugosci stringow sa rowne, sprawdzaj czy pola [j] sa rowne, jesli nie,
daj warunek na pole mniejsze/wieksze*/

                for(int j=0; j<zmienna4.size(); j++)
                {
                    if(zmienna3[j]!=zmienna4[j])
                    {
                        if (zmienna3[j]>zmienna4[j])
                        {
                            wiersz_najwiekszy = wiersz;
                            break;
                        }
                        else
                        {
                            wiersz_najmniejszy = wiersz;
                            break;
                        }
                    }

                }

            }
            zmienna3=zmienna4;
            wiersz++;

        }

    cout<<"4.3\n";
    cout<<"Najmniejsza liczba znajduje sie w wierszu: "<<wiersz_najmniejszy<<endl;
    cout<<"Najwieksza liczba znajduje sie w wierszu: "<<wiersz_najwiekszy<<endl;
    plik3.close();
1

Jeśli chcesz podać największy i najmniejszy wiersz, to musisz też zapamiętać obecną najmniejszą i największą liczbę, inaczej z czym porównasz?

string min, max;
int wiersz_najwiekszy;
int wiersz_najmniejszy;
int wiersz = 1;
fstream plik3;
string zmienna3;
string zmienna4;

plik3.open("liczby.txt", ios::in);

plik3 >> zmienna3;
min = max = zmienna3;
while (plik3 >> zmienna4) {
    if (zmienna3.size() < zmienna4.size())
        wiersz_najmniejszy = wiersz;
    else if (zmienna3.size() > zmienna4.size())
        wiersz_najwiekszy = wiersz;
    else // if(zmienna3.size()==zmienna4.size()) // if zbedny, to jedyna pozostala opcja
        {
        if (max < zmienna4) {
            max = zmienna4;
            wiersz_najwiekszy = wiersz;
        }
        if (min > zmienna4) {
            min = zmienna4;
            wiersz_najmniejszy = wiersz;
        }
    }
    zmienna3 = zmienna4;
    wiersz++;
}

pisane w forumowym edytorze, ale powinno działać

0

No tak :) Dziekuje ci bardzo!
Nie wiem jak samodzielna nauka programowania wygladalaby bez pomocy innych na forum :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1