Avatar billede ttn- Nybegynder
22. juli 2003 - 12:08 Der er 49 kommentarer og
1 løsning

Problemer med while løkke til lommeregner

#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
//Starter scriptet
int main()
{
int tal;
  // Lige noget tekst så folk fatter hvad de skal vælge ;)!
  cout << "Skriv disse tal for diverse funktioner\n";
  cout << "1. For at plusse\n";
  cout << "2. For at minusse\n";
  cout << "3. for at gange\n";
  cout << "4. for at dividerer\n\n";
  do
  { cout << "Skriv saa det tal for hvilken funktion du vil bruge: "; 
    cin >> tal;
  } while( strcmp(tal) <=4)
  // Her starter min swticher
  switch(tal)         
  {
    // Case 1 som er plus ;)
    case 1:
    // Variablerne
    // Og hvor koden skal have inputsne
    // Og som den så regner ud
    // Det er her der skal være en while løkke
    // Så man kan skifte til næste case
    // Og enten dividerer, gange eller trække fra
    // Eller prøve igen
      float forstetal, andettal;
        cout << "Skriv forste tal: ";
        cin >> forstetal;
        cout << "Skriv andet tal: ";
        cin >> andettal;
        cout << "\n";
       
        cout << forstetal << "+" << andettal << " er " << forstetal+andettal;
    break;

    default:
    cout << "ugyldig vaerdi";
  }
}
  return 0;
}
// Programmeret af Mikael
// Alle rettigheder tilhører overstående ejer - må ikke kopieres, benyttes, gives videre
// uden tilladelse fra mig. Kontakt muligheder kan ses nedenunder
// Spørgsmål og kommentarer kan stilles på #TBA.CS på Quakenet
// Eller på min e-mailadresse: mom33@hotmail.com
// ttN`

Altså mit problem er at jeg gerne vil have en do while løkke(eller en anden while løkke), så man skal skrive et tal igen hvis man skriver et tal der er større end 4, og hvis man skriver 0

en der kan hjælpe med det?!

Det skal lige siges jeg har prøvet at lave en, så det kan man vidst se i koden ;)!
Avatar billede arne_v Ekspert
22. juli 2003 - 12:14 #1
Forslag:

do
{
    cout << "Skriv saa det tal for hvilken funktion du vil bruge: "; 
    cin >> tal;
} while( tal<1 || tal>4)
Avatar billede jpvj Nybegynder
22. juli 2003 - 12:15 #2
erstat
while(strcmp(tal) <=4)

med

while ((strcmp(tal)<=0) || (strcmp(tal)>4)) // lopper indtil tallet er 1,2,3 eller 4

så burde det virke.
Avatar billede jpk Nybegynder
22. juli 2003 - 12:15 #3
while(tal < 1 || tal > 4)
Avatar billede arne_v Ekspert
22. juli 2003 - 12:15 #4
logik:

spørg efter tal
lige så længe at tal er mindre end 1 eller større end 4
Avatar billede jpvj Nybegynder
22. juli 2003 - 12:16 #5
Er tal ikke en char?
Burde det så ikke hedde:

while(tal < '1' || tal > '4')

(eller hvordan det nu ser ud i c ... hmmmm... long time no c ...)
Avatar billede ttn- Nybegynder
22. juli 2003 - 12:19 #6
hvis man nu gerne vil have mulighed for at kunne skrive et nyt regnestykke, eller gå tilbage og vælge case, hvordan vil I så lave en while løkke?
Avatar billede ttn- Nybegynder
22. juli 2003 - 12:22 #7
jpvj nej det er nu en int :) for det andet er det der c++ :>
Avatar billede arne_v Ekspert
22. juli 2003 - 12:27 #8
Hvis du vil kunn elav eflere stykker så smid en ny løkke udenom:

char cont;

do
{
  // indsæt hele indmaden inkl. løkke og switch
  cout << "Vil du fortsætte (Y/N): ";
  cin >> cont;
} while(cont=='Y' || cont=='y');
Avatar billede ttn- Nybegynder
22. juli 2003 - 12:30 #9
Inde i casen, eller uden for switchen?
Avatar billede ttn- Nybegynder
22. juli 2003 - 12:40 #10
fatter nemlig ikke rigtig hvor det skal være...
Avatar billede arne_v Ekspert
22. juli 2003 - 12:43 #11
helt uden for.

