Forum: Felhantering med get() ?

Forum huvudsida -> Programmering -> Felhantering med get() ?

Sidor: 1 2

Till botten

Mulven 16:54 - 6:e Mars 2007 | Post #1
Medlem
Inlägg: 10


Skicka PM
Om man skriver in en bokstav hänger sig hela programmet, hur ska jag göra för att man inte ska kunna ha bokstäver (den ska börja om ifall man skriver en bokstav).
Det är ett miniräknarprogram. Jag är nybörjare Smiley

  1.  
  2. #include <iostream>
  3. #include <math.h>
  4. #include <stdlib.h>
  5. #include <fstream>
  6. //#include <iodos.h>
  7. using namespace std;
  8.  
  9. int getInt()
  10. {
  11. int x;
  12. cin >> x;
  13. if (!cin)
  14. return -1;
  15. else
  16. return x;
  17. }
  18.  
  19. main()
  20. {
  21. //dos_console();
  22. while (true)
  23. {
  24. int val;
  25. double tal1, tal2, summa;
  26. cout << "Välj ett av alternativen: " << endl;
  27. cout << "1. Addition " << endl;
  28. cout << "2. Subtraktion " << endl;
  29. cout << "3. Division " << endl;
  30. cout << "4. Multiplikation " << endl;
  31. cout << "0. Avsluta " << endl;
  32. val = getInt();
  33. if (val == 1)
  34. {
  35. cout << "Ange två tal:" << endl;
  36. cin >> tal1;
  37. cin >> tal2;
  38. cout << endl;
  39. summa = tal1 + tal2;
  40. cout << "Summan av " << tal1 << " och " << tal2 << " är: " << summa;
  41. cout << endl << endl;
  42. }
  43. if (val == 2)
  44. {
  45. cout << "Ange två tal:" << endl;
  46. tal1 = getInt();
  47. cin >> tal2;
  48. cout << endl;
  49. summa = tal1 - tal2;
  50. cout << "Differensen av " << tal1 << " och " << tal2 << " är: " << summa;
  51. cout << endl << endl;
  52. }
  53. if (val == 3)
  54. {
  55. cout << "Ange två tal:" << endl;
  56. tal1 = getInt();
  57. while (true)
  58. {
  59. cin >> tal2;
  60. if(tal2 != 0)
  61. break;
  62. else
  63. cout << "Kan inte dela med 0, ange nytt tal" << endl;
  64. }
  65. cout << endl;
  66. summa = tal1 / tal2;
  67. cout << "Kvoten av " << tal1 << " och " << tal2 << " är: " << summa;
  68. cout << endl << endl;
  69. }
  70. if (val == 4)
  71. {
  72. cout << "Ange två tal:" << endl;
  73. tal1 = getInt();
  74. tal2 = getInt();
  75. cout << endl;
  76. summa = tal1 * tal2;
  77. cout << "Produkten av " << tal1 << " och " << tal2 << " är: " << summa;
  78. cout << endl << endl;
  79. }
  80. if (val == 0)
  81. break;
  82. }
  83. }



Senast redigerad 18:42 - 6:e Mars 2007


Independence 17:10 - 6:e Mars 2007 | Post #2
Administratör
Inlägg: 1800


Skicka PM
Hmm, jag vet inte om detta är en ful/dålig lösning, men det verkar fungera iaf:

  1.  
  2. int getInt()
  3. {
  4. int x;
  5. cin >> x;
  6. if (!cin)
  7. return -1;
  8. else
  9. return x;
  10. }


Sedan anropar du den funktionen istället för cin >> tal1; Dvs tal 1 = getInt();
Du kan även göra det direkt i koden, men eftersom du verkar ha så många cin så kanske en egen funktion är ett bättre val.

-------------------------

Vi är riddarna som säger fiskbulle!





Mulven 17:58 - 6:e Mars 2007 | Post #3
Medlem
Inlägg: 10


Skicka PM
Jag förstod inte hur jag skulle implementera den i koden för jag får bara fel, att getInt() inte är deklarerad.




Independence 18:22 - 6:e Mars 2007 | Post #4
Administratör
Inlägg: 1800


Skicka PM
Den ska antingen stå över main (eller där du anropar den) eller ha en deklaration ovanför det stället.

-------------------------

Vi är riddarna som säger fiskbulle!





Mulven 18:32 - 6:e Mars 2007 | Post #5
Medlem
Inlägg: 10


Skicka PM
jag fick det inte att fungera, programmet hängde sig även fast man hade använt funktionen...




Independence 18:36 - 6:e Mars 2007 | Post #6
Administratör
Inlägg: 1800


Skicka PM
Hur ser din kod ut efter att du bytt ut alla cin mot getInt då?
(Använd gärna taggarna för källkodsformattering)

