|
| TurboC++ input problem Fra : Martin |
Dato : 09-07-04 15:10 |
|
Jeg har et problem med at få mit program til at genkende et input fra
brugeren. Der skal gives et tal til en variabel, som defineres med en
if-sætning alt efter hvad for en farve der skrives (med bogstaver).
Sort 0, brun 1 mm., det er en konverter af modstandes farver til ohm-værdi.
Jeg har lavet noget af det, men jeg tror der mangler en line med f.eks.
atoi(f1,m1) i ring 1 og atoi(f2,m2) til ring 2 og ligeså 3, men det fik jeg
ikke til at virke.
Det er kun sat til at skrive udkastet foreløbig, så jeg kan se det er
opfanget, den skriver ikke variablen men (null) eller intet.
Scriptet kan hentes her http://htmltips.dk/ohmslov.cpp søg efter case 'm'
eller linie 1300.
Mvh.
Martin
| |
Lasse Westh-Nielsen (09-07-2004)
| Kommentar Fra : Lasse Westh-Nielsen |
Dato : 09-07-04 19:04 |
|
"Martin" <mf_NO_Spima@digginet.dk> wrote:
> Jeg har et problem med at få mit program til at genkende et input fra
brugeren.
Ja. Dit problem er de her sammenligninger:
....
scanf("%s",&m1);
if (m1=="sort") f1=0;
....
Du indlæser en streng og laver en sammenligning - men den sammenligning du
laver med == sammenligner ikke værdierne af de to strenge, men i stedet
deres adresser. Og de er altid forskellige.
Brug istedet strcmp:
#include <string.h>
....
scanf("%s",&m1);
if (strcmp(m1, "sort") == 0) f1=0;
....
--
Lasse Westh-Nielsen
lasse@daimi.au.dk
| |
Martin (09-07-2004)
| Kommentar Fra : Martin |
Dato : 09-07-04 22:30 |
|
"Lasse Westh-Nielsen" <lasse@daimi.au.dk> skrev i en meddelelse
news:40eede4b$0$23874$14726298@news.sunsite.dk...
> "Martin" <mf_NO_Spima@digginet.dk> wrote:
>
> > Jeg har et problem med at få mit program til at genkende et input fra
> brugeren.
>
> Ja. Dit problem er de her sammenligninger...............
<snip>:
Lasse Westh-Nielsen
lasse@daimi.au.dk
Mange tak, det virker !
Lige to mere, hvis du vil:
Men hvad nu, når jeg har 2 variabler bestående af f1=2 og f2=5 og gerne vil
have tallet 25 i en og samme variabel?
Hvordan skriver man 2 i fjerde potens (2*2*2*2) når der kun haves to tal?
2^4 men kan man det i editoren, noget med at taste ascii værdien?
Mvh.
Martin
| |
Lasse Westh-Nielsen (09-07-2004)
| Kommentar Fra : Lasse Westh-Nielsen |
Dato : 09-07-04 22:44 |
|
"Martin" <mf_NO_Spima@digginet.dk> wrote:
> Men hvad nu, når jeg har 2 variabler bestående af f1=2 og f2=5 og gerne
vil
> have tallet 25 i en og samme variabel?
int a = 2;
int b = 5;
int c = 10*a + b; // c = 25
eller mener du concatenering af strenge? brug strcat!
#include <string.h>
char* s1 = "hello";
char* s2 = "world";
char* s3 = strcat(s1, s2); /* s3 = "helloworld" */
man skal dog nok vist sørge for der er plads i s1 til de ekstra
karakterer...
#include <string.h>
char s1[1000];
char* s2 = "world";
strcpy(s1, "hello");
strcat(s1, s2); // s1 = "helloworld"
sådan noget lignende, det står i Kernighan & Ritchie, side 249.
> Hvordan skriver man 2 i fjerde potens (2*2*2*2) når der kun haves to tal?
> 2^4 men kan man det i editoren, noget med at taste ascii værdien?
Det sidste forstod jeg ikke helt, hvad er du ude på?
Mvh Lasse
--
Lasse Westh-Nielsen
lasse@daimi.au.dk
| |
Martin (10-07-2004)
| Kommentar Fra : Martin |
Dato : 10-07-04 00:01 |
|
"Lasse Westh-Nielsen" <lasse@daimi.au.dk> skrev i en meddelelse
news:40ef11fc$0$23873$14726298@news.sunsite.dk...
> "Martin" <mf_NO_Spima@digginet.dk> wrote:
>
> > Men hvad nu, når jeg har 2 variabler bestående af f1=2 og f2=5 og gerne
> vil
> > have tallet 25 i en og samme variabel?
>
> int a = 2;
> int b = 5;
> int c = 10*a + b; // c = 25
>
> eller mener du concatenering af strenge? brug strcat!
>
> #include <string.h>
>
> char* s1 = "hello";
> char* s2 = "world";
> char* s3 = strcat(s1, s2); /* s3 = "helloworld" */
>
> man skal dog nok vist sørge for der er plads i s1 til de ekstra
> karakterer...
>
> #include <string.h>
>
> char s1[1000];
> char* s2 = "world";
> strcpy(s1, "hello");
> strcat(s1, s2); // s1 = "helloworld"
>
> sådan noget lignende, det står i Kernighan & Ritchie, side 249.
*********
(jeg har en bog af Finn Elvekjær)
Vores kode fra før:
scanf("%s",&m1);
if (strcmp(m1, "sort") == 0) f1=0;
osv. med farver.
og
scanf("%s",&m1);
if (strcmp(m2, "sort") == 0) f2=0;
osv. med farver
ok. jeg afvikler programmet og siger roed og groen og der returneres
værdien 2 til variablen f1, værdien 5 til f2.
Det første eksempel med a, b og c virker ikke umiddelbart, den kan ikke lide
scanf("%s",&m1);
if (strcmp(m1, "sort") == 0) int f1=0; /* jeg puttede INT ind her*/
int f5 = 10*f1 + f2; /* f5 = 25 */ jeg forstår ikke helt at den kan det på
denne kommando, men hvis du siger det så må det være rigtigt. */
Det andet eksempel med strcat er til karakterer og ikke tal?
mvh.
Martin
| |
Martin (10-07-2004)
| Kommentar Fra : Martin |
Dato : 10-07-04 14:12 |
|
Hej Lasse
Tak for hjælpen.
Jeg har fået det hele til at virke. Jeg må have været træt i aftes, men jeg
skulle lige sætte parantesen, så kunne jeg se det.
(10*f1)+f2=f6
Mvh.
Martin
| |
Martin (10-07-2004)
| Kommentar Fra : Martin |
Dato : 10-07-04 20:36 |
|
Der skal udføres noget hvis det indtastede er på kun ét ciffer,
men hvad skal oversætte det til et 1-tal i variablen "laengde"?
Der vises i øjeblikket (null).
scanf("%f",&m1);
laengde = strlen(m1);
if (laengde==1)
udfør noget her....
Mvh.
Martin
| |
Bertel Brander (10-07-2004)
| Kommentar Fra : Bertel Brander |
Dato : 10-07-04 22:49 |
|
Martin wrote:
> Der skal udføres noget hvis det indtastede er på kun ét ciffer,
> men hvad skal oversætte det til et 1-tal i variablen "laengde"?
> Der vises i øjeblikket (null).
>
> scanf("%f",&m1);
> laengde = strlen(m1);
> if (laengde==1)
> udfør noget her....
>
Jeg forstår vist ikke spørgsmålet.
Hvad er det der viser (null) ?
Er m1 en char * eller et char array eller er det en float?
Hvis det er en char * eller et array kan du ikke
bruge scanf("%f",&m1); til at læse en float,
du skal bruge scanf("%s",m1); og konvertere
den til en float bagefter med strtod.
Hvis m1 er en float kan du ikke bruge strlen
til den.
/b
| |
Martin (10-07-2004)
| Kommentar Fra : Martin |
Dato : 10-07-04 23:50 |
|
ok her er hele case n
Det virker som om den ikke får fat i at værdien af laengde er 1, hvis der
tastes et ciffer ind, eller 2 hvis tastes 10-99
Med den her <laengde = strlen(m1);> skulle der gerne være en værdi i
"laengde".
Lige nu er den sat til en char.
Jeg prøver med scanf("%s",m1); og konvertere
den til en float bagefter med strtod.
float f1=0,f2=0,f3=0,f4=0,f5=0,f6=0,f7=0,result=0,o1,o2,o3,o4;
char
x=5,y=1,h=70,v=25,i=0,ch=0,dkk=0,usa=0,tegn,navn[21],iu[10],ir[10],m1[6],m2[
6],m3[6],m4[6],p1,p2,p3,p4,p5,p6,p7,ingen[6],sort,soelv,guld,brun,roed,orang
e,gul,groen,blaa,lilla,graa,hvid,laengde;
case 'n': /**** modstandsv'rdi til farvekode ****/
/* clrscr(); */ /* ryd sk'rmen */
{ gotoxy(e+11,s+4);
cprintf("m: Konvert,r modstandsv'rdi til farvekode.");
gotoxy(e+12,s+5);
cprintf(" 4. ring er tolerance. ");
gotoxy(e,s+9);
cprintf("Indtast ohmv'rdi uden praefiks: ");
scanf("%f",&m1);
laengde = strlen(m1);
cprintf("%f",laengde);
if (laengde==1)
f2=sort;
f3=guld;
if (strcmp(m1, "0") ==0) f1=sort;
if (strcmp(m1, "1") ==0) f1=brun;
if (strcmp(m1, "2") ==0) f1=roed;
if (strcmp(m1, "3") ==0) f1=orange;
if (strcmp(m1, "4") ==0) f1=gul;
if (strcmp(m1, "5") ==0) f1=groen;
if (strcmp(m1, "6") ==0) f1=blaa;
if (strcmp(m1, "7") ==0) f1=lilla;
if (strcmp(m1, "8") ==0) f1=graa;
if (strcmp(m1, "9") ==0) f1=hvid;
gotoxy(e,s+10);
cprintf("Indtast tolerance: ");
scanf("%f",&o2);
if (o2==0) f4=sort;
if (o2==1) f4=brun;
if (o2==2) f4=roed;
if (o2==0.5) f4=groen;
if (o2==0.25) f4=blaa;
if (o2==0.1) f4=lilla;
if (o2==0.05) f4=graa;
if (o2==10) f4=soelv;
if (o2==0.05) f4=guld;
gotoxy(e,s+14);
cprintf("Farvekoden er : %s %s %s %s ",f1,f2,f3,f4);
textcolor(RED);
gotoxy(e,s+19);
cprintf("Tryk en tast for hovedmenu.");
gotoxy(e,s+20);
cprintf("ESCAPE 1 gang for at afslutte, og");
gotoxy(e,s+21);
cprintf("ESCAPE 2 gange fra hovedmenuen.");
textcolor(WHITE);
flushall(); /* Maa ikke tages vaek */
break;
Mvh.
Martin
>
| |
Bertel Brander (11-07-2004)
| Kommentar Fra : Bertel Brander |
Dato : 11-07-04 00:10 |
|
Martin wrote:
> scanf("%f",&m1);
> laengde = strlen(m1);
> cprintf("%f",laengde);
> if (laengde==1)
>
> f2=sort;
> f3=guld;
> if (strcmp(m1, "0") ==0) f1=sort;
> if (strcmp(m1, "1") ==0) f1=brun;
> if (strcmp(m1, "2") ==0) f1=roed;
> if (strcmp(m1, "3") ==0) f1=orange;
> if (strcmp(m1, "4") ==0) f1=gul;
> if (strcmp(m1, "5") ==0) f1=groen;
> if (strcmp(m1, "6") ==0) f1=blaa;
> if (strcmp(m1, "7") ==0) f1=lilla;
> if (strcmp(m1, "8") ==0) f1=graa;
> if (strcmp(m1, "9") ==0) f1=hvid;
Jeg tror du skal lave m1 om til at være et array af char's:
char m1[123];
Og læse den med:
scanf("%s", m1);
I cprintf("%f", laengde); skal du bruge %d, da jeg
går ud fra at laengde er en int (og ikke en float
eller double).
Jeg tror at du skal have et par {} efter if(laengde==1),
Jeg er dog ikke sikker på hvor den skal ende.
/b
| |
Martin (11-07-2004)
| Kommentar Fra : Martin |
Dato : 11-07-04 00:38 |
|
Det kan jeg godt se, det kan være jeg kommer til at vende tilbage til det,
men jeg fik lige lavet noget her som næsten virker.
Men når man taster et tal, er input og værdi altid ens, hvorfor det?
Jeg skal bruge antal pladser brugt til det indtastede tal , og tallet selv.
Derfor virker det næste ikke, tror jeg.
float f1=0,f2=0,f3=0,f4=0,f5=0,f6=0,f7=0,result=0,o1,o2,o3,o4;
char
x=5,y=1,h=70,v=25,i=0,ch=0,dkk=0,usa=0,tegn,navn[21],iu[10],ir[10],m1[6],m2[
6],m3[6],m4[6],p1,p2,p3,p4,p5,p6,p7,ingen[6],sort,soelv,guld,brun,roed,orang
e,gul,groen,blaa,lilla,graa,hvid,laengde;
char input[80], *endptr;
double value;
og så i main linie 1400 :
case 'n': /**** modstandsværdi til farvekode ****/
/* clrscr(); */ /* ryd sk'rmen */
{ gotoxy(e+11,s+4);
cprintf("m: Konverter modstandsværdi til farvekode.");
gotoxy(e+12,s+5);
cprintf(" 4. ring er tolerance. ");
gotoxy(e,s+9);
cprintf("Indtast ohmværdi uden praefiks: ");
gets(input);
value = strtod(input, &endptr);
gotoxy(e,s+11);
printf("Strengen er %s tallet er %.1f\n", input, value); /* input og value
er altid ens??
if (input=="1")
{
f2=sort;
f3=guld;
}
if (value==0) f1=sort;
if (value==1) f1=brun;
if (value==2) f1=roed;
if (value==3) f1=orange;
if (value==4) f1=gul;
if (value==5) f1=groen;
if (value==6) f1=blaa;
if (value==7) f1=lilla;
if (value==8) f1=graa;
if (value==9) f1=hvid;
gotoxy(e,s+10);
cprintf("Indtast tolerance: ");
scanf("%f",&o2);
if (o2==0) f4=sort;
if (o2==1) f4=brun;
if (o2==2) f4=roed;
if (o2==0.5) f4=groen;
if (o2==0.25) f4=blaa;
if (o2==0.1) f4=lilla;
if (o2==0.05) f4=graa;
if (o2==10) f4=soelv;
if (o2==0.05) f4=guld;
gotoxy(e,s+14);
cprintf("Farvekoden er : %s %s %s %s",f1,f2,f3,f4);
textcolor(RED);
gotoxy(e,s+19);
cprintf("Tryk en tast for hovedmenu.");
gotoxy(e,s+20);
cprintf("ESCAPE 1 gang for at afslutte, og");
gotoxy(e,s+21);
cprintf("ESCAPE 2 gange fra hovedmenuen.");
textcolor(WHITE);
flushall(); /* Maa ikke tages vaek */
break;
Mvh.
Martin
| |
Bertel Brander (11-07-2004)
| Kommentar Fra : Bertel Brander |
Dato : 11-07-04 00:53 |
|
Martin wrote:
> Men når man taster et tal, er input og værdi altid ens, hvorfor det?
Det skulle de også gerne være.
> Jeg skal bruge antal pladser brugt til det indtastede tal , og tallet selv.
Antal pladser findes ved at bruge strlen, tallet selv findes med strtod.
> gets(input);
gets() er farlig, brug fgets(intput, sizeof(input), stdin);
> value = strtod(input, &endptr);
Her sætter du netop value til at være det samme som input.
Input er en streng, og value er det samme som input i form af en
double, dvs værdien selv.
/b
| |
Martin (11-07-2004)
| Kommentar Fra : Martin |
Dato : 11-07-04 01:42 |
|
ok det gør den så nu, 2 forskellige tal og følger med hvis det er et større
tal, også i antal pladser.
Men jeg får en lvalue required hvis jeg rører ved de her
if (input=0) f1=sort;
Jeg skal vel konvertere igen lige efter den her testudprint med strengen og
tallet?
printf("Strengen er %s tallet er %.1f\n", input, value);
case 'n': /**** modstandsv'rdi til farvekode ****/
/* clrscr(); */ /* ryd sk'rmen */
{ gotoxy(e+11,s+4);
cprintf("m: Konvert,r modstandsv'rdi til farvekode.");
gotoxy(e+12,s+5);
cprintf(" 4. ring er tolerance. ");
gotoxy(e,s+9);
cprintf("Indtast ohmv'rdi uden praefiks: ");
gets(input);
value = strlen(input);
gotoxy(e,s+11);
printf("Strengen er %s tallet er %.1f\n", input, value);
if (value==1)
{
f2=sort;
f3=guld;
}
if (input=0) f1=sort;
if (input=1) f1=brun;
if (input==2) f1=roed;
if (input==3) f1=orange;
if (input==4) f1=gul;
if (input==5) f1=groen;
if (input==6) f1=blaa;
if (input==7) f1=lilla;
if (input==8) f1=graa;
if (input==9) f1=hvid;
"Bertel Brander" <bertel@post4.tele.dk> skrev i en meddelelse
news:40f080ce$0$225$edfadb0f@dread14.news.tele.dk...
> Martin wrote:
>
>
> > Men når man taster et tal, er input og værdi altid ens, hvorfor det?
>
> Det skulle de også gerne være.
>
> > Jeg skal bruge antal pladser brugt til det indtastede tal , og tallet
selv.
>
> Antal pladser findes ved at bruge strlen, tallet selv findes med strtod.
>
> > gets(input);
>
> gets() er farlig, brug fgets(intput, sizeof(input), stdin);
>
> > value = strtod(input, &endptr);
>
> Her sætter du netop value til at være det samme som input.
> Input er en streng, og value er det samme som input i form af en
> double, dvs værdien selv.
>
> /b
Mvh.
Martin
| |
Martin (11-07-2004)
| Kommentar Fra : Martin |
Dato : 11-07-04 17:20 |
|
Variablerne går igennem, men der kan være brug for en konvertering?.
float
f1=0,f2=0,f3=0,f4=0,f5=0,f6=0,f7=0,result=0,o1,o2,o3,o4,sort,soelv,guld,brun
,roed,orange,gul,groen,blaa,lilla,graa,hvid;
char
x=5,y=1,h=70,v=25,i=0,ch=0,dkk=0,usa=0,tegn,navn[21],iu[10],ir[10],m1[6],m2[
6],m3[6],m4[6],m5[6],m6[6],m7[6],p1,p2,p3,p4,p5,p6,p7,q1[6],q2[6],q3[6],q4[6
],q5[6],q6[6],q7[6],ingen[6],laengde;
char input[80], *endptr, inpat;
double value;
const char n1=1,n2=2,n3=3,n4=4,n5=5;
case 'n': /**** modstandsv'rdi til farvekode ****/
/* clrscr(); */ /* ryd sk'rmen */
{ gotoxy(e+11,s+4);
cprintf("m: Konvert,r modstandsv'rdi til farvekode.");
gotoxy(e+12,s+5);
cprintf(" 4. ring er tolerance. ");
gotoxy(e,s+9);
cprintf("Indtast ohmv'rdi uden praefiks: ");
gets(input);
value = strlen(input);
gotoxy(e,s+11);
printf("Indtastet tal er %s som fylder %.0f pladser",input,value);
if (value==1)
{
p2=sort;
p3=guld;
}
if (strcmp(input, "0") == 0) p1=sort;
if (strcmp(input, "1") ) p1=brun;
if (strcmp(input, "2") == 0) p1=roed;
if (strcmp(input, "3") == 0) p1=orange;
if (strcmp(input, "4") == 0) p1=gul;
if (strcmp(input, "5") == 0) p1=groen;
if (strcmp(input, "6") == 0) p1=blaa;
if (strcmp(input, "7") == 0) p1=lilla;
if (strcmp(input, "8") == 0) p1=graa;
if (strcmp(input, "9") == 0) p1=hvid;
gotoxy(e,s+10);
cprintf("Indtast tolerance: ");
gets(input);
gotoxy(e,s+12);
value = strtod(input, &endptr);
printf("Indtastet tolerance er %6.2f", value);
if (value==0) f4=sort;
if (value==1) p4=brun;
if (value==2) p4=roed;
if (value==0.5) p4=groen;
if (value==0.25) p4=blaa;
if (value==0.1) p4=lilla;
if (value==0.05) p4=graa;
if (value==10) p4=soelv;
if (value==0.05) p4=guld;
else
p4=soelv;
gotoxy(e,s+14);
cprintf("Farvekoden er : %s %s %s %s",p1,p2,p3,p4);
textcolor(RED);
gotoxy(e,s+19);
cprintf("Tryk en tast for hovedmenu.");
gotoxy(e,s+20);
cprintf("ESCAPE 1 gang for at afslutte, og");
gotoxy(e,s+21);
cprintf("ESCAPE 2 gange fra hovedmenuen.");
textcolor(WHITE);
flushall(); /* Maa ikke tages vaek */
break;
| |
Martin (12-07-2004)
| Kommentar Fra : Martin |
Dato : 12-07-04 17:07 |
|
"Bertel Brander" <bertel@post4.tele.dk> skrev i en meddelelse
news:40f080ce$0$225$edfadb0f@dread14.news.tele.dk...
> Martin wrote:
>
>
> > Men når man taster et tal, er input og værdi altid ens, hvorfor det?
>
> Det skulle de også gerne være.
>
> > Jeg skal bruge antal pladser brugt til det indtastede tal , og tallet
selv.
>
> Antal pladser findes ved at bruge strlen, tallet selv findes med strtod.
>
> > gets(input);
>
> gets() er farlig, brug fgets(intput, sizeof(input), stdin);
>
> > value = strtod(input, &endptr);
>
> Her sætter du netop value til at være det samme som input.
> Input er en streng, og value er det samme som input i form af en
> double, dvs værdien selv.
>
> /b
Okay, det lykkes igen. Det er noget af det første i tråden der blev skrevet,
strcpy (variabel, "farve").
Mvh.
Martin
| |
Per Abrahamsen (15-07-2004)
| Kommentar Fra : Per Abrahamsen |
Dato : 15-07-04 15:38 |
|
"Lasse Westh-Nielsen" <lasse@daimi.au.dk> writes:
> eller mener du concatenering af strenge? brug strcat!
>
> #include <string.h>
>
> char* s1 = "hello";
> char* s2 = "world";
> char* s3 = strcat(s1, s2); /* s3 = "helloworld" */
>
> man skal dog nok vist sørge for der er plads i s1 til de ekstra
> karakterer...
>
> #include <string.h>
>
> char s1[1000];
> char* s2 = "world";
> strcpy(s1, "hello");
> strcat(s1, s2); // s1 = "helloworld"
>
> sådan noget lignende, det står i Kernighan & Ritchie, side 249.
Siden der står C++ i emnelinien:
#include <string>
using namespace std;
// ...
string s1 = "hello";
string s2 = "world";
string s3 = s1 + s2;
Så slipper du for al det allokeringshalløj.
| |
Martin (15-07-2004)
| Kommentar Fra : Martin |
Dato : 15-07-04 19:44 |
|
"Per Abrahamsen" <abraham@dina.kvl.dk> skrev i en meddelelse
news:rj8ydl2v5o.fsf@sheridan.dina.kvl.dk...
> "Lasse Westh-Nielsen" <lasse@daimi.au.dk> writes:
>
> > eller mener du concatenering af strenge? brug strcat!
> >
> > #include <string.h>
> >
> > char* s1 = "hello";
> > char* s2 = "world";
> > char* s3 = strcat(s1, s2); /* s3 = "helloworld" */
> >
> > man skal dog nok vist sørge for der er plads i s1 til de ekstra
> > karakterer...
> >
> > #include <string.h>
> >
> > char s1[1000];
> > char* s2 = "world";
> > strcpy(s1, "hello");
> > strcat(s1, s2); // s1 = "helloworld"
> >
> > sådan noget lignende, det står i Kernighan & Ritchie, side 249.
>
> Siden der står C++ i emnelinien:
>
> #include <string>
> using namespace std;
>
> // ...
>
> string s1 = "hello";
> string s2 = "world";
> string s3 = s1 + s2;
>
> Så slipper du for al det allokeringshalløj.
string s3 = s1 + s2; Istedet for at bruge strcat?
ok. men jeg får kun brug for det når det indholder cifre.
mvh.
Martin
| |
|
|