10 svar
225 visningar
no15y 9
Postad: 5 jul 2023 18:04 Redigerad: 5 jul 2023 18:06

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
        }
    }
}
Laguna Online 28688
Postad: 5 jul 2023 19:44

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.

Fermatrix 7841 – Fd. Medlem
Postad: 5 jul 2023 20:35 Redigerad: 5 jul 2023 20:36

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.

anders_k Online 234
Postad: 5 jul 2023 23:53

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;
  }
} 
  
no15y 9
Postad: 6 jul 2023 05:23

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 " ] ".

no15y 9
Postad: 7 jul 2023 21:00
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
anders_k Online 234
Postad: 8 jul 2023 07:13

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);
no15y 9
Postad: 8 jul 2023 09:12

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?

Fermatrix 7841 – Fd. Medlem
Postad: 8 jul 2023 10:49 Redigerad: 8 jul 2023 10:49

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? 

no15y 9
Postad: 8 jul 2023 11:02

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!

anders_k Online 234
Postad: 8 jul 2023 12:40 Redigerad: 8 jul 2023 12:43
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.

Svara Avbryt
Close