-------------------------

Vi är riddarna som säger fiskbulle!





Mulven 18:42 - 6:e Mars 2007 | Post #7
Medlem
Inlägg: 10


Skicka PM
Jag ändrade originalinlägget




Independence 18:47 - 6:e Mars 2007 | Post #8
Administratör
Inlägg: 1800


Skicka PM
Okej, problemet är att du bara bytt ut cin på typ var tredje ställe eller så Smiley
Rad 40, 41, 54 osv

-------------------------

Vi är riddarna som säger fiskbulle!





ozamosi 19:53 - 6:e Mars 2007 | Post #9
Administratör
Inlägg: 1129


Skicka PM
Ska det verkligen stå if(!cin)..?

-------------------------
Ljusblå



Smygis 20:15 - 6:e Mars 2007 | Post #10
Medlem
Inlägg: 90


Skicka PM
Jag föreslår att du markerar filen och trycker på knappen "delete".

Det finns gånger man vinner på att börja om från början. Speciellt så något är så där trasigt.

Så det är mitt tips: Tänk om och gör rätt.

-------------------------
Ingen signatur! <- OMG! Jag har inte någon signatur! Ge mig en signatur FFS!



main 01:27 - 13:e Mars 2007 | Post #11
Medlem
Inlägg: 40


Skicka PM
1. Inkludera conio.h
2. Deklarera din funktionsprototyp.
3. Använd getch för att returnera tryckt tangent, getche om du vill visa eko.
4. Använd inte iostream överhuvudtaget, använd standard io, som printf och puts et.c. Då kan du också formatera indata med scanf.
5. Använd inte if-satser när du matar in heltalsdata och du har entydiga alternativ, använd då switch.

-------------------------
- Real programmers code in binary



main 02:10 - 13:e Mars 2007 | Post #12
Medlem
Inlägg: 40


Skicka PM
Jag slängde ihop en enkel "miniräknare" som exempel på standard in- och utmatningsfunktionerna. Man hade kunnat byta ut scanf-satsen mot tre getch, men scanf ger säkrare indata.

  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. long compute(long a, long b, char op);
  6. int main()
  7. {
  8. long tal1, tal2;
  9. char op;
  10.  
  11. puts("Mata in tal +, -, *, / eller % (modulus) f\x94ljt av ett annat tal.");
  12. puts("Om operatorn \x84r 'q' avslutas programmet.");
  13.  
  14. while(1) {
  15. op='q'; /* Om användaren skulle mata in katastrofala data
  16. så gör vi en helgardering för oändlig loop */
  17. scanf("%d %c %d", &tal1, &op, &tal2); if(op=='q') return 0;
  18. printf("Resultat: %d\n\n", compute(tal1, tal2, op));
  19. }
  20. }
  21.  
  22. long compute(long a, long b, char op)
  23. {
  24. switch(op) {
  25. case '+': return a+b;
  26. case '-': return a-b;
  27. case '*': return a*b;
  28. case '/': return a/b;
  29. case '%': return a%b;
  30. default: exit(1); /* Felaktigt inmatade data */
  31. }
  32. }


Hmm.. vart fel med kodformateringen på sidan först.

-------------------------
- Real programmers code in binary

Senast redigerad 02:38 - 13:e Mars 2007


Smygis 12:33 - 13:e Mars 2007 | Post #13
Medlem
Inlägg: 90


Skicka PM
    Citat av main:
1. Inkludera conio.h
2. Deklarera din funktionsprototyp.
3. Använd getch för att returnera tryckt tangent, getche om du vill visa eko.
4. Använd inte iostream överhuvudtaget, använd standard io, som printf och puts et.c. Då kan du också formatera indata med scanf.
5. Använd inte if-satser när du matar in heltalsdata och du har entydiga alternativ, använd då switch.


Får jag slå dig?
1: ,,r inte C++
3: ,,r inte C++
4: ,,r inte C++

Vill du att killen ska koda C så är det bara att säga det. Inte försöka påstå att C är C++.

-------------------------
Ingen signatur! <- OMG! Jag har inte någon signatur! Ge mig en signatur FFS!



ozamosi 12:55 - 13:e Mars 2007 | Post #14
Administratör
Inlägg: 1129


Skicka PM
Det faktum att conio.h är icke-standard, och i princip bara finns i windows- eller doskompilatorer gör inte saken bättre imho.

-------------------------
Ljusblå



NetNinja 17:49 - 13:e Mars 2007 | Post #15
Medlem
Inlägg: 116


Skicka PM
Jag har använt conio.h, småroligt.

-------------------------





main 21:47 - 13:e Mars 2007 | Post #16
Medlem
Inlägg: 40