do
{

  cout << "Skriv disse tal for diverse funktioner\n";
  cout << "1. For at plusse\n";
  cout << "2. For at minusse\n";
  cout << "3. for at gange\n";
  cout << "4. for at dividerer\n\n";
do
{
    cout << "Skriv saa det tal for hvilken funktion du vil bruge: "; 
    cin >> tal;
} while( tal<1 || tal>4)

  switch(tal)         
  {
    case 1:
      float forstetal, andettal;
        cout << "Skriv forste tal: ";
        cin >> forstetal;
        cout << "Skriv andet tal: ";
        cin >> andettal;
        cout << "\n";
     
        cout << forstetal << "+" << andettal << " er " << forstetal+andettal;
    break;

    default:
    cout << "ugyldig vaerdi";
    break;
  }


  cout << "Vil du fortsætte (Y/N): ";
  cin >> cont;
} while(cont=='Y' || cont=='y');
Avatar billede arne_v Ekspert
22. juli 2003 - 12:45 #12
En lille finesse du skal være opmærksom på:

  switch(tal)         
  {
    case 1:
      float forstetal, andettal;
       
kan ofte drille lidt med scope på de variable.

Jeg tror at du skal erklære dem lige ovenfor switch.
Avatar billede sovsekoder Nybegynder
22. juli 2003 - 12:45 #13
hvis du putter det ind i casen får du endnu en chance fat at lave et spændende plus-stykke..

hvis du putter det uden om switchen får du chancen for at vælge en ny regne operation! :-o
Avatar billede ttn- Nybegynder
22. juli 2003 - 12:47 #14
aaah, lige mig der ikke var vågen der!
Det script er delvist det jeg leder efter - men hvergang man har plusset osv, vil jeg gerne have at man kan blive ved med at plusse hvis det er det... og skift hurtigt til en anden case
Avatar billede segmose Nybegynder
22. juli 2003 - 12:54 #15
så skal du have en

float operant, resultat = 0;
cout << "indtast første tal";
cin >> resultat;

helt uden for løkkerne og så kun indtaste et tal inde i løkkerne.

og inde i switchen så

case 1: // her havde jeg nok valg at brug char, fx. '+', istedet.
cout << "Indtast tal der skal adderes";
cin >> operant;
resultat += operant; // pas på når du kommer til divider
cout << "resultat = " << resultat << endl;
break;
Avatar billede ttn- Nybegynder
22. juli 2003 - 12:57 #16
sådan! Nu virker det, tak forr hjælpen ;)
Avatar billede ttn- Nybegynder
22. juli 2003 - 12:58 #17
segmose... hvordan vil du lave casen til at blive valgt ved at skrive + ? Det vil jeg da gerne vide
Avatar billede arne_v Ekspert
22. juli 2003 - 13:00 #18
Se f.eks. http://www.eksperten.dk/spm/378229 21/07-2003 17:20:40
(det er lignings løsning, men det samme med hensyn til switchen).
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:02 #19
for det andet || betyder eller ikke ? :)
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:02 #20
for det andet || betyder eller, ikke? sådan skulle det være...
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:04 #21
for det andet, kan man ikke lave en include eller lign. så man ikke behøver at skrive do... while løkken hele tiden?
Avatar billede arne_v Ekspert
22. juli 2003 - 13:05 #22
|| = logisk eller
&& = logisk and
Avatar billede arne_v Ekspert
22. juli 2003 - 13:07 #23
Jeg vil betragte det som aldeles skrækkeligt at include noget med do while
eller while.

Det er jo netop hoved logikken i dit program. Og skal derfor ikke
skjules.

*MEN* det kunne være ganske pænt at lave nogle funktioner f.eks.
en funktion til at indlæse tal i et interval. Og så kunne du gemme
en løkke i den.
Avatar billede arne_v Ekspert
22. juli 2003 - 13:07 #24
Og så et svar.

:-)
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:09 #25
du får ikke mine point!!! :P det gør jeg eller noget...

ej, men hvad er et interval? kunne være sejt nok at vide :>
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:09 #26
medmindre du mener variablen int ? :)
Avatar billede jpvj Nybegynder
22. juli 2003 - 13:11 #27
ttn-> Tak for info.
Jeg *troede* at når man brugte cin så læste man bytes fra stdin. Jeg kan godt se, at tal er defineret som int, men hvad sker der, hvis man taster 'A'? Bliver int så ikke 65? ... eller fejler programmet?

