Problem z przekazaniem wartości z funkcji do funkcji

0

Witam, otóż tworzę sobie bazę powiedzmy "salonu samochodowego" z jakimiś podstawowymi nazwami itp. nie jestem weteranem c++ a wręcz jego żółtodziobem, ale kto nim na początku nie był. Przechodząc do mojego pytania/problemu, chodzi mi o to by if{} przez getline w funkcji pomoc() zliczał mi ile razy wystąpił "#" a następnie chce przekazać to do funkcji szukajModel() by for odtworzył się 'j' razy by przeszukać plik i nie "wciągać" pustego pola. Poniżej wklejam samą funkcje pomoc, szukajModel i main a następnie sam program. Dodam jeszcze, że po włączeniu programu od nowa wszystko działa poprawnie.

Edit: Poprawiłem kod.

Chodzi mi o to, by funkcja pomoc() obliczała int j a następnie przekazywała ten właśnie int do funkcji szukajModel. Chciałbym by działało to podczas działania programu, a działa tylko po ponownym uruchomieniu całego kodu w CodeBlocks, dlatego też dodałem w menu case 7: najpierw funkcje pomoc() by obliczyło int j a następnie by funkcja szukajModel "wzięła" sobie tego inta i go użyła, ale niestety jakos to nie wychodzi. Będę się bawił dalej, zobaczymy jak to wyjdzie :D.

Pozdrawiam serdecznie.

int szukajModel(salon samochod[100], int j)
{
    int i;
    string odp;

    cout<<"Podaj model samochodu do wyszukania: ";
    cin>>odp;

     for(i=0;i<j;i++)
    {
        if(samochod[i].model == odp)
        {
        cout<<samochod[i].marka<<endl;
        cout<<samochod[i].model<<endl;
        cout<<samochod[i].kolor<<endl;
        cout<<samochod[i].rok_produkcji<<endl;
        cout<<samochod[i].waga<<endl<<endl;
        }
    }



}

float pomoc()

{
    int j = 1;
    int i = 0;

    fstream plik;
    string tekst;
    string symbol;
    plik.open("kodzik.txt", ios::in);



        for(i=0;i<j;i++)
        {
        getline(plik, symbol);
       if("#" == symbol)
        {
                getline(plik, tekst);
                getline(plik, tekst);
                getline(plik, tekst);
                getline(plik, tekst);
                getline(plik, tekst);

            j++;
        }


        }
        plik.close();

        return j;

}

    int i;
    string odp;

    cout<<"Podaj model samochodu do wyszukania: ";
    cin>>odp;

     for(i=0;i<j;i++)
    {
        if(samochod[i].model == odp)
        {
        cout<<samochod[i].marka<<endl;
        cout<<samochod[i].model<<endl;
        cout<<samochod[i].kolor<<endl;
        cout<<samochod[i].rok_produkcji<<endl;
        cout<<samochod[i].waga<<endl<<endl;
        }
    }



}


int main()
{

   int wybor, j;

       wpisTab(samochod);
       pomoc();
       j = pomoc();

   menu:

       cout<<endl<<"1.Dodaj samochod do bazy."
           <<endl<<"2.Wyswietl cala baze."
           <<endl<<"3.Szukaj marki."
           <<endl<<"4.Zapisz."
           <<endl<<"5.Zamknij."<<endl;

       cin>>wybor;
       switch(wybor){
       case 1:ilosc=wypelnij(f);zapisz(f,ilosc);wpisTab(samochod);break;
       case 2:wyswietl();break;
       case 3:szukaj2(); break;
        case 4:zapisz(f,ilosc); break;
        case 5:goto koniec;
        case 6:wpisTab(samochod);
        case 7:pomoc();szukajModel(samochod, j);
       }goto menu;
       koniec:
    return 0;}
1

W tagach wpisz technologię zamiast przekazywanie. To nic nie mówi.
Wstaw mniejszy fragment, którego dotyczy problem.
Używanie goto to zła praktyka, jeśli nie wymaga tego sytuacja, a ten prosty program nie wymaga. Są przecież pętle.
Z opisu niewiele da się wywnioskować, a z kodu jeszcze mniej.
https://4programmers.net/Forum/Newbie/173842-prosba_o_tagowanie_watkow_

