PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Brauche Hilfe in C



shizo23
02.01.2007, 14:08
Hallo an alle,

für die Schule soll ich ein Projekt über die Ferien daheim schreiben und es bis zum 3 Januar, 20 Uhr per eMail an meinen Lehrer geschickt haben(sonst 6!). Ich habs einige male versucht aber i-wie check ich das doch nicht...

Wäre echt wichtig wenn mir jemand helfen würde, da diese Note sehr wichtig für das Probehalbjahr ist...

Ihr könnt mir auch im ICQ( 446227552) schreiben!


Hier mal die Aufgabe:

Aufgabe Scanner
Über Tastatur sollen Zeichen eingegeben werden. Das Programm soll ermitteln, ob es sich um die Eingabe einer Rechnung mit zwei Zahlen (Kommazahlen oder ganze Zahlen mit oder ohne Vorzeichen ) handelt. Falls es sich um eine Rechnung handelt wie z.B. 3,9-9 soll das Ergebnis ausgegeben werden. Falls es sich nicht um eine Rechnung handelt wie z.B. 3/+*x-soll "falsche Eingabe" ausgegeben werden.

Noch eine Bemerkung:
Wir dürfen nur "IF" verwenden.

Danke an alle die mir weiterhelfen bzw dies hier durchgelesen haben.
lg Shizo23

SIGINT
02.01.2007, 19:56
Hallo Shizo23,
hier bist du nicht bei www.wer-macht-meine-hausaufgaben.de.... so wird das wohl nix. Haettest du gezeigt, dass du schon ernsthaft versucht hast die Aufgabe zu loesen (z.B. durch deinen Quelltext), dann haetten dir wahrscheinlich einige bei Problemen geholfen. Und irgendwelche Ansaetze musst du haben, da der Lehrer dir sonst nicht die Aufgabe gegeben haette. Anderenfalls liegt die Vermutung nahe, dass du im Unterricht geschlafen hast und nun einen dummen suchst,der dir die Aufgabe loest.

Soviel von meiner Seite,
SIGINT

shizo23
02.01.2007, 20:53
Hallo Shizo23,
hier bist du nicht bei www.wer-macht-meine-hausaufgaben.de.... so wird das wohl nix. Haettest du gezeigt, dass du schon ernsthaft versucht hast die Aufgabe zu loesen (z.B. durch deinen Quelltext), dann haetten dir wahrscheinlich einige bei Problemen geholfen. Und irgendwelche Ansaetze musst du haben, da der Lehrer dir sonst nicht die Aufgabe gegeben haette. Anderenfalls liegt die Vermutung nahe, dass du im Unterricht geschlafen hast und nun einen dummen suchst,der dir die Aufgabe loest.

Soviel von meiner Seite,
SIGINT


nein nein so ist dass nicht ich habe es versucht hier der quelltext.
ich such mir keinen dummen der mir die hausi macht ich brauch nur ein bissle hilfe wie jeder mal. ich denk mal dass du nicht hier wärst wenn du gar keine hilfe brauchen würdest?!

Quellcode:
#include "stdafx.h"
#include <stdio.h>

int main(){

double z1;
double z2;
double erg;
double korrekt;
char r;


printf("Bitte geben Sie eine Zahl ein\n");
scanf("%lf", &z1);
fflush(stdin);

printf("Bitte geben Sie einen Rechenoperanten ein\n");
scanf("%c", &r);
fflush(stdin);

printf("Bitte geben Sie die eine Zahl ein\n");
scanf("%lf", &z2);
fflush(stdin);

if(!(z1==0||z1>0||z1<0)){
korrekt = '2';
}
if(z1=='+'){
korrekt='2';
}
if(!(z2==0||z2>0||z2<0)){
korrekt = '2';
}

if(!(r=='+'||r=='-'||r=='/'||r=='*')){
korrekt = '2';
}
if(r== '+'){
erg=(z1)+(z2);
korrekt = '1';
}
if(r== '-'){
erg=(z1)-(z2);
korrekt = '1';
}
if(r== '*'){
erg=(z1)*(z2);
korrekt = '1';
}
if(r== '/'){
erg=(z1)/(z2);
korrekt = '1';
}


if(korrekt=='1'){
printf("Das Ergebnis ist %f\n", erg);
}
if(korrekt=='2'){
printf("Falsche Eingabe\n");
}
scanf("%c");

return 0;
}

ManniMammut
03.01.2007, 00:14
Hi!

Die Aufgabe war also anscheinend soooooo wichtig, dass man sich einen Tag vor Abgabe um Hilfe bemüht...

Der Ansatz schaut aber schonmal gar nicht so schlecht aus.
Allerdings wirkt es wirklich, als hättest Du ein halbes Jahr nicht aufgepasst:
Schau Dir mal die Syntax einer simplen Variablen-Setzung an!! Zahlen-Variablen in Quotes zu schreiben, führt natürlich zu Fehlern.
Brauchst Du wirklich double? Oder reichen float auch? beachte, dass float das Formatzeichen %f und double das Zeichen %lf haben.
Ansonsten wäre der eleganteste Weg zu checken, ob eine Zahl eingegeben wurde, warscheinlich der, den Rückgabewert des scanf abzufragen.
Das ewige fflush kannst Du Dir auch sparen.
Du brauchst auch keine Klammern um einzelne Summanden machen. Das verhindert nur die Übersichtlichkeit.