JP
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:13 #28
men vil lige sige at jeg føler jeg er blevet stærkere på det med do... while løkker, fandme nice at få sådan nogle ting at vide... stærker ens viden :D
Avatar billede arne_v Ekspert
22. juli 2003 - 13:13 #29
Noget i stil med:

int get_from_interval(int low, int high, char *prompt)
{
  int res;
  do
  {
      cout << prompt;
      cin >> res;
  } while( res<low || res>high)
  return res;
}

og så kan du bare skrive:

int tal = get_from_interval(1, 4, "Indtast tal mellem 1 og 4");
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:14 #30
programmet fucker hvis du vil plusse to bogstaver, ja
Avatar billede segmose Nybegynder
22. juli 2003 - 13:14 #31
char funk;
cout << "Vælg funktion\n";
cout << "+ For at plusse\n";
cout << "- For at minusse\n";
cout << "* for at gange\n";
cout << "/ for at dividerer\n\n";

cout << "funktion: ";
cin >> funk;

switch(funk)       
  {
    case '+':
Avatar billede arne_v Ekspert
22. juli 2003 - 13:17 #32
jpvj>

cin og stdin er meget tæt beslægtet.

Hvis man angiber A som svar til at læse et tal ind til cin får man 0.
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:29 #33
nu har jeg så skiftet til at kunne bruge tegn - men hvordan laver jeg så min while løkke til kun at tage imod + - * og / ?
Avatar billede arne_v Ekspert
22. juli 2003 - 13:35 #34
Primitiv løsning:

do
{
} while(funk!='+' && funk!='-' && funk!='*' && funk!='/');
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:39 #35
den kunne jeg sgu have lavet selv hvis jeg bare var lidt smartere og kigge op ad og læse det du skrev med logisk and ;)
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:40 #36
en der kan se nogle fejl i den her kode:

// Include files
#include <iostream>
#include <string>
#include <windows.h>
// Så jeg ikke behøver at skrive std:::
using namespace std;
//Starter scriptet
int main()
{
// Sætter variablen cont
// Og do gør sådan at brugeren har valget
// Mellem at kunne fortsætte
// Eller lade programmet afslutte
char cont;
do
{
  // indsæt hele indmaden inkl. løkke og switch
char tegn;
  // Lige noget tekst så folk fatter hvad de skal vælge ;)!
  cout << "Skriv disse tal for diverse funktioner\n";
  cout << "+ For at plusse\n";
  cout << "- For at minusse\n";
  cout << "* for at gange\n";
  cout << "/ for at dividerer\n\n";
// Gør lige sådan at man ikke kan vælge et tal der er højere end 4
// eller mindre end 1
do
{
    cout << "Skriv saa det tal for hvilken funktion du vil bruge: "; 
    cin >>tegn;
// Tjekker om tallene er rigtige
// Hvis man skriver 0, eller et tal over 4
// Vil koden tage det forfra
// Indtil brugeren skriver et gyldigt tal
} while(tegn!='+' && funk!='-' && funk!='*' && funk!='/');
// Variablerne til alle de tal man kan få
// ved alle muligheder(pluse, minusse osv.)
float forstetal1, andettal1;
float forstetal2, andettal2;
  // Her starter min swticher
  switch(tegn)         
  {
    // Case 1 som er plus ;)
    case +:
    // Gør så man kan blive ved med at plusse
        do
{        // Programmet skal lige have de tal brugeren skal regne ud
          cout << "Skriv forste tal: ";
          cin >> forstetal1;
          cout << "Skriv andet tal: ";
          cin >> andettal1;
          cout << "\n";
          // Her regner programmet ud hvad de to tal bliver
          cout << forstetal1 << "+" << andettal1 << " er " << forstetal1+andettal1;
          // Mulighed for at fortsætte med at plusse
          cout << "\n\nVil du fortsaette med at plusse?(Y/N): ";
          cin >> cont;
      // Gør at man både kan skrive y og Y som svar ;)!
}      while(cont=='Y' || cont=='y');
      // Hvis N, så kommer breaket, og man ryger ud af casen og switchen)
      break;
    // Case 2 som er minusse
    case -:
    // Gør så man kan blive ved med at plusse
        do
{        // Programmet skal lige have de tal brugeren skal regne ud
          cout << "Skriv forste tal: ";
          cin >> forstetal2;
          cout << "Skriv andet tal: ";
          cin >> andettal2;
          cout << "\n";
          // Her regner programmet ud hvad de to tal bliver
          cout << forstetal2 << "-" << andettal2 << " er " << forstetal2-andettal2;
          // Mulighed for at fortsætte med at plusse
          cout << "\n\nVil du fortsaette med at minusse?(Y/N): ";
          cin >> cont;
      // Gør at man både kan skrive y og Y som svar ;)!
}      while(cont=='Y' || cont=='y');
      // Hvis N, så kommer breaket, og man ryger ud af casen og switchen)
      break;
  }
  // Spørger om brugeren vil fortsætte med at regne i en
  cout << "\n\nVil du vaelge paa ny om du vil plusse, minusse osv?(Y/N): ";
  cin >> cont;
  cout << "\n\n";
  // Gør sådan at man både kan skrive y og Y som svar ;)!
} while(cont=='Y' || cont=='y');
  // Afslutningshilsen
  cout << "Ok, vi ses maaske igen!!!";
  return 0;
}
// Programmeret af Mikael
// Alle rettigheder tilhører overstående ejer - må ikke kopieres, benyttes, gives videre
// uden tilladelse fra mig. Kontakt muligheder kan ses nedenunder
// Spørgsmål og kommentarer kan stilles på #TBA.CS på Quakenet
// Eller på min e-mailadresse: mom33@hotmail.com
// ttN`
Avatar billede arne_v Ekspert
22. juli 2003 - 13:41 #37
Følgende burde også virke og er nok lidt nemmere at vedligeholde (men sværere
at gennsmkue):