Skicka PM
Smygis, har du verkligen skrivit C innan C++?

I sådana fall skulle du inte säga att C-kod inte är kompatibel med C++-kompilatorer. C++ är bakåtkompatibel med C, vissa C++-kompilatorer översätter till och med kod till C och kompilerar den sedan. Eftersom han kodar under windows föreslog jag conio, men man kunde förstås lika gärna använt 10^24 andra lösningar, getc är en om man vill ha data direkt vid tangenttryckning. Men, som du ser har jag inte inkluderat den i min källkod. Faktum är att min källkod kan köras på:
Linux,
OS/2,
DOS (16 och 32 bit),
Windows.

Formateringsregler (implicit, det var meningen att man skulle tolka):
standard io -> stdio.h

Självklart fungerar stdio med C++.
Men, det stämmer att conio inte är standard, så det var kanske ett snedsteg att råda någon att inkludera den, den har dock funnits med länge.

"Most C compilers that target DOS, Windows 3.x, Phar Lap, DOSX, OS/2, or Win32 have this header and supply the concomitant library functions in the default C library"


En sak till, C _är_ C++, men inte alltid tvärt om (du vet nog vilka skillnader jag menar)...

Jag vill inte att han ska koda C++, men jag råder honom att använda standard ut- och inmatningsfunktionerna i C, mest för att de är snyggare, men också för att koden blir mer kompakt, och exekverar snabbare. Men, självklart får man göra som man vill.

Detalj:
En sak till, dina punkter 1, 3 och 4, så skriver du: ",,r inte C++". Nej, de är inte C heller. Språket C innehåller inte några egna funktioner för t.ex. in- och utmatning, inga satser för att läsa eller skriva, inga metoder för filaccess et.c, vilket även är fallet med C++.

-------------------------
- Real programmers code in binary



main 21:55 - 13:e Mars 2007 | Post #17
Medlem
Inlägg: 40


Skicka PM
ozamosi: Det stämmer faktiskt inte att conio.h är ovanlig. Den följer med flera vanliga kompilatorer. Sen är det upp till programmeraren att hålla reda på vilka bibliotek som fungerar till vilket OS.

En lista över några:
Borland C
C-Free
Dev-Cpp
Pelles C
Tiny C
Watcom C/C++
MS VC++

-------------------------
- Real programmers code in binary

Senast redigerad 21:57 - 13:e Mars 2007


ozamosi 22:06 - 13:e Mars 2007 | Post #18
Administratör
Inlägg: 1129


Skicka PM
Borland: Wintendo
C-Free: inte en kompilator, utan en IDE. Har conio.h i de fall kompilatorn har den, antar jag...
Dev-Cpp: 1) Wintendo 2) Du rekomenderas undvika den, och " Please note that conio support is far from perfect"
Pelles C: Wintendo
Tiny C: Ok, den köper jag. Har dock aldrig hört talas om den.
Watcom: ser ut att vara Wintendo (ok, OS/2 också - vem bryr sig om det?)
MS VC++: Wintendo

Dessutom ser ju conio.h inte likadan ut på alla dessa kompilatorer...

-------------------------
Ljusblå



main 23:24 - 13:e Mars 2007 | Post #19
Medlem
Inlägg: 40


Skicka PM
Nej, det är sant. Men åter igen, det är upp till programmeraren att veta vilka bibliotek/funktioner et.c. som fungerar till det OS han eller hon utvecklar till.
Ibland skriver jag Linuxprogram i windows t.ex. Det omvända går också, men är antagligen ett brott mot mänskligheten, eller räknas som "förberedelse till allmänfarlig ödeläggelse". Smiley

-------------------------
- Real programmers code in binary



derfian 01:34 - 14:e Mars 2007 | Post #20
Medlem
Inlägg: 149


Skicka PM
Citat av main:
I sådana fall skulle du inte säga att C-kod inte är kompatibel med C++-kompilatorer. C++ är bakåtkompatibel med C, vissa C++-kompilatorer översätter till och med kod till C och kompilerar den sedan.

C++ är INTE bakåtkompatibelt med C.
http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B

En sak till, C _är_ C++, men inte alltid tvärt om (du vet nog vilka skillnader jag menar)...

Du glömmer bort sådana saker som klasser och polymorfism... bland annat.

Jag vill inte att han ska koda C++, men jag råder honom att använda standard ut- och inmatningsfunktionerna i C, mest för att de är snyggare, men också för att koden blir mer kompakt, och exekverar snabbare. Men, självklart får man göra som man vill.