Weiterhin wären wir Dir im Zuge der Lesbarkeit sehr dankbar, wenn Du Quelltext in code-Tags setzt, und ihn v.A. einrückst!

Ich empfehle dieses eBook (http://www.galileocomputing.de/openbook/c_von_a_bis_z/)! Damit schaffst Du das zweite Halbjahr vielleicht alleine.

Achja, so schaut ein schönes if-Statement aus:


if( ( variable1 == 42 ) && ( variable2 != 42 ) )
{
printf( "ich bin toll.\n" );
variable3 = 4242;
}
//Man kann die geschweiften Klammern übrigens weglassen, wenn nur eine Anweisung die Konsequenz des ifs ist (erhöht Kompaktheit und Übersichtlichkeit!)


Ich hoffe, mit diesen Anregungen kommst Du weiter.
Gruß, Manni

SIGINT
03.01.2007, 11:38
Hallo shizo23,
da du dich anscheinend (wider aller Erwartung) doch mit der Aufgabe beschäftigt hast hab ich mir auch mal was einfallen lassen. Man kann zwar noch viel verbessern, aber es läuft zumindest. Ich hab das Problem mit einer sog. Statemachine gelöst. Ich schau jedes eingegebene Zeichen einzelnd an und bestimme, ob es zum Operanden 1(2) , zum Vorzeichen oder zur Operation gehört. Dann bau ich mir die beiden Operanden aus den eingegebenen Zeichen zusammen und transformier die mit atof in ein double. Der große Vorteil dieser Methode ist, daß man die Rechnung in einer Zeile eingeben kann...



#include<stdio.h>
#include<stdlib.h>

typedef int STATE;
typedef enum {plus,minus,multiply,division} OPERATION;
typedef enum { false=0, true=1 } bool;
#define false 0
#define true 1

typedef struct{
OPERATION operation;
char op1_buffer[20];
char op2_buffer[20];
int op_pos;
STATE state;
} CONTEXT;

bool evaluate(CONTEXT*,char);

int main(void)
{
double op1;
double op2;
CONTEXT context;
context.op_pos=0;
context.state=1;
char input;

fflush(stdin);

do{
input=(char)fgetc(stdin);
}while(!evaluate(&context,input));
/* HIER MUSS NOCH WAS GEÄNDERT WERDEN... DAZU HATTE ICH ABER KEINE GUTE IDEE*/

op1=atof(context.op1_buffer);
op2=atof(context.op2_buffer);

printf("\nOperand1: %lf\nOperand2: %lf\n",op1,op2);

if(context.operation==plus){printf("Op1 + Op2 = %lf\n",op1+op2);}
if(context.operation==minus){printf("Op1 - Op2 = %lf\n",op1-op2);}
if(context.operation==multiply){printf("Op1 * Op2 = %lf\n",op1*op2);}
if(context.operation==division){printf("Op1 / Op2 = %lf\n",op1/op2);}


return 0;
}


bool evaluate(CONTEXT *handle,char input)
{
bool ready=false;

if(handle->state==1&&!ready)
{
if(input=='-')
{
handle->op1_buffer[handle->op_pos]='-';
handle->op_pos++;
handle->state=2;
ready=true;
}

if((input>='0'&&input<='9')||input=='.')
{
handle->op1_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=3;
ready=true;
}
}

if(handle->state==2&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op1_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=4;
ready=true;
}

}

if(handle->state==3&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op1_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=3;
ready=true;
}

if(input=='+')
{
handle->operation=plus;
handle->state=5;
ready=true;
}

if(input=='-')
{
handle->operation=minus;
handle->state=5;
ready=true;
}

if(input=='*')
{
handle->operation=multiply;
handle->state=5;
ready=true;
}

if(input=='/')
{
handle->operation=division;
handle->state=5;
ready=true;
}

}

if(handle->state==4&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op1_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=4;
ready=true;
}
if(input=='+')
{
handle->operation=plus;
handle->state=5;
ready=true;
}

if(input=='-')
{
handle->operation=minus;
handle->state=5;
ready=true;
}

if(input=='*')
{
handle->operation=multiply;
handle->state=5;
ready=true;
}

if(input=='/')
{
handle->operation=division;
handle->state=5;
ready=true;
}

}

if(handle->state==5&&!ready)
{
if(input!=' '){
handle->op1_buffer[handle->op_pos]=0;
handle->op_pos=0;
}
if(input=='-')
{
handle->op2_buffer[handle->op_pos]='-';
handle->op_pos++;
handle->state=7;
ready=true;
}

if((input>='0'&&input<='9')||input=='.')
{
handle->op2_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=6;
ready=true;
}

}

if(handle->state==6&&!ready)
{

if((input>='0'&&input<='9')||input=='.')
{
handle->op2_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=6;
ready=true;
}

if(input=='\n')
{
handle->op2_buffer[handle->op_pos]=0;
handle->state=1;
ready=true;
return true;
}
}

if(handle->state==7&&!ready)
{
if((input>='0'&&input<='9')||input=='.')
{
handle->op2_buffer[handle->op_pos]=input;
handle->op_pos++;
handle->state=6;
ready=true;
}

}

return false;
}



Gruß,
SIGINT