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

Wczytywanie danych z pliku do dwóch różnych zmiennych.

Ostatnio zmodyfikowano 2014-08-01 14:27
Autor Wiadomość
Pawlllosss
Temat założony przez niniejszego użytkownika
Wczytywanie danych z pliku do dwóch różnych zmiennych.
» 2014-08-01 12:53:24
Witajcie, miałem problem z nazwaniem tematu, chodzi oto, że próbuję rozwiązać zadanie maturalne, które polega na tym, że w trzech różnych plikach zapisane są zdania w takiej formie, że na początku jest podana ilość wyrazów w zdaniu, a w kolejnej linijce zdanie. Program ma polegać na tym, żeby zamienić każde wyrazy mające więcej niż 2 znaki w taki sposób, żeby pozostawała pierwsza i ostatnia litera, a zamiast liter między nimi wstawić znak -.

Przykładowe zdanie:
a kiedy wreszcie wyjedziemy na wakacje
Przykładowe zdanie po przekształceniu:
a k-y w-e w-y na w-e

Poniżej mój kod:
C/C++
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>

using namespace std;

bool znaleziono( int i, string a )
{
    if( a[ i ] == ' ' )
         return true;
   
    return false;
}

string ucinanie( string tmp )
{
    int dl = tmp.length();
    if( dl > 2 )
    {
        tmp.erase( 1, dl - 2 );
        tmp.insert( 1, "-" );
    }
   
    return tmp;
   
}

string modyfikacja( string a, int dl, int pomoc )
{
    string * tab;
    tab = new string[ pomoc ];
    int j = 0;
    int tabcounter = 0;
   
    for( int i = 0; i < dl; i++ )
    {
        if( tabcounter == pomoc - 1 )
        {
            tab[ tabcounter ] = a.substr( j, dl - j );
            break;
        }
       
        if( znaleziono( i, a ) )
        {
           
           
            tab[ tabcounter ] = a.substr( j, i - j );
            tabcounter++;
            j = i + 1;
           
           
           
           
        }
       
    }
    string c;
   
   
    for( int i = 0; i < pomoc; i++ )
         c += ucinanie( tab[ i ] ) + " ";
   
   
   
    delete[] tab;
   
    return c;
   
}

int main()
{
    int pomoc, dl;
    string a, aodp;
   
   
    ifstream plik1;
    plik1.open( "dane1.txt" );
   
   
   
    plik1 >> pomoc;
   
    while( getline( plik1, a ) )
    {
        dl = a.length();
       
       
        aodp = modyfikacja( a, dl, pomoc );
        cout << aodp << endl;
       
    }
   
    cout << dl;
    return 0;
}

O ile dobrze patrzę to cały algorytm jest dobry tylko problem polega na tym, że pierwszą linijkę program wczytuje dwukrotnie, najpierw do zmiennej pomoc(tak jak powinno być), a następnie do zmiennej string a(źle), na której wykonuje się modyfikacja i gdy program dochodzi wtedy do momentu zmieniana długości łańcucha to wysypuje się, bo dostaje łańcuchy o zerowej długości(chyba). Moje pytanie brzmi, czy da się ustawić getline tak, aby zaczął pobierać dane dopiero od drugiej linijki?
P-114839
michal11
» 2014-08-01 13:24:57
Po 1. tak
plik1 >> pomoc;
 wczytujesz tylko pierwszy wyraz a nie całą linię.
Po 2. po co to w ogóle robisz ?
P-114842
Pawlllosss
Temat założony przez niniejszego użytkownika
» 2014-08-01 13:29:56
Nie doprecyzowałem, przykładowy plik wygląda w następujący sposób:

14
dwie liczby naturalne ktorych jedynym wspolnym dzielnikiem jest jeden nazywa sie liczbami wzglednie pierwszymi

Ta zmienna pomoc jest od wczytania liczby 14, która określa ilość wyrazów w zdaniu, dzięki której wiem jak duża ma być tablica, która będzie przechowywać poszczególne wyrazy z zdania, które będą później modyfikowane. Nie wiem czy to optymalna metoda, ale powinna działać.
P-114844
michal11
» 2014-08-01 13:34:02
Czy twój plik składa się tylko z 1 cyfry i 1 zdania, czy to będzie się powtarzało ?
P-114845
Pawlllosss
Temat założony przez niniejszego użytkownika
» 2014-08-01 13:47:25
Tylko 1 cyfra i 1 zdanie, ale tak z ciekawości. Jakbym musiał napisać program gdyby się to powtarzało?
P-114851
michal11
» 2014-08-01 13:54:00
Jeżeli tylko 1 cyfra  1 zdanie to nie potrzebny jest while.
Jeżeli by się powtarzało to wtedy wczytywanie cyfry też musisz dać do while i sprawdzać który wiersz się wczytuje. Coś w rodzaju
C/C++
bool cyfra = true;
while( wczytaj linie )
{
    if( cyfra )
    {
        wczytano cyfre
       
        cyfra = false;
    }
    else
    {
        wczytano zdanie
       
        cyfra = true;
    }
}
P-114853
Monika90
» 2014-08-01 13:57:54
tablica nie będzie potrzebna, można zamieniać wyrazy w locie, w uproszczeniu

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream file(R"(
14
dwie liczby naturalne ktorych jedynym wspolnym dzielnikiem jest jeden nazywa sie liczbami wzglednie pierwszymi

6
a kiedy wreszcie wyjedziemy na wakacje
)");
   
    while (file)
    {
        int n;
        file >> n;
        std::string word;
        for (int i = 0; i < n; ++i)
        {
            file >> word;
            if (word.size() > 2)
                std::cout << word.front() << '-' << word.back() << ' ';
            else
                std::cout << word << ' ';
               
        }
        std::cout << '\n';
    }
}

P-114856
michal11
» 2014-08-01 14:00:23
Tez mi się wydawało, że można to zrobić bez tablicy ale skoro ma gotowy kod to nie ingerowałem.
P-114857
« 1 » 2
  Strona 1 z 2 Następna strona