Visst, det är olyckligt att man har blandat ihop strömoperatorerna med bitvis shift, men faktum kvarstår, att använda strömmarna ger kompaktare kod. Jag hävdar dessutom att det är snyggare, av bättre orsaker än dina: en ström kan vara stdout, en fil, stdin, i stort sett vad som helst. Det ser fortfarande likadant ut när man skriver och läser till och från strömmen. Inga fprintf etc. Enhetligt. Snyggt.
  1.  
  2. printf("%s",variabel);
  3. sscanf("%s",&variabel);
  4.  
  5. ström >> variabel;
  6. ström << variabel;

Och att dem exekverar snabbare? Hahaha, det kan man ju titta på när man verkligen har något som är prestandakritiskt...

Till sist: jag skulle hävda att skriva Windowsmjukvara i Linux är önskvärt i förhållande till att utveckla Linuxmjukvara på Windows. Det sistnämnda är ju fel på alla viktiga sätt.




main 05:25 - 14:e Mars 2007 | Post #21
Medlem
Inlägg: 40


Skicka PM
Läs igen.

"C code is often developed with C++ IDEs, integrated with C++ code, and compiled in C++ compilers. While most C source code will compile as C++ code without any changes, certain language differences prevent C++ from being a strict superset of C."


Med de orden menas det att C++ är bakåtkompatibelt med en del undantag, inte att C-kod inte är godtagbar under C++. Läs vilken C/C++ bok som helst så står det att C-kod skall med få eller inga modifieringar gå att kompilera under C++. Jag har för tillfället 6 C++-böcker (referens).

Dessutom är ju minst hälften av alla exempel i den där artikeln "nybörjarfel", och inte kompabilitetsproblem. En bra programmerare vet dessutom dessa ting.

-------------------------
- Real programmers code in binary



derfian 11:34 - 14:e Mars 2007 | Post #22
Medlem
Inlägg: 149


Skicka PM
    Citat av main:
Läs igen.
"C code is often developed with C++ IDEs, integrated with C++ code, and compiled in C++ compilers. While most C source code will compile as C++ code without any changes, certain language differences prevent C++ from being a strict superset of C."

Med de orden menas det att C++ är bakåtkompatibelt med en del undantag, inte att C-kod inte är godtagbar under C++. Läs vilken C/C++ bok som helst så står det att C-kod skall med få eller inga modifieringar gå att kompilera under C++. Jag har för tillfället 6 C++-böcker (referens).


Det visar att delar av C++ fungerar på samma vis som C. Inte hela C++. Du kan inte påstå att C++ är bakåtkompatibelt med C för att delar av C++ är det.

Dessutom är ju minst hälften av alla exempel i den där artikeln "nybörjarfel", och inte kompabilitetsproblem. En bra programmerare vet dessutom dessa ting.


Hur är det ett nybörjarfel att språken skiljer sig åt?

Om du vill läsa på mer på hur språken faktiskt skiljer sig åt, läs här: http://david.tribble.com/text/cdiffs.htm#intro




main 14:16 - 14:e Mars 2007 | Post #23
Medlem
Inlägg: 40


Skicka PM
Snälla, läs godtycklig bok om C/C++. Dålig eller bra, känd eller okänd. Jag kan citera om du vill. Wikipedia säger egentligen det som är fallet, att C-kod fungerar under C++ med vissa modifieringar. ...ter igen, det är programmerarens roll i sammanhanget att veta vilka skillnader som gäller.
Att du inte kommer från C från början kan inte jag däremot inte göra så mycket åt. Sen har vare sig du eller jag behörighet att bestämma att språken skiljer sig åt, men det har ISO och ANSI.
Alla programmerare jag talat med (och jag har programmerat ett tag) är av denna uppfattning.

-------------------------
- Real programmers code in binary



derfian 16:29 - 14:e Mars 2007 | Post #24
Medlem
Inlägg: 149


Skicka PM
Citera gärna.

"med vissa modifieringar" innebär att språken EJ är helt kompatibla (notera att ett subset av de båda språken är det, det har jag aldrig förnekat).

Suck. Specifikationerna för språken skiljer sig åt. Språken skiljer sig åt.

För övrigt, vad har det för betydelse om jag har börjat med C eller C++? Hur vet du vad jag kan och inte kan? Vad är din poäng?




NetNinja 18:18 - 14:e Mars 2007 | Post #25
Medlem
Inlägg: 116


Skicka PM
<Tension Breaker>

Iallfall så från min synvinkel så säger ni samma sak bara det att ni har olika uppfattning av vad kompatibelt betyder.

Med andra ord tror jag detta är en terminologi tvist...

<End of Tension Breaker>

-------------------------



Senast redigerad 18:20 - 14:e Mars 2007


Sidor: 1 2

Forum huvudsida -> Programmering -> Felhantering med get() ?
Atom feed

Tråden är låst | Till toppen