Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


En massa frågor + ett fel jag inte ser

Postades av 2006-08-27 14:21:18 - Alexander Av Ekenstam, i forum c++, Tråden har 8 Kommentarer och lästs av 1055 personer

Hej,

Har nyligen börjat med C++ och har ett litet problem. Följande code fungerar fint tills man väljer att starta om det.

#include <iostream>
#include <string>

using namespace std;

#define hr "--------------------------------------------------------------------------------";

int main ()
{

	//
	string name;
	string lastname;
	string from;
	string age;
	string returnCMD;
start:
	cout << "\t Test " << endl;

	cout << "What is your firstname?" << endl;
	getline(cin, name);

	cout << "What is your lastname?" << endl;
	getline(cin, lastname);

	cout << "Where are you from?" << endl;
	getline(cin, from);

	cout << "How old are you?" << endl;
	getline(cin, age);
	
	cout << hr;
	cout << "Firstname\t" << name << endl;
	cout << "Lastname\t" << lastname << endl;
	cout << "From\t\t" << from << endl;
	cout << "Age\t\t" << age << endl;
	cout << hr;

	cout << endl << "Restart (Y) or quit the program (N)?" << endl;

invaildReturnCMD:
	cin >> returnCMD;
	if(returnCMD == "Y"){
		system("cls");
		goto start;
	}
	else if(returnCMD == "N"){
		exit(1);
	}
	else{
		cout << "Yes (Y) or No (N)" << endl;
		goto invaildReturnCMD;
	}
	return 0;
}

Den skippar att fråga efter "What is your firstname" utan frågar direkt efter "What is your lastname" istället.

Övriga frågor ang variablar.
Om man vill ha en variable med a-z0-9... o.s.v alltså en sträng. Går det helt utmärkt att använda sig av <b>string from;</b> som jag har gjort, eller fungerar det bättre med char... (char, som jag inte riktigt förstår)

Tack i förhand till alla! :)


Svara

Sv: En massa frågor + ett fel jag inte ser

Postades av 2006-08-27 21:35:17 - Niklas Jansson

1. Du använder moderna headers <iostream> etc., vilket är bra. Tyvärr släpper du upp namnrymden globalt. Lägg hellre "using namespace std" innanför main.

2. Du använder #define. Använd <b>aldrig</b> #define, utom för villkorlig kompilering. (Det finns ett fåtal användningsområden, du kommer inte stöta på något av dem på väldigt länge.)
Lägg istället en "const string hr = "---"" i main.

3. string ska alltid användas istället för char. Enda användningsområdet för char-arrayer etc. idag är för äldre kod eller API:er. I de fallen kan du konvertera string till sådana. char * är inte direkt svårt att använda, men det finns inte heller något direkt skäl till att göra det.

4. Du använder labels och goto. Gör <b>aldrig någonsin</b> det. Det kan du ha nytta av i automatgenererad kod, men inte mycket annat. Anledningen till att du inte bör göra det är att det alldeles för lätt blir rejäla fel som är svåra att hitta, och svåra att lösa. Det är det du har fått känna på nu.

Använd istället while-loopar etc.

Ditt program skulle snarare se ut som något i stil med:

int main()
{
  string answer = "Y";
  while(answer == "Y"){
    //...
    getline(cin, answer);
    while(!(answer=="Y" || answer ="N")){
      cout << "Y/N?";
      getline(cin, answer);
  }
}


Svara

Sv:En massa frågor + ett fel jag inte ser

Postades av 2006-08-27 22:21:38 - Alexander Av Ekenstam

Tackar så mycket för en informationen du delat med dig, om jag har förstått det rätt så är detta en bättre lösning?

#include <iostream>
#include <string>
#include <windows.h>

using namespace std;

const string hr = "--------------------------------------------------------------------------------";

int main ()
{
	//Variablar
	string name;
	string lastname;
	string from;
	string age;
	string returnCMD = "Y";

	while(returnCMD == "Y"){

		cout << "\t Test " << endl;

		cout << "- What is your firstname?" << endl;
		getline(cin, name);

		cout << "- What is your lastname?" << endl;
		getline(cin, lastname);
		
		cout << "- Where are you from?" << endl;
		getline(cin, from);
		
		cout << "- How old are you?" << endl;
		getline(cin, age);
		
		cout << endl << hr;
		cout << "Firstname\t" << name << endl;
		cout << "Lastname\t" << lastname << endl;
		cout << "From\t\t" << from << endl;
		cout << "Age\t\t" << age << endl;
		cout << hr;
		

		cout << endl << "Restart (y) or quit the program (n)?" << endl;
		getline(cin, returnCMD);

		while(returnCMD != "Y" || returnCMD != "N"){
			if(returnCMD == "Y"){
				system("cls");
				break;
			}
			else if(returnCMD == "N"){
				exit(1);
			}
			else{
				cout << "Yes (y) or No (n)" << endl;
				getline(cin, returnCMD);
			}
		}
	}
	return 0;
}


Kan även påpeka att "buggen" som fanns i min förra version försvann när jag valde en while loop istället! :)


