C++, wyszukiwanie numeru osoby z listy osób (na strukturach)

0

jaki będzie kod programu w C++, aby zrobić wyszukiwanie numeru osoby na liście, wyszukiwanie ma się odbywać na podstawie wpisanego imienia bądź nazwiska czyli np:

  1. Jan Kowalski
  2. Andrzej Piotrowski
  3. Jan Nowak

po wybraniu w programie opcji wyszukiwania np. przez imię, podając np. imię 'Jan' program ma wyświetlić:

  1. Jan Kowalski
  2. Jan Nowak

lub np. wpisując 'Andrzej':
2. Andrzej Piotrowski

program ma być zrealizowany na strukturach

oto co zrobiłem sam:

#include<iostream>
#include<conio>
#include<stdio>
using namespace std;
// ---------- deklaracja struktur ----------
struct imie {
string a[3];
};

struct nazwisko {
string b[3];
};
// ---------- program główny -----------
int main () {

char in;
string name,surname;

cout<<"Wg jakiego kryterium wyszukiwac: [i]mie, czy [n]azwisko?";
cin>>in;

if (in=='i') {
cout<<"Podaj imie: ";
cin>>name;
cout<<"Numer tej osoby na liscie studentow to: ";
}

else
if (in=='n') {
cout<<"Podaj nazwisko, ktore mam wyszukac:";
cin>>surname;
}

else
cout<<"NIE ROZUMIEM POLECENIA";

getch ();
return 0;
}

nie mam pojęcia jak zrobić wyszukiwanie... pomocy!

0

Struktury są by ułatwiać programowanie, nie by je utrudniać:

struct osoba { // nie wiem po co ty to rozszczepiałeś na osobne struktury
 string imie;
 string nazwisko;
 int id;
}

void find_name( string name, osoba* where ) {
 for( osoba* os = where; *os; os++ )
  if( name == os->imie )
   cout << os->id << ' ' << os->imie << ' ' << os->nazwisko << '\n';
}

void find_surname( string surname, osoba* where ) {
 for( osoba* os = where; *os; os++ )
  if( surname == os->nazwisko )
   cout << os->id << ' ' << os->imie << ' ' << os->nazwisko << '\n';
}
0
#include<iostream>
#include<conio>
#include<stdio>
using namespace std;

struct osoba {
 string imie;
 string nazwisko;
 int id;
}

void find_name( string name, osoba* where ) {
 for( osoba* os = where; *os; os++ )
  if( name == os->imie )
   cout << os->id << ' ' << os->imie << ' ' << os->nazwisko << '\n';
}

void find_surname( string surname, osoba* where ) {
 for( osoba* os = where; *os; os++ )
  if( surname == os->nazwisko )
   cout << os->id << ' ' << os->imie << ' ' << os->nazwisko << '\n';
}

getch ();
return 0;
}
}

[C++ Error] File3.cpp(12): E2176 Too many types in declaration
[C++ Error] File3.cpp(12): E2111 Type 'osoba' may not be defined here
[C++ Error] File3.cpp(13): E2096 Illegal structure operation
[C++ Warning] File3.cpp(16): W8070 Function should return a value
[C++ Error] File3.cpp(19): E2096 Illegal structure operation
[C++ Error] File3.cpp(25): E2040 Declaration terminated incorrectly
[C++ Error] File3.cpp(26): E2190 Unexpected

0

A może jeśli łaska napiszesz ten kod normalnie?? Gdzie funkcja main()??

0

oczywiście o int main () zapomniałem ale to nic nie zmienia

0

Zapomniałeś o #include <string> i zmień funkcje na:

void find_name( string name, osoba* where, int ile_osob ) {
 for( int i = 0; i < ile_osob; i++ )
  if( name == where[i].imie )
   cout << where[i].id << ' ' << where[i].imie << ' ' << where[i].nazwisko << '\n';
}

A drugą analogiczne, ewentualnie skorzystaj z vector.

0
#include<iostream>
#include<conio>
#include<stdio>
#include<string>
using namespace std;

struct osoba {
 string imie;
 string nazwisko;
 int id;
}

