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

Przekazywanie tablicy string do funkcji

Ostatnio zmodyfikowano 2021-06-16 14:40
Autor Wiadomość
Pawełek
Temat założony przez niniejszego użytkownika
Przekazywanie tablicy string do funkcji
» 2018-04-09 18:02:59
Witam ponownie :) W rozdziale 25 Jest zadanie domowe następującej treści :
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++
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;
}
W programie do wczytywania tekstu użyj std::cin.

Mój program
C/C++
#include <iostream>
#include <string>

int wczytajOsobe( string imie[], string nazwisko[], int & wiek[] )
{
    std::cin >> imie[];
    std::cin >> nazwisko[];
    std::cin >> wiek[];
}
int wypiszOsobe( string imie[], string nazwisko[], int wiek[] )
{ std cout << imie[] << " " << nazwisko << " " << wiek << endl;
}
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;
}

Pytanie : Czy przekazywanie tablic string do funkcji jest możliwe w języku c++ a jeśli jest to czy robię to dobrze?
Pytam bo ciągle wywala mi błąd "error: 'string' was not declared in this scope" . Zrobiłem mały research w internecie i na tej stronie : https://4programmers.net/Forum/C_i_C++/240003-przesylanie_tablicy_stringow_do_funkcji jeden z moderatorów napisał : do autora tematu
wiesz, że do funkcji przekazujesz wskaźniki na string, a nie ich tablice?
P-170583
pekfos
» 2018-04-09 18:09:47
std::string, nie samo string, albo dodaj using namespace std.

C/C++
std::cin >> imie[];
std::cin >> nazwisko[];
std::cin >> wiek[];
Co to ma robić twoim zdaniem? Wczytuje się jeden napis naraz, nie całą tablicę.
P-170584
Pawełek
Temat założony przez niniejszego użytkownika
» 2018-04-09 18:38:44
C/C++
std::cin >> imie[];
std::cin >> nazwisko[];
std::cin >> wiek[];
Co to ma robić twoim zdaniem? Wczytuje się jeden napis naraz, nie całą tablicę.

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 ] ); // zmienna "i" miała wskazywać o który element tablicy chodzi
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
}

Po poprawkach wygląda to tak:
C/C++
#include <iostream>
#include <string>

int wczytajOsobe( std::string imie[], std::string nazwisko[], int wiek[] )
{ int i = 0;
    std::cin >> imie[ i ];
    std::cin >> nazwisko[ i ];
    std::cin >> wiek[ i ];
}
int wypiszOsobe( std::string imie[], std::string nazwisko[], int wiek[] )
{ int i = 0;
    std::cout << imie[ i ] << " " << nazwisko[ i ] << " " << wiek[ i ] << std::endl;
}
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 ] ); /* nie mogę zrozumieć działania tej funkcji, a dokładniej mówiąc, niewiem jak się obchodzić z tablicami zapisanymi w taki sposób gdyż pierwszy raz się z nimi spotykam
    */
   
    for( int i = 0; i < 2; i++ )
         wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
   
    return 0;
}

C/C++
int wczytajOsobe( std::string imie[], std::string nazwisko[], int wiek[] )
{ int i = 0;
    std::cin >> imie[ i ];
    std::cin >> nazwisko[ i ];
    std::cin >> wiek[ i ];
}
 Teraz powinno być już dobrze ? Myślałem że jak zostawię tablicę nie oznaczoną, to zmienna 'i' będąc zapisana w argumencie
wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
 samoistnie wypełni także to:

C/C++
int wczytajOsobe( std::string imie[], std::string nazwisko[], int wiek[] )
{
    std::cin >> imie[];
    std::cin >> nazwisko[];
    std::cin >> wiek[];
P-170585
pekfos
» 2018-04-09 18:41:04
To co chcesz zrobić, to nie jest przekazywanie tablicy.
» Kurs C++ » Poziom 3Przekazywanie argumentów funkcji przez referencję lekcja

samoistnie
Jak coś się ma dziać 'samoistnie', to w pierwszej kolejności przyjmij, że źle zrozumiałeś.
P-170586
Pawełek
Temat założony przez niniejszego użytkownika
» 2018-04-09 18:55:12
C/C++
int wczytajOsobe( std::string imie[], std::string nazwisko[], int wiek[] )
{ int i = 0;
    std::cin >> imie[ i ];
    std::cin >> nazwisko[ i ];
    std::cin >> wiek[ i ];
}

ta funkcja jest więc dobrze napisana ?

Ma ona pasować do tej pętli
C/C++
for( int i = 0; i < 2; i++ )
     wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
Przedstawie moj sposób myslenia : Skoro w pętli została podana konkretna funkcja imie [1] ( przyjmijmy ze to jest drugie powtórzenie pętli)
To w tej funkcji
C/C++
[ cpp ] int wczytajOsobe( std::string imie[], std::string nazwisko[], int wiek[] )
{ int i = 0;
    std::cin >> imie[ i ];
    std::cin >> nazwisko[ i ];
    std::cin >> wiek[ i ];
 imie ciągle będzie obsługiwało zerowy element bo przecież i w funkcji jest równe zero

P-170587
pekfos
» 2018-04-09 19:15:48
Ta funkcja jest źle napisana. Podałem link do odpowiedniego materiału.
P-170588
Pawełek
Temat założony przez niniejszego użytkownika
» 2018-04-11 19:56:12
C/C++
#include <iostream>
#include <string>

int wczytajOsobe( std::string imie[], std::string nazwisko[], int wiek[] )
{ int i;
    std::cin >> imie[ i ];
    std::cin >> nazwisko[ i ];
    std::cin >> wiek[ i ];
}
int wypiszOsobe( std::string imie[], std::string nazwisko[], int wiek[] )

{ int i;
    std::cout << imie[ i ] << " " << nazwisko[ i ] << " " << wiek[ i ] << std::endl;
}
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;
}

21 wers
wczytajOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
 i 24 wers
wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] );
 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 'int wczytajOsobe(std::__cxx11::string*, std::__cxx11::string*, int*)'|

Czemu ten error mi wyskakuje? Mi już brakuje pomysłów
P-170622
YooSy
» 2018-04-11 22:11:17
Funkcje
wczytajOsobe
 oraz
wypiszOsobe
 oczekują tablicy napisów,
a ty przekazujesz do nich pojedynczy napis.
C/C++
void f( int n ) {
    cout << n << endl;
}

void f2( int n[] ) {
    cout << n[ 0 ] << endl;
}

int main() {
    int arr[] { 1, 2, 3 };
    f( arr[ 0 ] );
    f2( arr );
}
analogicznie jak w tym przykładzie.
Próbujesz wywołać funkcję
f2()
 z argumentami dla funkcji
f()
.
P-170625
« 1 » 2
  Strona 1 z 2 Następna strona