Permalänk

Needar hjälp c++

Hej jag är hyffsat ny med c++, så jag hoppas ni förstår om detta är ett nybörjar misstag.

iallafall. jag försöker göra ett program som gör ett account genom att du skriver in din första bokstav i ditt för namn sen din första bokstav i ditt andra namn. och utav det så ska man få ut ett account som ser ut ungefär såhär: EX. "JA_8937"

JA står för Jesper Andersson, 8 får man pga att man använde "J" och 9 av "A". och de sista 2 siffrorna ska vara random.

jag är dock inte klar med mitt script. men jag har stött på ett problem som jag inte fattar.

här är min kod:

#include<iostream> #include<string> #include<cstdlib> #include<ctime> using namespace std; int main() { char first = 'a'; char second = 'b'; int third = 0; int fourth = 0; void calc(char first, char second); while(true) { cout << "Enter the first letter in your FIRST name than press Enter, Repeat twice: " << endl; cin >> calc(first, second); cout << endl; cout << "Now enter the first letter in your SECOND name, and then press Enter, " << endl << "repeat twice: " << endl; cin >> calc(first, second); cout << endl; } } void calc(char first, char second) { char first2 = 'a'; char second2 = 'b'; int third = 0; int fourth = 0; int antal = 0; if( first == 'A' || first == 'B' || first == 'C' || first == 'D') { if (antal == 0) { third = third +9; } else { fourth = fourth +9; } } else if( first == 'E' || first == 'F' || first == 'G' || first == 'H') { if (antal == 0) { third = third +7; } else { fourth = fourth +7; } } else if( first == 'I' || first == 'J' || first == 'K' || first == 'L') { if (antal == 0) { third = third +8; } else { fourth = fourth +8; } } else if( first == 'M' || first == 'N' || first == 'O' || first == 'P') { if (antal == 0) { third = third +6; } else { fourth = fourth +6; } } else if( first == 'Q' || first == 'R' || first == 'S' || first == 'T') { if (antal == 0) { third = third +4; } else { fourth = fourth +4; } } else if( first == 'U' || first == 'V' || first == 'W' || first == 'X') { if (antal == 0) { third = third +5; } else { fourth = fourth +5; } } else if( first == 'Y' || first == 'Z' ) { if (antal == 0) { third = third +3; } else { fourth = fourth +3; } } else { cout << "Only capital letters!" << endl << endl; } antal = antal + 1; }

när jag deebuggar detta så får jag 2 errors:

.\acc.cpp(20) : error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'void' (or there is no acceptable conversion)
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(1144): could be 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,signed char *)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include\istream(1146): or 'std::basic_istream<_Elem,_Traits> &std::operator >><std::char_traits<char>>(std::basic_istream<_Elem,_Traits> &,signed char &)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]

fast det fortsätter en bra bit med näst intill samma text

Permalänk
Medlem

Du har många fel. Kolla dina funktionsanrop, de är inte korrekta Tex. i main.
Sen så kallas det nog inte skript.

Permalänk

Tack för ett mycket instruktivt svar... jag sa ju att jag var nybörjare. och endå får jag ett sånt här medelande. mycket uppmuntrad man blir!

Permalänk
Medlem

cin >> calc(first, second);
bör ändras till:
cin >> first >> second;
calc(first, second);

Detta eftersom cin inte kan läsa in ett värde till void (som calc-metoden returnerar). Det verkar vara det som kompilatorn klagar på.

Permalänk
Medlem

Det främsta felet är att du använder cin till en funktion som returnerar void, det går inte. Först måste du lagra inmatningen från cin i en variabel:

char input; cin >> input;

En annan grej som jag tror är ett fel (men jag är inte 100% säker) är att du deklarerar
void calc(char first, char second);
i main, man brukar deklarera funktioner utanför funktioner.

ps. som whzfred sa: det heter program, inte script. ;]

edit: Missade några ord i första meningen.

Permalänk

Det där var bättre tackar ! ska försöka fixa till de nu