int main () {

void find_name( string name, osoba* where, int ile_osob ){

 for( int i = 0; i < ile_osob; i++ )
  if( name == where[i].imie )
   cout << where[i].id << ' ' << where[i].imie << ' ' << where[i].nazwisko << '\n';
}

void find_surname( string surname, osoba* where, int ile_osob ) {
 for( int i = 0; i < ile_osob; i++ )
  if( surname == where[i].nazwisko )
   cout << where[i].id << ' ' << where[i].imie << ' ' << where[i].nazwisko << '\n';
}

getch ();
return 0;
}

[C++ Error] f1.cpp(13): E2176 Too many types in declaration
[C++ Error] f1.cpp(13): E2111 Type 'osoba' may not be defined here
[C++ Error] f1.cpp(15): E2141 Declaration syntax error
[C++ Error] f1.cpp(28): E2034 Cannot convert 'int' to 'osoba'

0

Nic dziwnego skoro zagnieżdżasz funkcje :/ Po co stdio i iostream?? Conio.h jest ci nie potrzebne.
To się kompiluje:

#include <iostream>
#include <string>

using namespace std;

struct osoba {
 string imie;
 string nazwisko;
 int id;
};

void find_name( string name, osoba* where, int ile_osob ){

 for( int i = 0; i < ile_osob; i++ )
  if( name == where[i].imie )
   cout << where[i].id << ' ' << where[i].imie << ' ' << where[i].nazwisko << '\n';
}

void find_surname( string surname, osoba* where, int ile_osob ) {
 for( int i = 0; i < ile_osob; i++ )
  if( surname == where[i].nazwisko )
   cout << where[i].id << ' ' << where[i].imie << ' ' << where[i].nazwisko << '\n';
}

int main () {

cin.get();
return 0;
}
0

a gdzie wpisać listę np tych trzech osób które podałem na początku , żeby móc je teraz wyszukać ?

0
int main() {

osoba tabl[2];
tabl[0].imie = "Jan";
tabl[0].nazwisko = "Kowalski";
tabl[0].id = 1;
tabl[1].imie = "Antoni";
tabl[1].nazwisko = "Nowak";
tabl[1].id = 2;

find_name( "Jan", tabl, 2);
find_surname( "Nowak", tabl, 2);

cin.get();
return 0;
}
0

po wpisaniu 'nowak' okno się zamyka

0
#include <iostream>
#include <string>

using namespace std;

struct osoba {
 string imie;
 string nazwisko;
 int id;
};

void find_name( string name, osoba* where, int ile_osob ){

 for( int i = 0; i < ile_osob; i++ )
  if( name == where[i].imie )
   cout << where[i].id << ". " << where[i].imie << ' ' << where[i].nazwisko << '\n';
}

void find_surname( string surname, osoba* where, int ile_osob ) {
 for( int i = 0; i < ile_osob; i++ )
  if( surname == where[i].nazwisko )
   cout << where[i].id << ". " << where[i].imie << ' ' << where[i].nazwisko << '\n';
}

int main() {

// START
osoba tabl[2]; // 1
tabl[0].imie = "Jan";
tabl[0].nazwisko = "Kowalski";
tabl[0].id = 1;
tabl[1].imie = "Antoni";
tabl[1].nazwisko = "Nowak";
tabl[1].id = 2;
// STOP

char in;
string name,surname;

cout<<"Wg jakiego kryterium wyszukiwac: [i]mie, czy [n]azwisko?";
cin>>in;

if (in=='i') {
cout<<"Podaj imie: ";
cin>>name;
cout<<"Numer tej osoby na liscie studentow to: \n";
find_name( name, tabl, sizeof(tabl)/12 );
}

else
if (in=='n') {
cout<<"Podaj nazwisko, ktore mam wyszukac:";
cin>>surname;
cout<<"Numer tej osoby na liscie studentow to: \n";
find_surname( surname, tabl, sizeof(tabl)/12 );
}

cin.get();
return 0;
}

I teraz po prostu jak trzeba to zwiększasz liczbę przy 1 i dodajesz dane. Nie zmieniaj nic poza START i STOP.