1
int szukajModel(salon samochod[100], int j)
{
float pomoc()
{

To się nie ma prawa skompilować.

Przeczytaj, dostosuj się: https://dsp.krzaq.cc/post/445/jak-zadawac-pytania-na-forum/

0

Tutaj umieszczam cały kod z codeblocksa:

#include <iostream>
#include <fstream>>
#include <cstdlib>
#include <conio.h>
using namespace std;



struct samochody
{
string marka;
string model;
string kolor;
int rok_produkcji;
int waga;
};

struct salon
{
string marka;
string model;
string kolor;
string rok_produkcji;
string waga;
};

samochody f[100];
salon samochod[100];

int ilosc;

int wpisTab(salon samochod[100])
{
    int j = 1;
    int i = 0;

    fstream plik;
    string tekst;
    string symbol;
    plik.open("kodzik.txt", ios::in);



        for(i=0;i<j;i++)
        {
        getline(plik, symbol);
       if("#" == symbol)
        {



                getline(plik, tekst);
                samochod[i].marka=tekst;

                getline(plik, tekst);
                samochod[i].model=tekst;

                getline(plik, tekst);
                samochod[i].kolor=tekst;

                getline(plik, tekst);
                samochod[i].rok_produkcji=tekst;

                getline(plik, tekst);
                samochod[i].waga=tekst;

            j++;

        }


        }
        plik.close();



};

float pomoc()
{
    int j = 1;
    int i = 0;

    fstream plik;
    string tekst;
    string symbol;
    plik.open("kodzik.txt", ios::in);



        for(i=0;i<j;i++)
        {
        getline(plik, symbol);
       if("#" == symbol)
        {
                getline(plik, tekst);
                getline(plik, tekst);
                getline(plik, tekst);
                getline(plik, tekst);
                getline(plik, tekst);

            j++;
        }


        }
        plik.close();

        return j;

}

int szukajModel(salon samochod[100], int j)
{
    int i;
    string odp;

    cout<<"Podaj model samochodu do wyszukania: ";
    cin>>odp;

     for(i=0;i<j;i++)
    {
        if(samochod[i].model == odp)
        {
        cout<<samochod[i].marka<<endl;
        cout<<samochod[i].model<<endl;
        cout<<samochod[i].kolor<<endl;
        cout<<samochod[i].rok_produkcji<<endl;
        cout<<samochod[i].waga<<endl<<endl;
        }
    }



}


void zapisz(samochody f[100], int ilosc){

fstream plik;

plik.open("baza.txt", ios::out | ios::app);

for(int i=0;i<ilosc;i++)
{
plik<<"Marka: "<<f[i].marka<<endl;
plik<<"Model: "<<f[i].model<<endl;
plik<<"Kolor: "<<f[i].kolor<<endl;
plik<<"Rok produkcji: "<<f[i].rok_produkcji<<endl;
plik<<"Waga: "<<f[i].waga<<endl;
plik<<" "<<endl;
}

plik.close();

plik.open("kodzik.txt", ios::out | ios::app);

for(int i=0;i<ilosc;i++)
{
plik<<"#"<<endl;
plik<<f[i].marka<<endl;
plik<<f[i].model<<endl;
plik<<f[i].kolor<<endl;
plik<<f[i].rok_produkcji<<endl;
plik<<f[i].waga<<endl;
}

plik.close();

cout<<"Zapisano dane do bazy..."<<endl;
}

int wypelnij(samochody f[100])
{
int i=0;
cout<<"Wpisz dane do bazy: "<<endl;
char odp='T';
do{

cout<<"Marka: ";
cin>>f[i].marka;
cout<<"Model: ";
cin>>f[i].model;
cout<<"Kolor: ";
cin>>f[i].kolor;
cout<<"Rok produkcji: ";
cin>>f[i].rok_produkcji;
cout<<"Waga[kg]: ";
cin>>f[i].waga;

i++;
cout<<"Czy chcesz dodac nastepny samochod ? Y/N"<<endl;
cin>>odp;
}while(i<10 && odp!='n' && odp!='N');

return i;
}




void szukaj2()
{

fstream plik("baza.txt");
string tekst, szukaj;

    cout<<"Podaj marke jaka chcesz wyszukac: ";

    cout<<"Podaj marke jaka chcesz wyszukac: ";
    cin>>szukaj;
    cout<<endl;
    while(!plik.eof())
    {

        getline(plik, tekst);
        if(tekst == "Marka "+szukaj)
            {
            cout<<tekst<<endl;
                for( int i = 0; i < 4; i ++ )
                {
                    getline ( plik, tekst );
                    cout<< tekst <<endl;
                }
            cout<<endl;
            }
    }
}

void usun()
    {
        string marka_usun;
        fstream plik("baza.txt");
        string tekst, usun;

                int i = 0;
                cout<<"Podaj marke samochodu do usuniecia: ";
                cin>>usun;
                while(!plik.eof())
    {

        getline(plik, tekst);
        if(tekst == "Marka "+usun)
            {
            cout<<tekst<<endl;
                for( int i = 0; i < 4; i ++ )
                {
                    getline ( plik, tekst );
                    cout<< tekst <<endl;
                }
            cout<<endl;
            }
    }

    }



void wyswietl()
{
    string linia;
    fstream plik;

    plik.open("baza.txt", ios::in);
    if(plik.good() == true)
    {
        while(!plik.eof())
        {
            getline(plik, linia);
            cout << linia << endl;
        }
        plik.close();
    }



}

int main()
{

   int wybor, j;

       wpisTab(samochod);
       pomoc();
       j = pomoc();

   menu:

       cout<<endl<<"1.Dodaj samochod do bazy."
           <<endl<<"2.Wyswietl cala baze."
           <<endl<<"3.Szukaj marki."
           <<endl<<"4.Zapisz."
           <<endl<<"5.Zamknij."<<endl;

       cin>>wybor;
       switch(wybor){
       case 1:ilosc=wypelnij(f);zapisz(f,ilosc);wpisTab(samochod);break;
       case 2:wyswietl();break;
       case 3:szukaj2(); break;
        case 4:zapisz(f,ilosc); break;
        case 5:goto koniec;
        case 6:wpisTab(samochod); break;

        case 7:pomoc();szukajModel(samochod, j);
       }goto menu;
       koniec:
    return 0;}

0
for (i = 0; i<j; i++) {
   getline(plik, symbol);
   if ("#" == symbol) {
      getline(plik, tekst);
      getline(plik, tekst);
      getline(plik, tekst);
      getline(plik, tekst);
      getline(plik, tekst);
      j++;
   }
}

Ten fragment wygląda dziwnie. Zorganizuj inaczej dane w pliku.
Nie ma sprawdzenia czy plik jest poprawnie otwarty.
Nie sprawdzasz czy udało się poprawnie pobrać dane z pliku.
Jeśli nie uda się pobrać jakichkolwiek danych z pliku, blokuje się strumień
plikowy i nic nie da się zrobić, tzn. wszystkie próby odczytu danych są ignorowane.
Zerknij tutaj.

BTW: Włącz ostrzeżenia i zwiększ poziom wykrywania błędów kompilacji, bo jest kilka.
Dwie funkcje niczego nie zwracają, mimo takiej deklaracji.

Użyć po prostu return 0; ?

Zamiast skoku do etykiety koniec można użyć return 0, choć to też nie jest super wyjście.
Najlepiej całą instrukcję switch zamknąć w pętli do{}while() i dać odpowiednie warunki.
Zamiast etykiet dać zmienne logiczne i użyć ich w warunku pętli.

samochody f[100];
salon samochod[100];int ilosc;

Nadużywanie zmiennych globalnych jest złą praktyką.

1 użytkowników online, w tym zalogowanych: 0, gości: 1