Permalänk
Hedersmedlem

Om du ändrar trådtiteln också kanske du får mer hjälp.

Permalänk

Nu funkar det bättre:) men har stött på ett annat problem. jag tror inte jag förstår hur man använder void riktigt. men detta är mitt program:

#include<iostream> #include<string> #include<cstdlib> #include<ctime> using namespace std; char first = 'a'; char second = 'b'; int third = 0; int fourth = 0; void calc(char first, char second); int antal = 0; int main() { while(true) { cout << "Enter the first letter in your FIRST name than press Enter. " << endl; cin >> first; cout << endl; calc(first, second); cout << "Now enter the first letter in your SECOND name, and then press Enter, " << endl; cin >> second; cout << endl; calc(first, second); cout << "Your account is: " << first << second << "_" << third << fourth << endl << endl; } } void calc(char first, char second) { if( first == 'A' || first == 'B' || first == 'C' || first == 'D') { if (antal == 0) { third = third +9; antal = antal + 1; } else { fourth = fourth +9; } } else if( first == 'E' || first == 'F' || first == 'G' || first == 'H') { if (antal == 0) { third = third +7; antal = antal + 1; } else { fourth = fourth +7; } } else if( first == 'I' || first == 'J' || first == 'K' || first == 'L') { if (antal == 0) { third = third +8; antal = antal + 1; } else { fourth = fourth +8; } } else if( first == 'M' || first == 'N' || first == 'O' || first == 'P') { if (antal == 0) { third = third +6; antal = antal + 1; } else { fourth = fourth +6; } } else if( first == 'Q' || first == 'R' || first == 'S' || first == 'T') { if (antal == 0) { third = third +4; antal = antal + 1; } else { fourth = fourth +4; } } else if( first == 'U' || first == 'V' || first == 'W' || first == 'X') { if (antal == 0) { third = third +5; antal = antal + 1; } else { fourth = fourth +5; } } else if( first == 'Y' || first == 'Z' ) { if (antal == 0) { third = third +3; antal = antal + 1; } else { fourth = fourth +3; } } else { cout << "Only capital letters!" << endl << endl; } }

mitt problem nu är att när jag skriver in min första bokstav i mitt förnamn så får jag ut rätt variable. men när jag ska få ut variabeln fourth som ska tas från första bokstaven i efternamnet, så blir den på mitt förnamn igen. så fourth blir samma som third, båda blir 8. men det jag vill är ju att om jag sätter in J A så ska ju J ge 8 i third och A ge 9 i fourth.

EDIT!!: kom på det. bytte ut:

cout << "Now enter the first letter in your SECOND name, and then press Enter, " << endl;
cin >> second;
cout << endl;
calc(first, second);

mot cout << "Now enter the first letter in your SECOND name, and then press Enter, " << endl;
cin >> second;
cout << endl;
calc(second, first);

Permalänk
Medlem

Använd [ code ] och inte citatfunktionen.

Permalänk

Re: Needar hjälp c++

Citat:

Ursprungligen inskrivet av danmark99
JA står för Jesper Andersson, 8 får man pga att man använde "J" och 9 av "A". och de sista 2 siffrorna ska vara random.

Jag förstår inte din algoritm. Finns det någon som helst tanke bakom den?

Visa signatur

System.out.print(madness ? this.is.SPARTA : "");

Permalänk

asså tanken var att skapa ett program som skulle skapa ett användar namn när man matade in första bokstaven i sitt förnamn och efternamn.

Men detta är inget jag kommer att använda till något utan jag gjorde detta för att lära mig programera.

Permalänk
Medlem

Här kommer lite tips som du kan tänka på:

* Du säger att du inte riktigt förstår vad void gör. När du sätter void före funktionsnamnet så säger du helt enkelt att funktionen inte returnerar någonting. Det finns fler användningar för void, men det är ingenting du behöver veta nu

* Man kan utföra aritmetiska operationer även på chars, dvs. man kan addera och subtrahera chars. Detta gör att du kan skriva din calc-funktion mycket enklare.

* Försök att göra dina funktioner så enkla som möjligt. Istället för att ta in två tecken och konvertera dessa till två siffror utan något beroende mellan dem så kan du skriva en funktion som bara tar ett tecken och returnerar en siffra. Detta gör att funktionen både blir enklare att skriva och att använda. En tumregel är att en funktion ska göra en sak. Om den försöker göra många saker så är det oftast bättre att dela upp den i mindre funktioner.

* calc använder globala variabler, och sätter även värden på dessa. Detta anses oftast som dålig programmering, eftersom det introducerar beroenden på kod utanför funktionen vilket gör det svårare att återanvända funktionen. Det blir också svårare att hålla reda på vilken funktion som använder vilka variabler, och vem som ändrar på variablerna. Så undvik gärna globala variabler, de är för det mesta ett tecken på dålig design. Fundera istället på vad en funktion egentligen behöver, och skicka det till den. Fundera på samma sätt vad en funktion ska ge för resultat, och returnera det resultatet.

Om vi kombinerar mina ovanstående punkter så får vi följande calc-funktion:

int numbers[] = { 9, 7, 8, 6, 4, 5, 3 }; int calc(char letter) { if(letter >= 'A' && letter <= 'Z') // Om letter ligger mellan A och Z { // Subtrahera 'A' från letter så får vi en siffra mellan 0 och 25. // Denna siffra kan vi dela med 4 för att få index till rätt siffra i numbers. return numbers[(letter - 'A') / 4]; } else { cout << "Only capital letters!" << endl << endl; } }

Nu kanske du inte har kommit till arrayer (numbers är en array) riktigt än, men det är mer själva strukturen på funktionen som är det viktiga. Notera att jag endast tar in en bokstav (char), och returnerar en siffra (int). Man kan alltså använda funktionen t.ex. så här:

int num = calc('J'); // num kommer nu innehålla 8. cout << calc('J') << endl; // Skriv ut 8 direkt, utan att lagra den i en variabel.

Hur du kan använda den i ditt program får du själv lista ut

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av perost

int numbers[] = { 9, 7, 8, 6, 4, 5, 3 }; int calc(char letter) { if(letter >= 'A' && letter <= 'Z') // Om letter ligger mellan A och Z { // Subtrahera 'A' från letter så får vi en siffra mellan 0 och 25. // Denna siffra kan vi dela med 4 för att få index till rätt siffra i numbers. return numbers[(letter - 'A') / 4]; } else { cout << "Only capital letters!" << endl << endl; } }

En sak jag undrar här:)

Om jag valde t.ex. "F" så bordet det ju bli typ:

return numbers[ (5) / 4 ]

right?
Men då får man ju 1,25 och "int" kan väl bara ta heltal? Och sen om nu 1,25 skulle fungera, hur avrundar den då?

EDIT: Tror jag fattade nu, den bara ignorerar decimalerna va?

Visa signatur

Burk Nr.1 : Asus P8Z68 V-Pro | i7 2600k @ 4,4 | EVGA GTX780 Classified | Corsair Vengeance 8GB DDR3 1600Mhz | Corsair Obsidian 650D | Corsair TX650M | Corsair H100

Burk Nr.2 : MSI P35 Neo2 | Core 2 Duo E6850 @ 3,2Ghz | Powercolor Radeon HD5850 1GB | Corsiar Twin2X 6400 2x2GB | Corsair 550W

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av miFFhoe

EDIT: Tror jag fattade nu, den bara ignorerar decimalerna va?

Japp, alla aritmetiska operationer där båda operanderna är heltal kommer att ge ett heltal som resultat. 5 / 4 kommer alltså bli 1, decimalerna kapas bara av. Om man istället t.ex. hade delat med ett flyttal (5 / 4.0) så hade man fått 1.25 som resultat.

Permalänk

tackar för hjälpen perost och miFFhoe efterssom miffhoe poängterade de där om decimalerna

ska försöka få in de där i mitt program nu