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

[ Lekcja 32 ] Problem z pracą domową.

Ostatnio zmodyfikowano 2014-10-07 20:42
Autor Wiadomość
FIGUS
Temat założony przez niniejszego użytkownika
[ Lekcja 32 ] Problem z pracą domową.
» 2014-10-07 18:52:18
Witam
Proszę Was o pomoc, treść zadania domowego:
"Napisz program, który odczyta zawartość pliku, a następnie wypisze na ekranie tylko te wiersze, w których znajduje się wyraz wprowadzony przez użytkownika."

Napisałem ten program, 0 błędów w logu, jednak w trakcie pracy programu ten zacina się i "Program przestał działać"

Kod programu:
C/C++
#include <iostream>
#include <string>
#include <fstream>



int wypisz( std::string t[], int wyrazy )
{
    std::ifstream plik;
   
    std::string wiersz;
   
    std::cout << "2" << std::endl; //sprawdzenie
   
    plik.open( "tekst.txt" );
   
    if( !plik.good() )
    {
        std::cout << "nie udalo sie wczytac" << std::endl;
        return 0;
    }
   
    std::cout << "3" << std::endl; //sprawdzenie
   
   
    while( getline( plik, wiersz ) );
   
    {
        for( int i = 1; i <= wyrazy; i++ )
        {
            size_t znalezione = wiersz.find( t[ i ] );
           
            std::cout << "petla" << std::endl; //sprawdzenie
           
            if( znalezione == std::string::npos )
            {
            }
            else
            {
                std::cout << wiersz << std::endl;
            }
           
        }
    }
   
}


int main()
{
    int wyrazy;
   
    std::cout << "Ile wyrazow chcesz podac? ";
    std::cin >> wyrazy;
   
    std::string szukane[ wyrazy ];
   
    for( int i = 1; i <= wyrazy; i++ )
    {
        std::cout << "Podaj wyraz: ";
        std::cin >> szukane[ i ];
    }
   
    std::cout << "1" << std::endl; //sprawdzenie
   
    wypisz( szukane, wyrazy );
   
    return 0;
}


Błąd musi występować w pętli, w której wprowadzamy dane do tablicy, możemy wpisać dane, lecz program nie wychodzi z pętli, ponieważ program nie wypisuje "1", które jest następnym poleceniem.
P-118077
Jacob99
» 2014-10-07 19:00:20
W pętli wychodzisz poza zakres tablicy.
P-118078
FIGUS
Temat założony przez niniejszego użytkownika
» 2014-10-07 19:02:45
W jaki sposób?
P-118080
Axero
» 2014-10-07 19:02:45
Do tego zrób

for(int i = 0;i < wyrazy; i++)
Bo jeśli zaczynasz iterować 'i' od 1 to ominiesz pierwszy element tablicy.
P-118081
FIGUS
Temat założony przez niniejszego użytkownika
» 2014-10-07 19:10:09
Dobra, dzięki za pomoc. Jednak mam jeszcze problem odnośnie tego samego zadania.

Poprawiony kod:
C/C++
#include <iostream>
#include <string>
#include <fstream>



int wypisz( std::string t[], int wyrazy )
{
    std::ifstream plik;
   
    std::string wiersz;
   
    std::cout << "2" << std::endl; //sprawdzenie
   
    plik.open( "tekst.txt" );
   
    if( !plik.good() )
    {
        std::cout << "nie udalo sie wczytac" << std::endl;
        return 0;
    }
   
    std::cout << "3" << std::endl; //sprawdzenie
   
   
    while( getline( plik, wiersz ) );
   
    {
        for( int i = 0; i < wyrazy; i++ )
        {
            size_t znalezione = wiersz.find( t[ i ] );
           
            std::cout << "petla" << std::endl; //sprawdzenie
           
            if( znalezione == !std::string::npos )
            {
                std::cout << wiersz << std::endl;
            }
           
        }
    }
   
}


int main()
{
    int wyrazy;
   
    std::cout << "Ile wyrazow chcesz podac? ";
    std::cin >> wyrazy;
   
    std::string szukane[ wyrazy ];
   
    for( int i = 0; i < wyrazy; i++ )
    {
        std::cout << "Podaj wyraz: ";
        std::cin >> szukane[ i ];
    }
   
    std::cout << "1" << std::endl; //sprawdzenie
   
    wypisz( szukane, wyrazy );
   
    return 0;
}


Problem tkwi gdzieś w pętli znajdującej się w funkcji 'wypisz', mimo wpisywania wyrazów poprawnych, program mi ich nie wyszukuje, co dowodzi to, że wypisuje "pętla" prawidłową liczbę razy, ale nie wypisuje wiersza z pliku tekstowego...
P-118084
Jacob99
» 2014-10-07 19:14:45
if( znalezione == !std::string::npos )
Chyba raczej
if( znalezione != std::string::npos )
P-118086
Axero
» 2014-10-07 19:17:04
Anyway lepiej stosuj .eof jako warunek pętli niż wartość błędu zwracaną przez getline.
P-118087
FIGUS
Temat założony przez niniejszego użytkownika
» 2014-10-07 19:35:56
@Jacob99
poprawiłem w ten sposób, ale nadal występuje ten sam błąd

@Axero
Nie uczyłem się jeszcze o .eof

A mogli byście jakoś spojrzeć na to pod względem poprawności w stosunku do treści zadania?
P-118092
« 1 » 2
  Strona 1 z 2 Następna strona