do
{
} while(strchr("+-*/",funk) != NULL);
Avatar billede arne_v Ekspert
22. juli 2003 - 13:43 #38
Du har ikke konsekvent rettet fra funk til tegn.
Avatar billede arne_v Ekspert
22. juli 2003 - 13:44 #39
Det er:
  case '+':
ikke:
  case +:
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:45 #40
Ok, nu fik jeg rettet et par fejl, men hvergang jeg nu dskriver +, så skriver den at jeg skal skrive det igen... så det virker ikke så godt :|
Avatar billede arne_v Ekspert
22. juli 2003 - 13:45 #41
Men så ser det ud til at virke:

Skriv disse tal for diverse funktioner
+ For at plusse
- For at minusse
* for at gange
/ for at dividerer

Skriv saa det tal for hvilken funktion du vil bruge: +
Skriv forste tal: 12
Skriv andet tal: 13

12+13 er 25

Vil du fortsaette med at plusse?(Y/N): n


Vil du vaelge paa ny om du vil plusse, minusse osv?(Y/N): n


Ok, vi ses maaske igen!!!
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:46 #42
ja, har rettet den der arne :)
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:48 #43
sådan, nu er lortet rettet, og fungerer perfekt :)
Avatar billede ttn- Nybegynder
22. juli 2003 - 13:49 #44
er der forresten en der kender en turorial til det der interval?
Avatar billede jpk Nybegynder
22. juli 2003 - 13:52 #45
Du kunne jo overveje at udskifte:
'plusse' med 'addere' og 'minusse' med 'subtrahere'...
Avatar billede arne_v Ekspert
22. juli 2003 - 13:54 #46
Du tænker på min get_from_interval funktion ?

Funktioner må være beskrevet i din bog.

Den specifikke brug tror jeg ikke der er tutorials omkring.
Avatar billede ttn- Nybegynder
22. juli 2003 - 14:03 #47
tjaaa, skal i hvert fald til at læse dine tutorials fra igår, så jeg har arrays og strings på plads - og char arrays og hvad fanden det hedder ;)

Jeg kender dog lidt til det, fra dengang jeg pillede med ASP, så svært bliver det nok ikke
Avatar billede jpvj Nybegynder
22. juli 2003 - 16:28 #48
ttn-> Tak for genoptræning! c you later :-)
Avatar billede ttn- Nybegynder
22. juli 2003 - 17:19 #49
:D
Avatar billede arne_v Ekspert
18. august 2003 - 23:54 #50
ttn>

Tid at lukke spørgsmålet ?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester