Avatar billede satans_son Nybegynder
28. juni 2003 - 02:05 Der er 34 kommentarer

n00b - Hvorfor går den forbi mine "cin" sætninger?

Det er det største program jeg har lavet til dato... hvilket siger lidt om hvor meget jeg ved :D
Har på nuværende tidspunkt været programmør i ca 2 døgn...

problemet med den her kode er at den virker- og så alligevel ikke... jeg kan uden problemer compile den og åbne den... men det er kun de 3 første cin commands der bliver spurgt om ... de andre bliver bare sprunget over...
Nogen som ved hvorfor så må de meget gerne sige det ^^

#include <iostream.h>
#define yes 'yes'

int main ()
{
    int age;
    cout << "please name you're exact age: ";   
    cin >> age;
    int birthdate;
    cout << "please enter you're birthdate in the form: daymonthyear, for example: 160578: ";
    cin >> birthdate;
    char firstname;
    cout << "please enter you're first name(s): ";
    cin >> firstname;
    char lastname;
    cout << "please enter you're last name(s): ";
    cin >> lastname;
       
    char reply;
    cout << "Do you really mean that you're name is " << firstname << " " << lastname;
    cout << " and that you're birthdate is " << birthdate;
    cout << ", meaning that you're age is " << age;
    cout << "?\n";
    cout << "please answer, yes or no: ";
    cin >> reply;
                 
    if (reply == yes)
    {
      cout << "Well that's to bad...\n";
      cout << "That means that you're wanted by the United States authorities for\n";
      cout << " global terrorism, in association with Osama Bin-Laden.\n";
      cout << "At this very moment elite troups are making way towards the place\n";
      cout << " to which we have traced you're IP-address.\n";
      cout << "Do not attempt to respond as this is an automated process\n\n";
      cout << "                  Have a nice day.";
    }
    else
    {
      cout << "Please come back when you know who you are.\n\n";
      cout << "                  Have a nice day.";
    } 
       
    system("pause");
    return 0;
}
Avatar billede bertelbrander Novice
28. juni 2003 - 02:12 #1
Din #define yes er ikke rigtig, det burde være:
#define yes "yes"
Et navn kan normalt være mere end et tegn, så firstname etc. bør være:
char firstname[102];
Man kan ikke sammenligne et char array med en streng, så brug strcmp()
Avatar billede satans_son Nybegynder
28. juni 2003 - 02:20 #2
hvis jeg laver #define yes 'yes' om til "yes" fremkommer der en fejl under compileringen...
jeg er desuden bange for at jeg lige skal have en nærmere forklaring angående de [102] du har sat bag ved firstname... betyder det at der kan være 102 characters eller hvordan?
Avatar billede bertelbrander Novice
28. juni 2003 - 02:25 #3
Der kommer en fejl fordi du sammenligner en char (replay) med yes, men replay skal være 4 char's lang hvis brugeren skal kunne taste "yes", dvs replay skal være char replay[4];
Du kan så lave sammenligningen med if(!strcmp(replay, yes))
char whatever[102], betyder at whatever kan indeholde 101 karakterer og en nul terminering.
Avatar billede bertelbrander Novice
28. juni 2003 - 02:31 #4
Du kan også bruge en streng istedet for char whatever[102], f.ex:
#include <iostream>
#include <string>

int main(void)
{
  string name;
  cin >> name;
  cout << name << endl;
  if(name == "ole")
    cout << "IsOle" << endl;
  return 0;
}
Avatar billede satans_son Nybegynder
28. juni 2003 - 02:37 #5
jeg må se mig slået :D  ----
Thx for hjælpen men det er desværre det forkerte problem du har løst :-/
Hvis du compilerer programmet og kører det vil du sikkert bide mærke i at den kun spørger efter alder og fødselsdato... resten springer den lige så smukt hen over... hvilket gør programmet ret virkningsløst...
hvis du desuden har et fræk forslag til hvordan man kan skrive fødselsdatoen op ville det bare være guld...
Avatar billede bertelbrander Novice
28. juni 2003 - 02:47 #6
Den springer over fordi du taster mere end et tegn for navn inden du taster enter, og programmet forventer kun et tegn (en char).
Hvis du kun taster et tegn for first name og last name virker det (indtil din if(...)).
Avatar billede bertelbrander Novice
28. juni 2003 - 02:48 #7
Hvad mener du med "skrive fødselsdatoen op"?
Avatar billede bertelbrander Novice
28. juni 2003 - 02:51 #8
Den burde ikke springe over first name, med mindre du bruger mellemrum i birthdate.
Avatar billede satans_son Nybegynder
28. juni 2003 - 02:52 #9
har du prøvet at compile den? her hos mig kan jeg nemlig ikke nå at skrive noget... den går direkte ned så jeg efter at have tastet age og birthdate bare skal trykke på en vilkårlig tast og så er den skid slået :-/

det jeg mente med at skrive birthdate op er at hvis man bare skriver den ud i et bliver der en masse misforsåelser da det foreste "0" ikke bliver skrevet... ( 11283 ) <--- hvornår er han født? hvis du skriver med bindestreger bliver kun første led taget med og med punktumer bliver det et helt andet tal...
Avatar billede bertelbrander Novice
28. juni 2003 - 02:54 #10
please name you're exact age: 12
please enter you're birthdate in the form: daymonthyear, for example: 160578: 999999
please enter you're first name(s): u
please enter you're last name(s): p
Do you really mean that you're name is u p and that you're birthdate is 999999, meaning that you're age is 12?
please answer, yes or no: yes
Please come back when you know who you are.

pause: not found
                  Have a nice day.
Avatar billede satans_son Nybegynder
28. juni 2003 - 02:54 #11
det hele er skrevet op som ovenfor ... bortset fra at jeg har ændret de ting omkring yes som du sagde :P
Avatar billede bertelbrander Novice
28. juni 2003 - 02:58 #12
Kunne du poste den nye kode?
Hvilken compiler bruger du?
Avatar billede satans_son Nybegynder
28. juni 2003 - 03:01 #13
dev-c++ ... den nyeste jeg kunne finde på blodsheed... har fået den til at modtage mit navn nu..
please name you're exact age: 17
please enter you're birthdate in the form: .day.month.year, for example: .16.05.
78: 999999
please enter you're first name(s): a
please enter you're last name(s): b
Do you really mean that you're name is .½&#9524;w x&#9786;= and that you're birthdate is 999
999, meaning that you're age is 17?
please answer, yes or no: yes
Please come back when you know who you are.

                  Have a nice day.Tryk på en vilkårlig tast for at fortsætte .
. .. men den siger bare en masse tegn efterfølgende :S



#include <iostream.h>
#define yes "yes"

int main ()
{
    int age;
    cout << "please name you're exact age: ";   
    cin >> age;
    int birthdate;
    cout << "please enter you're birthdate in the form: .day.month.year, for example: .16.05.78: ";
    cin >> birthdate;
    char firstname[102];
    cout << "please enter you're first name(s): ";
    cin >> firstname;
    char lastname[102];
    cout << "please enter you're last name(s): ";
    cin >> lastname;
       
    char reply[4];
    cout << "Do you really mean that you're name is " << firstname << " " << lastname;
    cout << " and that you're birthdate is " << birthdate;
    cout << ", meaning that you're age is " << age;
    cout << "?\n";
    cout << "please answer, yes or no: ";
    cin >> reply;
                 
    if (reply == yes)
    {
      cout << "Well that's to bad...\n";
      cout << "That means that you're wanted by the United States authorities for\n";
      cout << " global terrorism, in association with Osama Bin-Laden.\n";
      cout << "At this very moment elite troups are making way towards the place\n";
      cout << " to which we have traced you're IP-address.\n";
      cout << "Do not attempt to respond as this is an automated process\n\n";
      cout << "                  Have a nice day.";
    }
    else
    {
      cout << "Please come back when you know who you are.\n\n";
      cout << "                  Have a nice day.";
    } 
       
    system("pause");
    return 0;
}
Avatar billede bertelbrander Novice
28. juni 2003 - 03:08 #14
Jeg rettede din if(...) til:
if (!strcmp(reply, yes))

Og kompilerede med gcc og fik:

please name you're exact age: 99
please enter you're birthdate in the form: .day.month.year, for example: .16.05.78: 999999
please enter you're first name(s): Peter
please enter you're last name(s): Hansen
Do you really mean that you're name is Peter Hansen and that you're birthdate is 999999, meaning that you're age is 99?
please answer, yes or no: yes
Well that's to bad...
That means that you're wanted by the United States authorities for
global terrorism, in association with Osama Bin-Laden.
At this very moment elite troups are making way towards the place
to which we have traced you're IP-address.
Do not attempt to respond as this is an automated process

pause: not found
                  Have a nice day.
Avatar billede satans_son Nybegynder
28. juni 2003 - 03:11 #15
jesh.. det ser jo meget godt ud :P
hvis du lige kan fortælle mig hva det er du har gjort egentligt, altså hvad der sker ved commandoen !strcmp ?
Avatar billede bertelbrander Novice
28. juni 2003 - 03:11 #16
Jeg ved ikke hvorfor den skriver .½&#9524;w x&#9786;= og ikke det rigtige navn (a b).
gcc er i mit tilfælde cygwin (der ikke vil køre kommandoen pause i system(...)).
Avatar billede bertelbrander Novice
28. juni 2003 - 03:13 #17
strcmp sammenligned to strenge (i dette tilfælde char array'et replay og strengen "yes") den returnerer 0 hvis de to strenge er ens.
Avatar billede bertelbrander Novice
28. juni 2003 - 03:14 #18
sammenligned -> sammenligner
Jeg skal vist til at i seng nu...
Avatar billede satans_son Nybegynder
28. juni 2003 - 03:20 #19
jeg vil utrolig gerne se din kode... hvis jeg indsætter !strcmp får jeg ni fejl når jeg forsøger at compile :-/
Avatar billede arne_v Ekspert
28. juni 2003 - 08:40 #20
Følgende kører hos mig:

#include <iostream>
#include <cstring>

using namespace std;

#define yes "yes"

int main ()
{
  int done = 0;
  do {
    int age;
    cout << "please name you're exact age: "; 
    cin >> age;
    char birthdate[9];
    cout << "please enter you're birthdate in the form: day.month.year, for example: 16.05.78: ";
    cin >> birthdate;
    char firstname[33];
    cout << "please enter you're first name(s): ";
    cin >> firstname;
    char lastname[33];
    cout << "please enter you're last name(s): ";
    cin >> lastname;

    cout << "are you sure ? please answer, yes or no: ";
    char reply[4];
    cin >> reply;
               
    if (strcmp(reply,yes)==0)
    {
      cout << "thanks" << endl;
      done = 1;
    }
    else
    {
      cout << "let us try again" << endl;
    }
  } while(!done);
     
  system("pause");
  return 0;
}
Avatar billede arne_v Ekspert
28. juni 2003 - 08:41 #21
[OK jeg ændrede også lidt på logikken, men det er ikke pointen]
Avatar billede Cars10 Praktikant
30. juni 2003 - 13:58 #22
#include <iostream.h>
#include <string.h>

int main ()
{
    int age;
    cout << "please name you're exact age: ";   
    cin >> age;
    int birthdate;
    cout << "please enter you're birthdate in the form: daymonthyear, for example: 160578: ";
    cin >> birthdate;
    char firstname;
    cout << "please enter you're first name(s): ";
    cin >> firstname;
    char lastname;
    cout << "please enter you're last name(s): ";
    cin >> lastname;
       
    char reply[3]={0};
    cout << "Do you really mean that you're name is " << firstname << " " << lastname;
    cout << " and that you're birthdate is " << birthdate;
    cout << ", meaning that you're age is " << age;
    cout << "?\n";
    cout << "please answer, yes or no: ";
    cin >> reply;
                 
    if (strcmp(reply,"yes"))
    {
      cout << "Well that's to bad...\n";
      cout << "That means that you're wanted by the United States authorities for\n";
      cout << " global terrorism, in association with Osama Bin-Laden.\n";
      cout << "At this very moment elite troups are making way towards the place\n";
      cout << " to which we have traced you're IP-address.\n";
      cout << "Do not attempt to respond as this is an automated process\n\n";
      cout << "                  Have a nice day.";
    }
    else
    {
      cout << "Please come back when you know who you are.\n\n";
      cout << "                  Have a nice day.";
    } 
       
    system("pause");
    return 0;
}

//Håber syntaxen er rigtig, har ikke lige nogen compiler her. Ellers marker strcmp og tryk F1.
Avatar billede segmose Nybegynder
30. juni 2003 - 14:26 #23
Hvad sker der egentlig hvis man indtaster "Idontthinkso" istedet for "yes"?
Avatar billede Cars10 Praktikant
30. juni 2003 - 14:26 #24
Firstname og lastname skal også lige rettes:
char firstname[80]={0};
char lastname[80]={0};
Avatar billede Cars10 Praktikant
30. juni 2003 - 14:27 #25
segmose så bliver det det sammen som "no"
Avatar billede Cars10 Praktikant
30. juni 2003 - 14:41 #26
Du mangler også lige at includere den til din system funktion:
#include <stdlib.h>
Avatar billede bertelbrander Novice
30. juni 2003 - 15:12 #27
>cars10, hvorfor mener du at du skal sætte firstname = {0} ? (samme for reply og lastname).
Det segmose vist mener er at man skriver ud over enden på reply hvis man skriver for mange tegn, hvilket kan have fatale konsekvenser. Løsningen er svjv at bruge cin.getline(...) eller string istedet for char whatever[...]
Avatar billede Cars10 Praktikant
30. juni 2003 - 15:44 #28
Så kan man da bare lave reply[80] også det er kun nogle få byte her. Hvad jeg mente var at i det svar jeg gav skulle være firstname[80] så det også er en streng og jeg sætte firstname[80]={0} så er vi sikre på afslutnings tegnet kommer med. Syntes bare det var nemmest.
Avatar billede segmose Nybegynder
30. juni 2003 - 15:47 #29
Bertel det er godt du kan skrive det på en mere forståelig måde end jeg kan! de der >> er vist dømt til at gå galt med ren 'char *'.
Avatar billede Cars10 Praktikant
30. juni 2003 - 15:56 #30
Hvis det skulle bruges mere seriøst var det nok en god ide :O)
Avatar billede bertelbrander Novice
30. juni 2003 - 19:57 #31
>cars10, jeg forstår ikke din begrundelse for at skrive "char firstname[80]={0};"
Avatar billede arne_v Ekspert
30. juni 2003 - 20:11 #32
Det må være fordi han ikke er helt sikker på at >> sætter
en afsluttende nul ind.
Avatar billede arne_v Ekspert
30. juni 2003 - 20:15 #33
Og hvis vi nu skal igang med at være krakilske, så er der jo også:

if (strcmp(reply,"yes"))

som næppe gør det den er tiltænkt.
Avatar billede Cars10 Praktikant
01. juli 2003 - 09:01 #34
bertelbrander det betyder intet her.
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





White paper
Tidsbegrænset kampagne: Overvejer du at udskifte eller tilføje printere i din forretning? Vi kan tilbyde én eller flere maskiner gratis