Nowe posty

xx Dystrybucja pod HP Omen (6)
Wczoraj o 23:30:08
xx [Poradnik] Wyszukiwanie Sterowników (2)
Wczoraj o 21:08:23
lamp Problem z Linux Lite po instalacji (0)
Wczoraj o 19:50:30
xx Ile pingwinów? (1)
Wczoraj o 08:59:24
xx konfiguracja pale moon (0)
2024-03-24, 21:53:42
xx Plasma 6 w Neonie ssie trochę mniej ... (10)
2024-03-23, 02:38:11
xx problem z instalacja sterowników do karty sieciowej (3)
2024-03-18, 18:10:16
xx Plik abc.001 (1)
2024-03-17, 17:48:27
xx Zlecę dopracowanie programu w MatLab (0)
2024-03-13, 15:28:40
xx Linux Mint 21.3 XFCE brak dźwieku po paru minutach (karta muzyczna zintegrowana) (5)
2024-03-12, 23:07:01

Autor Wątek: problem z zakresem vectora  (Przeczytany 1790 razy)

KelThuzad

  • Gość
problem z zakresem vectora
« dnia: 2016-07-20, 23:49:44 »
Witam chce zrobić program do zliczania słów który pobiera dane z pliku ale mam problem z zakresem vectora words. Wiem że to robi funkcja map().
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
#include <cstdlib>

using namespace std;
void loadFile ();       //zaladowanie pliku
void assignment (fstream& file);

int main()
{
    loadFile();
    for (int i = 0 ; i <words.size() ; i++ )
    //chce to wyświetlić wszystkie słowa

    /*for ( int i = 0; i < words.size() ; ++i)
    {
        int k = 1;
            for ( int j = i + 1 ; j < words.size() ; ++j)
            {
                while ( words[i] == words[j] )
                {

                    k++;
                    words.erase(words.begin()+j);
                }
            }
            cout << "slowo " << words[i] << " wystepuje: " << k << endl;
    }*/

    return 0;
}
//===================================================================================
void loadFile()
{
    fstream file;
    file.open( "dane.txt" , ios::in );
    if ( file.good() == false )
    {
        cout << "Plik nie istnieje" << endl;
    }
    assignment( file);
    file.close();
}
//==================================================================================
void assignment(fstream& file)
{
    string line;
    vector<string> words;
    while( getline( file , line ) )
    {
        words.push_back(line);
    }
}
i teraz mam problem bo w main nie ma vectora words bo nie mam tam zakresu. I czy jest jakiś sposób na to by jednak można było korzystać z tego vectora w main (ale nie chce za bardzo stosować zmiennej globalnej). (może przez referencje???)

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: problem z zakresem vectora
« Odpowiedź #1 dnia: 2016-07-21, 17:04:58 »
Trudne słowo na dziś: funkcja. Funkcja ma taką śmieszną cechę, że może zwrócić jakąś wartość i tą wartość można wykorzystać po powrocie z funkcji w miejscu wywołania...
Mam wrażenie, że to zagadnienie jest poruszane w pierwszym rozdziale każdego podręcznika C i C++...
« Ostatnia zmiana: 2016-07-21, 17:08:46 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

KelThuzad

  • Gość
Odp: problem z zakresem vectora
« Odpowiedź #2 dnia: 2016-07-21, 20:38:11 »
Czy chodzi ci o taki coś?

nazwaZmiennej = nazwaFunkcji(argumenty);

chodzi o wywołanie i w funkcji przez return wpisywać daną wartość.

Czy może zastosować iteratory (chociaż aż tak dobrzy jeszcze tego nie łapie)

Zrobiłem coś takiego i działa. Ale czy tak jest OK ?
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <fstream>
#include <cstdlib>

using namespace std;

void loadFile (vector<string> words);       //zaladowanie pliku
void assignment ( fstream& file , vector<string> words);
void checkingValues ( vector<string> words );

int main()
{
    vector<string> words;
    loadFile(words);               
    return 0;
}

//===================================================================================
void loadFile(vector<string> words)
{
    fstream file;
    file.open( "dane.txt" , ios::in );
    if ( file.good() == false )
    {
        cout << "Plik nie istnieje" << endl;
    }
    assignment( file , words);
    file.close();
}
//===================================================================================
void assignment(fstream& file , vector<string> words)
{
    string line;
    while( getline( file , line ) )
    {
        words.push_back(line);
    }
        checkingValues ( words );
}
void checkingValues ( vector<string> words )
{
    cout << words[6] << endl;
}
« Ostatnia zmiana: 2016-07-21, 22:51:31 wysłana przez MateuszA »

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: problem z zakresem vectora
« Odpowiedź #3 dnia: 2016-07-22, 06:00:52 »
Cytuj
Czy chodzi ci o taki coś?

nazwaZmiennej = nazwaFunkcji(argumenty);

chodzi o wywołanie i w funkcji przez return wpisywać daną wartość.


Czyli mnie zrozumiałeś.


Cytuj
vector<string> words;
    loadFile(words);               
    return 0;

Czyli mnie NIE zrozumiałeś.

Teraz jestem skonfudowany. "Forumowicz Schroedingera", równocześnie rozumie i nie rozumie. Równocześnie chce korzystać z iteratorów i nie ogarnia zwrócenia wartości z funkcji.

Najważniejsze:
Formalnie Twoje rozwiązanie jest poprawne (dane pośrednie wpychane coraz głębiej w stos), ale sam czujesz, że nie o to chodzi.

Z czystej ciekawości - jakiego podręcznika używasz do nauki programowania? Bez urazy, ale mam wrażenie, że tytuł będzie w stylu "Kuchnia syczuańska dla zaawansowanych", bo nie wierzę, żeby istniał podręcznik do C++ omawiający iteratory a nie mający całego rozdziału (z przykładami) o funkcjach.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

KelThuzad

  • Gość
Odp: problem z zakresem vectora
« Odpowiedź #4 dnia: 2016-07-22, 19:57:46 »
Wiem o co ci chodzi ale mój problem polega na tym że nie wiem jak przez wartość return zwrócić np. vector.
przykładowy program:
void nazwaFunkcji()
{
    //wczytywanie pliku   
    string nazwaZmiennej = nazwaFunkcji2(stream& nazawZminejiFsteam); // i teraz by przypisać tutaj aż 10 wartości to co mam dodać przecież string nie wystarczy.
}
string nazwaFunkcji2(fstream& nazawZminejiFsteam ) //wpisuje dane do kontenera
{
    string line;
    vector<string> words;
    while( getline( file , line ) )
    {
        words.push_back(line);
    }
    return words // tu mam problem ze zrozumieniem jak return może zwracać np. 10. Return wykonuje sie chyba raz.
}

int main()
{
    nazwaFunkcji();               
    return 0;
}
I teraz jeszcze jedno mimo wszystko jak ma wyświetlić ten vectora w funkcji main? A czytałem Symfonie C++ oraz jestem dopiero co po ukończeniu czytania Programowanie Teoria i praktyka z wykorzystaniem C++. To co mówiłeś wcześniej to wiedziałem że coś takiego jest bo tak jak napisałeś to jest pierwsza (prawie) informacja o funkcjach jak jest w tych książkach.

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3049
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
Odp: problem z zakresem vectora
« Odpowiedź #5 dnia: 2016-07-22, 21:36:11 »
Nie rozumiem problemu... Vector jest normalnym typem, który możesz zwrócić z funkcji...
#include <iostream>
#include <vector>
#include <string>

using namespace std;

vector<string> funkcja( int i )
{
    vector<string> vs;

    for ( int x = 0; x < i; x++ ) {
        vs.push_back( "BlaBla#" + to_string( x ) );
    }

    return vs;
}

int main( int argc, char *argv[] )
{
    auto v = funkcja( 5 );

    for ( auto n : v ) {
        cout << n << endl;
    }
}
« Ostatnia zmiana: 2016-07-23, 11:56:05 wysłana przez Paweł Kraszewski »
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy