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

Tablica char, wskaźniki, funkcja.

Object Storage Arubacloud
0 głosów
508 wizyt
pytanie zadane 30 marca 2020 w C i C++ przez Niepokonana7999 Bywalec (2,270 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 (154,860 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,270 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,000 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,270 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,000 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,270 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 359 wizyt
pytanie zadane 24 listopada 2018 w C i C++ przez eSpring Początkujący (270 p.)
0 głosów
2 odpowiedzi 221 wizyt
pytanie zadane 12 kwietnia 2022 w C i C++ przez xTMx3 Obywatel (1,560 p.)
0 głosów
1 odpowiedź 375 wizyt
pytanie zadane 14 października 2019 w C i C++ przez Niepokonana7999 Bywalec (2,270 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...