0
winerfresh napisał(a)

I teraz po prostu jak trzeba to zwiększasz liczbę przy 1 i dodajesz dane. Nie zmieniaj nic poza START i STOP.

to akurat rozumiem, ale niestety wybierając z menu 'imię' potem wpisuję 'antoni' i okno się zamyka

0

Jaki masz kompilator?? Bo mi wszystko działa.

0

Borland C++ Builder , i na tym kompilatorze będę na zajęciach bronił tego co napisałeś :)

0

No to kiszka. Musisz znaleźć kogoś kto ci powie dlaczego to nie działa bo ja działam na GNU/Linuxie i nie pójdzie.
[quetz:CIACH]

0

gdybym będąc w Twoim wieku zajął się programowaniem - na pewno teraz byłbym z tego lepszy
ja jednak traciłem czas na uczenie się historii czy biologii itp. żeby z wszystkiego mieć dobre oceny, jesteś dobry na kompie i
[quetz: CIACH]

dzięki Mistrzu wielkie bo i tak bardzo mi pomogłeś i wielka flacha Ci się należy...
pozdrawiam

0

1' jesli chcecie sie spierac o wyzszosci jednego podejscia do zycia nad innym i przy okazji wyzywac sie od nieudacznikow, dwojowiczow i idiotow - umowcie sie na GG okej?

2'

adryan3000 napisał(a)

wybierając z menu 'imię' potem wpisuję 'antoni' i okno się zamyka

winerfresh napisał(a)

Jaki masz kompilator?? Bo mi wszystko działa.

winerfresh napisał(a)
...
int main() { ...
char in;
string name,surname;

cout<<"Wg jakiego kryterium wyszukiwac: [i]mie, czy [n]azwisko?";
cin>>in;                              /// 1

if (in=='i') {
cout<<"Podaj imie: ";
cin>>name;                    /// 2
cout<<"Numer tej osoby na liscie studentow to: \n";
find_name( name, tabl, sizeof(tabl)/12 );
}

else
if (in=='n') {
cout<<"Podaj nazwisko, ktore mam wyszukac:";
cin>>surname;              /// 3
cout<<"Numer tej osoby na liscie studentow to: \n";
find_surname( surname, tabl, sizeof(tabl)/12 );
}

cin.get();   /// 4
return 0;
}

adryan3000 ma racje. program po skonczeniu pracy sie po prostu sie zamknie. to ze winerfresh widzi jakis efekt jego pracy a adryan3000 nie - to wynika z konfiguracji IDE. zgaduje ze winerfresh pracuje pod konsola i po prostu widzi co program wypisal, a adryan3000 w swoim BCB nie ustawil zadnej opcji przytrzymania okna po zaknczeniu programu (o ile takowa w ogole jest w bcb)

w miejscach w kodzie oznaczonych (1)(2)(3) winerfresh wczytuje dane z cin operatorami >>. jak wiadomo, operatory te pomijaja biale znaki sprzed danych odczytywanych, ale pozostawiaja biale znaki po nich, az do nastepnego czytania.
tak wiec, zawrowno w (1), (2), jak i (3) za kazdym razem w buforze cin'a pozostaja znaki konca linii ktore uzytkownik musial wprowadzic nacisnajac enter przy wprowadzaniu linii.

i tenze wlasnie znak zostaje zebrany przez cin.get() w linii (4) co sprawia ze cin.get() nie powoduje pauzy programu i zwyczajowego przytrzymania okna az user pacnie enter.

solution:
jak konczysz czytanie operatorami << i przechodzisz w miejsce kodu gdzie zakladasz ze juz wszystko odczytales i teraz czekasz na cos nowego, walnij:

std::cin.ignore(std:: numeric_limits<int>::max(),'\n'); //uniwersalne na kazdy strumien, zrzuca zbedne pozostale znaki az do konca linii

albo

std::cin.sync(); //prawidlowe tylko dla buforowanych. szczesliwie cin jest taki

edit:
eh, no i nie dopisalem..
czyli np.:

cin.sync();cin.get();return 0;

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