En lite fråga till denna kväll. Kan man på något sätt få t.ex. returnCMD till gemener? Typ returnCMD.tolowerstring eller något liknande?


Svara

Sv: En massa frågor + ett fel jag inte ser

Postades av 2006-08-28 08:15:15 - Niklas Jansson

Mycket bättre, men inte bäst än.

Undvik att använda break eller exit om det inte är helt nödvändigt. Den yttre loopen tar hand om fallet "N". exit(1) skulle betyda att ett fel har uppstått, något som sannolikt inte är vad du vill.


system("cls") är en vanlig lösning, men den är otrevlig eftersom den inte fungerar på alla system. Frågan är om du verkligen behöver det?
Jag skulle slängt in två blankrader och nöjt mig med det. Orkar inte förklara problemet med system() just nu, återkom om du vill veta.

Vidare använder du inte windows.h, så den kan du ta bort, och raderna med namespace och konstanten ligger utanför main. Finns ingen anledning till det. Skippa också onödiga kommentarer, och använd inte versaler etc. i onödan. Min variant av koden hade istället sett ut som något i stil med:

#include <iostream>
#include <string>

int main ()
{
	using namespace std;
	const string hr = "--------------------------------------------------------------------------------";

	string name;
	string lastname;
	string from;
	string age;
	string cmd = "Y";

	while(cmd == "Y"){

		cout << "\t Test " << endl;

		cout << "- What is your first name?" << endl;
		getline(cin, name);

		cout << "- What is your last name?" << endl;
		getline(cin, lastname);
		
		cout << "- Where are you from?" << endl;
		getline(cin, from);
		
		cout << "- How old are you?" << endl;
		getline(cin, age);
		
		cout << endl << hr;
		cout << "Firstname\t" << name << endl;
		cout << "Lastname\t" << lastname << endl;
		cout << "From\t\t" << from << endl;
		cout << "Age\t\t" << age << endl;
		cout << hr;
		

		cout << endl << "Restart (y) or quit the program (n)?" << endl;
		getline(cin, cmd);

		while(cmd != "Y" || cmd != "N"){
			cout << "Yes (y) or No (n)" << endl;
			getline(cin, cmd);
		}
	}
	return 0;
}


<b>>Kan även påpeka att "buggen" som fanns i min förra version försvann när jag valde en while loop istället! :)</b>
Precis vad jag gissade. Där ser du direkt varför du inte ska använda labels och goto.

<b>>En lite fråga till denna kväll. Kan man på något sätt få t.ex. returnCMD till gemener? Typ returnCMD.tolowerstring eller något liknande?</b>

Du använder dig av:

transform (cmd.begin(),cmd.end(), cmd.begin(), tolower);
Och se till att inkludera <algorithm>


Svara

Sv: En massa frågor + ett fel jag inte ser

Postades av 2006-08-28 14:58:24 - Göran Andersson

> Kan även påpeka att "buggen" som fanns i min förra version försvann när jag valde en while loop istället! :)

Nej, buggen försvann för att du använder "getline()" istället för "cin >>".


Svara

Sv:En massa frågor + ett fel jag inte ser

Postades av 2006-08-28 17:17:55 - Alexander Av Ekenstam

Tack så hemskt mycket!


Svara

Sv:En massa frågor + ett fel jag inte ser

Postades av 2006-08-30 15:01:27 - Alexander Av Ekenstam

Har tyvärr inte haft tid att testa din kod Niklas förrens idag och allt fungerar fint fram till den sista loopen <b>while(cmd != "Y" || cmd != "N"){</b>. Oavsett vad jag skriver så forstätter loopen i att fråga <b>Yes (Y) or No (N)</b>.

Vad kan var fel?


Svara

Sv: En massa frågor + ett fel jag inte ser

Postades av 2006-08-30 18:05:04 - Per Persson

Ändra till <b>while(cmd != "Y" && cmd != "N") {</b>


Svara

Sv:En massa frågor + ett fel jag inte ser

Postades av 2006-08-30 22:10:11 - Alexander Av Ekenstam

Tack!


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
463
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies