Telefonbok, problem med att visa kontakter samt tips för sök funktion.
Hej har fått i uppgift att göra en telefonbok men har stött på problem. efter att jag lagt till ett par kontakter och sedan går in på Kontakter för att se alla mina kontakter så är det som att jag inte registrerat dom 2 första kontakterna jag lagt in medans resten syns.
önskar även hjälp med om någon har en enkel lösning för att sätta in en sök funktion för att kunna söka på alla dessa namn som lagts in.
#include <iostream>
#include <string>
using namespace std;
struct kontakter
{
string namn;
string efternamn;
string telefonnr;
};
kontakter telefonbok[10];
int main()
{
int kontakter_count = 0;
int i, ja, nej;
for (i=0; i<10; i++)
while (true) // while-loop
{
// Menyn:
cout << "[K]ontakter\n";
cout << "[L]\x84gg till kontakt\n";
cout << "[S]\x94k kontakter\n";
cout << "[A]vsluta\n";
char menySelection; // användarens val
cin >> menySelection;
switch (menySelection)
{
case 'K': // tryck K eller k för att välja Kontakter
case 'k':
{
for(int i = 0 < kontakter_count; i++;)
cout << telefonbok[i].namn << ", " << telefonbok[i].efternamn << "." << telefonbok[i].telefonnr << "." << endl;
cout << " " << endl;
}
break;
case 'L': // tryck L eller l för att välja Lägg till kontakter
case 'l':
if(kontakter_count < 10)
{
cout << "L\x84gg till en kontakt" << endl; //Lägga till en kontakt
cout << "Kontakter " << kontakter_count << endl;
cout << "Namn: " << endl;
cin >> telefonbok[kontakter_count].namn; ]
cout << "Efternamn: " << endl;
cin >> telefonbok[kontakter_count].efternamn;
cout << "Telenr: " << endl;
cin >> telefonbok[kontakter_count].telefonnr;
++kontakter_count;
}
else
cout << "Telefonboken \x84r tyv\x84rr full. " << endl;
break;
case 'S': // tryck S eller s för att söka kontakter
case 's':
{
cout << "Skriv in namn på den du s\x94ker" << endl;
}
break;
case 'A': // A eller a för att avsluta
case 'a':
{
cout << "hej d\x86";
return 0; // avslutar programet
}
break; // avbryter while-loopen
}
}
}
Det här ser konstigt ut:
for(int i = 0 < kontakter_count; i++;)
Jag skulle skriva
for(int i = 0; i < kontakter_count; i++)
Det du skrev gör säkert något annat.
Jag förstår inte hur du kan ha kompilerat detta?
Din compiler (antagligen Visual Studio) borde väl bli ledsen över exempelvis denna raden (rad 53):
cin >> telefonbok[kontakter_count].namn; ]
Börja med att fixa alla syntaxfel som är uppenbara (som din compiler klagar på) och visa hur koden ser därefter så kan vi försöka lita ut vad som inte gör som det ska.
En enkel sökfunktion vore att helt enkelt kolla igenom din array och söka i de olika fälten med .find
string search;
cin >> search;
for (int i = 0; i < kontakter_count; ++i)
{
if (telefonbok[i].namn.find(search) != string::npos
|| ... de andra fälten )
{
cout << telefonbok[i].namn
<< "," << telefonbok[i].efternamn
<< "," << telefonbok[i].telefonnr << endl;
}
}
Tack Laguna25247, det ordnade till programmet.
Dracaena jag använder mig av CodBlocks men jag tog bort lite kommentarer när jag klistrade in här och råkade lämna kvar ett " ] ".
anders_k skrev:En enkel sökfunktion vore att helt enkelt kolla igenom din array och söka i de olika fälten med .find
string search; cin >> search; for (int i = 0; i < kontakter_count; ++i) { if (telefonbok[i].namn.find(search) != string::npos || ... de andra fälten ) { cout << telefonbok[i].namn << "," << telefonbok[i].efternamn << "," << telefonbok[i].telefonnr << endl; } }
hur hade du lagt till denna i koden? började med fel kod 344 vilket ska vara att c++ inte vill känna av åäö, kom undan den, men ej förbi att den vill ha en ")" före "||"" innan:
if (telefonbok[i].namn.find(search) != string::npos
Jag tänkte att du skulle fylla på resten själv, det var inte klipp- och klistra-format
rätt syntax vore något sådant:
string search;
cin >> search;
for (int i = 0; i < kontakter_count; ++i)
{
if ( telefonbok[i].namn.find(search) != string::npos
|| telefonbok[i].efternamn.find(search) != string::npos
|| telefonbok[i].telefonnr.find(search) != string::npos )
{
cout << telefonbok[i].namn
<< "," << telefonbok[i].efternamn
<< "," << telefonbok[i].telefonnr << endl;
}
}
Du nämner inte vilken omgivning du kör, typ vilket OS och vilken kompilator vilket gör att det går inte direkt att svara på det där med ÅÄÖ.
Men om du håller på att göra en console program med visual studio sätter du rätt code page genom anropet.
SetConsoleOutputCP(1252);
Hej tack för snabbt svar.
Följd frågor för att klar göra endel och så att jag inte tolkar koderna fel
String::npos används enbart för att sätta ett slut på en sträng?
Search söker efter exakt det du skrivit och find_first_of funktionen söker mer i innehållet och bryr sig inte om i vilken ordning bokstäver eller siffror är skrivna?
Ett tips om du inte vet vad en funktion eller dylikt gör, är att googla eller kolla den officiella dokumentationen. Detta blir ännu mer relevant när du börjar jobba med mer komplexa libs och dylikt. :)
Prova att läsa detta: https://cplusplus.com/reference/string/string/npos/
Svara det på din fråga?
Jo jag kollade där men kändes osäkert om jag förstått exakt vad det gjort men la till "!=" i dess sammanhang så vart det lättare att förstå. tack för tipset!
no15y skrev:Hej tack för snabbt svar.
Följd frågor för att klar göra endel och så att jag inte tolkar koderna fel
String::npos används enbart för att sätta ett slut på en sträng?
Search söker efter exakt det du skrivit och find_first_of funktionen söker mer i innehållet och bryr sig inte om i vilken ordning bokstäver eller siffror är skrivna?
Nej, string::npos används som en konstant för att kolla mot returvärdet från strängfunktioner som find m.fl. Den är inte med i strängar på något vis. find ger träff om den hittar substrängen du söker efter i strängen, om du vill jämföra med hela strängen istället så kan du göra det med en vanlig jämförelse ==
string input;
cin >> input;
if (telefonbok[i].namn == input)
{
...
}
Du kan förstås också använda algoritmen (search) istället men jag tänkte att det är onödigt att krångla till det.
Det beror lite på hur du vill att din sökfunktion skall fungera för användaren, man kan göra den mer stringent genom att kolla bara mot hela strängen, eller man kan t.ex. specifikt söka bara efternamn osv. det finns många sätt.
Sedan skall du väl också kunna hantera att söka på namn oberoende av stor/liten bokstav - så detta är väl något du också får fundera på
Viktigt att tänka på speciellt när det gäller C++ programmering är att försöka hålla saker och ting så enkla som möjligt, man kan sen alltid "fixa till det" efteråt.