• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Tablica char, wskaźniki, funkcja.

0 głosów
1,675 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Niepokonana7999 Bywalec (2,310 p.)

Witam

Proszę o pomoc, jak zrobić, żeby to działało?

Mamy funkcję zwracającą wartość całkowitą i tablicę typu char, która ma pojemność 30 znaków, może mieć mniej elementów. W tej tablicy mogą być tylko zera i jedynki, ale nie wiadomo ile jest tych zer i jedynek, a gdzie zaczynają się przypadkowe znaki. No i funkcja, która to sprawdza nie działa.

int ileJestWTablicy( char *tablicaZnakow)
{ int policz=1;
        for ( int i=0; i<30;i++)
                {
                    if ( *(tablicaZnakow+i)=='1' || *(tablicaZnakow+i)=='0')
                        policz++;
                    else
                    return policz;

                }
return policz;
}

 

1 odpowiedź

0 głosów
odpowiedź 30 marca 2020 przez tangarr Mędrzec (155,120 p.)
Aby znaleźć rozwiązanie tego zadania odpowiedz sobie na dwa pytania:
1. Dlaczego zmienna policz na dzień dobry ma wartość 1?
2. Dlaczego kończysz funkcję w przypadku napotkania innego znaku niż 0 lub 1? (linie 7-8)
komentarz 31 marca 2020 przez Niepokonana7999 Bywalec (2,310 p.)
edycja 31 marca 2020 przez Niepokonana7999
Panie tkz, ja Pańskiego kodu nie lubię, bo go nie rozumiem. No właśnie, nikt nie ma powodu by być niemiłym, a ludzie są niemili. Tak, getline bierze dodatkowo ogranicznik, a get nie. Przynajmniej tak było na kursie c++. No właśnie nie jest to pułapka. Tekst nie jest trefny. To co ja mam poprawić? Chce Pan cały kod? No właśnie ja użyłam funkcji get zamiast getline. Nie, pan tkz lubi mi dawać kody, których ja nie rozumiem. Ja się wyrażam bardzo jasno i kompletnie nie rozumiem, dlaczego Panowie nic nie rozumieją. Panie tkz, ale tu nie chodzi, że by ten program się kompilował w 0,0005 sekundy, tylko o to, żeby w ogóle działał. Tak naprawdę nie mieliśmy na lekcji wskaźników w ogóle i ja się sama dowiedziałam, także samo użycie wskaźnika naraża mnie na jedynkę za spisywanie, co dopiero klasy.
komentarz 31 marca 2020 przez tkz Nałogowiec (42,040 p.)

Nie Pan... Kod z wytłumaczeniem, przy założeniu, że każda linia, to jedno słowo bez białych znaków z wyłączeniem nowej linii. 

#include <iostream>
#include <fstream>
 
int main(void)
{
    std::ifstream file("nazwa_pliku.txt"); //nazwa pliku, otwieramy go do odczytu, rownowazne z std::fstream plik; plik.open("nazwa.txt", std::ios::in);
    std::string line; //tutaj bedzimy pobierac linie z pliku, tylko jedna 
    unsigned evenWords{0}; // licznik parzystych wyrazow
    while(std::getline(file, line)) //getline pobiera z file linie; wez_linie(skad, gdzie_zapisac_linie)
    {
        if(line.size()%2==0) // line.size() badz line.length() zwraca dlugosc linii; sprawdzamy, czy dlugosc jest parzysta, stad modulo 2
            evenWords++;
    }
    std::cout<<evenWords;
    return 0;
}

Jeżeli czegoś nie zrozumiesz, wytłumaczę, jeżeli mnie to przerośnie, na pewno ktoś inny z chęcią mnie zastąpi. Po prostu pytaj. 

Właściwe jak podasz cały kod będzie chyba prościej dopasować rozwiązanie pod to, co potrafisz. 

komentarz 31 marca 2020 przez Niepokonana7999 Bywalec (2,310 p.)

Problem tkwi w tym, że ja w ogóle nie wiem, co robi std:: i musiałbyś mi to od samego początku tłumaczyć.
Dopiero niedawno ~tydzień temu dowiedziałam się, co to są klasy i że to są takie struktury tylko mają dużo więcej opcji. Ale nie umiem za bardzo wywoływać klasowych funkcji, a Ty chyba właśnie to robisz. XD

Oh, się pomyliłam. W oryginalnym zadaniu jest od 2 do 16 nie od 5 do 30, wybaczcie. Źle spisałam. Aczkolwiek nadal nie działa.

#include <iostream>
#include <fstream>
using namespace std;


int rozmiar( char *);
int main()
{

    fstream dane, wynik; int parz=0;
    dane.open("napisy.txt", ios::in);
    wynik.open("zadanie4.txt", ios::out);

    for ( int i=0; i<1000; i++)
    {
        char bufor[16];
                dane.get( bufor, 16);

        if ( rozmiar(bufor)%2 == 0 )
        {
            parz++;
        }



    }
    cout << parz;




    dane.close();
    wynik.close();
    return 0;
}
int rozmiar( char *tablica)
{ int ilee=0;
        for ( int i=0; i<16;i++)
                {
                    if ( *(tablica+i)=='1' || *(tablica+i)=='0')
                        {ilee++;}


                }
return ilee;
}

 

komentarz 31 marca 2020 przez tkz Nałogowiec (42,040 p.)

std:: to przestrzeń nazw. Wyobraź sobie, że wchodzisz na sale wykładową mówisz "Jan" wstaje trzech Janów, mówisz "Jan Kowalski" wstaje jeden. nazwisko::imie, std::cout itp.

Używasz klas, fstream jest klasą. 

Dlaczego korzystasz z tablicy charów, zamiast stringa? 

#include <iostream>
#include <fstream>
using namespace std;

int rozmiar(char *);
int main()
{

    fstream dane, wynik;
    int parz = 0;
    dane.open("napisy.txt", ios::in);
    wynik.open("zadanie4.txt", ios::out);

    for (int i = 0; i < 1000; i++)
    {
        char bufor[16]={};
        dane.getline(bufor, 16);

        if (rozmiar(bufor) % 2 == 0)
        {
            parz++;
        }
    }
    cout << parz;
    dane.close();
    wynik.close();
    return 0;
}
int rozmiar(char *tablica)
{
    int ilee = 0;
    for (int i = 0; i < 16; i++)
    {
        if (*tablica++ !='\0') //przesuwam wskaźnik po tablicy aż napotkam terminatora, czyli znak kończący napis w c/c++ 
        {
            ilee++;
        }
    }
    return ilee;
}

Poprawiłem dwie rzeczy, get na getline. Różnica między metodą get, a getline jest jedna, tzn. getline usuwa znak końca linii \n z ciągu znaków, get nie.(https://forum.pasja-informatyki.pl/116916/jak-dziala-cin-getline-i-cin-get)

Uprościłem funkcję rozmiar, ale możesz zostać przy swojej. 

komentarz 1 kwietnia 2020 przez Niepokonana7999 Bywalec (2,310 p.)
Ja bardzo panów przepraszam, niepotrzebnie zrobiłam wątek. :(

Już działa, miałam błąd i dlatego nie działało.

Podobne pytania

0 głosów
2 odpowiedzi 780 wizyt
pytanie zadane 24 listopada 2018 w C i C++ przez eSpring Początkujący (270 p.)
0 głosów
2 odpowiedzi 948 wizyt
pytanie zadane 12 kwietnia 2022 w C i C++ przez xTMx3 Obywatel (1,560 p.)
0 głosów
1 odpowiedź 993 wizyt
pytanie zadane 14 października 2019 w C i C++ przez Niepokonana7999 Bywalec (2,310 p.)

93,800 zapytań

142,770 odpowiedzi

323,464 komentarzy

63,421 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...