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++ 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 #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? |
|
|
pekfos |
» 2018-04-09 18:09:47 std::string, nie samo string, albo dodaj using namespace std. std::cin >> imie[]; std::cin >> nazwisko[]; std::cin >> wiek[]; |
Co to ma robić twoim zdaniem? Wczytuje się jeden napis naraz, nie całą tablicę. |
|
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ę. |
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; } Po poprawkach wygląda to tak: #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 ] ); for( int i = 0; i < 2; i++ ) wypiszOsobe( imie[ i ], nazwisko[ i ], wiek[ i ] ); return 0; }
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: int wczytajOsobe( std::string imie[], std::string nazwisko[], int wiek[] ) { std::cin >> imie[]; std::cin >> nazwisko[]; std::cin >> wiek[]; |
|
pekfos |
» 2018-04-09 18:41:04 |
|
Pawełek Temat założony przez niniejszego użytkownika |
» 2018-04-09 18:55:12 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 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 [ 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 |
|
pekfos |
» 2018-04-09 19:15:48 Ta funkcja jest źle napisana. Podałem link do odpowiedniego materiału. |
|
Pawełek Temat założony przez niniejszego użytkownika |
» 2018-04-11 19:56:12 #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 |
|
YooSy |
» 2018-04-11 22:11:17 Funkcje wczytajOsobe oraz wypiszOsobe oczekują tablicy napisów, a ty przekazujesz do nich pojedynczy napis. 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() . |
|
« 1 » 2 |