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

Problem z zadaniem domowym. Lekcja Rozdział 26

Ostatnio zmodyfikowano 2019-11-27 20:45
Autor Wiadomość
Cornel9192
Temat założony przez niniejszego użytkownika
Problem z zadaniem domowym. Lekcja Rozdział 26
» 2019-11-27 18:45:57
Cześć, mam problem ze zadaniem domowym. To jego treść: "Napisz prosty program, który wczyta imię, nazwisko i wiek dwóch osób. Funkcja główna programu ma mieć następującą postać:
C/C++
int main()
{
    std::string imie[ 2 ];
    std::string nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
}
.

Pierwsze pytanie, zawsze jak wysyłaliśmy w kursie tablice przy wywoływaniu funkcji to nie dawaliśmy jej klamer [], zawsze wyglądało to tak przyklFunkcja(nazwatablicy);

Po drugie nie wiem gdzie popełniłem błąd ale program nie działa, tutaj mój kod już całości:
C/C++
#include <iostream>
#include <limits>
#include <string>

using namespace std;

void wczytajOsobe( string imie[], string nazwisko[], int wiek[] )
{
    for( int i = 0; i < 2; i++ )
    // {if(cin.fail()){}
    cout << "Podaj imie: "; cin >> imie[ i ]; cout << "Podaj nazwisko: "; cin >> nazwisko[ i ]; cout << "Podaj wiek: "; cin >> wiek[ i ];
    cout << endl << endl;
    //         {if(cin.fail())
    //{
    //        cin.clear();
    //         cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
    //         }
    //  }
}
void wypiszOsobe( string imie[], string nazwisko[], int wiek[] ) {
    for( int i = 0; i < 2; i++ )
    {
        cout << "Dane " << i << "osoby: " << endl;
        cout << imie[ i ] << endl << nazwisko[ i ] << endl << wiek[ i ] << endl << endl;
    } }
int main()
{
    string imie[ 2 ];
    string nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
   
}

Logi:

error: name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]|


error: cannot convert 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' to 'std::__cxx11::string* {aka std::__cxx11::basic_string<char>*}' for argument '1' to 'void wczytajOsobe(std::__cxx11::string*, std::__cxx11::string*, int*)'|

pekfos dziękuję za pomoc w poprzednim temacie, pozdrawiam

P-175674
pekfos
» 2019-11-27 20:19:44
Pierwsze pytanie, zawsze jak wysyłaliśmy w kursie tablice przy wywoływaniu funkcji to nie dawaliśmy jej klamer []
To nie jest pytanie, tylko zdanie twierdzące. Nawet prawdziwe. Przy wysyłaniu tablicy - tak, bez klamer. Klamry sprawiają, że wysyłamy konkretny element tablicy.
P-175678
Cornel9192
Temat założony przez niniejszego użytkownika
» 2019-11-27 20:23:34
Już mi wszystko działa, wywaliłem fory i zmieniłem na referencje.
Nie wiem jednak jak zmienić aby funkcja rozróżniałą którą osobę teraz robi czyli typu "Podaj 1 osobe, podaj 2 osobe" itp.

C/C++
#include <iostream>
#include <limits>
#include <string>

using namespace std;

void wczytajOsobe( string & imie, string & nazwisko, int & wiek )
{
    int i = 1;
    cout << "Podaj imie " << i << ": "; cin >> imie;
    cout << "Podaj nazwisko: "; cin >> nazwisko;
    cout << "Podaj wiek: "; cin >> wiek;
    cout << endl << endl;
    i++;
}
void wypiszOsobe( string & imie, string & nazwisko, int & wiek ) {
   
    int i = 1;
    cout << "Dane " << i << " osoby: " << endl;
    cout << imie << endl << nazwisko << endl << wiek << endl << endl;
    i++;
}

int main()
{
    string imie[ 2 ];
    string nazwisko[ 2 ];
    int wiek[ 2 ];
    for( int i = 0; i < 2; i++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
   
}

P-175679
pekfos
» 2019-11-27 20:25:15
Możesz dodać nowy argument do funkcji żeby przekazać wartość licznika z pętli.
P-175680
Cornel9192
Temat założony przez niniejszego użytkownika
» 2019-11-27 20:26:20
Działa, jesteś wielki ;), zamykam temat i dziękuję!
P-175681
Cornel9192
Temat założony przez niniejszego użytkownika
» 2019-11-27 20:32:26
Chociaż nie. Czemu w pierwszej funkcji muszę dać przez referencję.
A w drugiej usunę klamry to też działa? (W pierwszej się to nie sprawdza). Pytam dlatego bo w kursie (rozdz. 19 "Wysyłanie tablic jednowymiarowych do funkcji" nie było zapisu bez klamer. za to były 3 sposoby - cytuję:

"
void sposob_1( int tablica[ 123 ] );
void sposob_2( int tablica[] );
void sposob_3( int * tablica );
"

C/C++
#include <iostream>
#include <limits>
#include <string>

using namespace std;

void wczytajOsobe( string & imie, string & nazwisko, int & wiek, int os )
{
   
    cout << "Podaj imie " << os << ": "; cin >> imie;
    cout << "Podaj nazwisko: "; cin >> nazwisko;
    cout << "Podaj wiek: "; cin >> wiek;
    cout << endl << endl;
   
}
void wypiszOsobe( string imie, string nazwisko, int wiek, int os ) {
   
    int i = 1;
    cout << "Dane " << os << " osoby: " << endl;
    cout << imie << endl << nazwisko << endl << wiek << endl << endl;
   
}

int main()
{
    string imie[ 2 ];
    string nazwisko[ 2 ];
    int wiek[ 2 ];
    int os = 1;
    for( int i = 0; i < 2; i++, os++ )
         wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ], os );
   
    os = 1;
   
    for( int i = 0; i < 2; i++, os++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ], os );
   
    return 0;
   
}
P-175682
pekfos
» 2019-11-27 20:45:04
Przecież nie wysyłasz tablicy. Element tablicy nie różni się tu niczym od zwykłej zmiennej.
C/C++
string imie, nazwisko;
int wiek;
wczytajOsobe( imie, nazwisko, wiek );
wypiszOsobe( imie, nazwisko, wiek );
P-175683
« 1 »
  Strona 1 z 1