PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kleines Problem bei Visual Studio Programmierung


Nightspider
2011-12-04, 23:45:18
Aktuelle Frage siehe Post # 6

Hallo ich lerne gerade im Studium das Programmieren mit Visual Studio.

Die Aufgabenstellung lautet:

Das Programm soll folgenden Ablauf realisieren:
1. Anzeige einer Liste aller verfügbaren Artikel mit Preisangabe und Menünummer
2. Nutzereingabe einer Artikelauswahl
3. Nutzereingabe der Anzahl des gewünschten Artikels
4. In Abhängigkeit von Artikel und Anzahl den Zwischenpreis anzeigen
5. Nutzereingabe (j/n) für einen eventuellen weiteren Wunsch
6. Wenn weiterer Wunsch, dann zu Schritt 1 gehen, ansonsten weiter mit 7.
7. Zu zahlenden Gesamtbetrag ausgeben
8. Nutzereingabe des gezahlten Betrages
9. Eventuell Restgeld ausgeben
10. Verabschieden und beenden des Programmes

Und dazu habe ich folgenden Programmcode geschrieben:
#include <stdio.h>
#include <conio.h>
#include <windows.h>
#define ESC 27
int Auswahl(0),Anzahl(0);
float Eins(1.20),Zwei(1.00),Drei(1.20),Vier(0.80),Fünf(2.50),Sechs(2.50),Sieben(3.00);
int scanf_return;
float Zwischensumme(0),Summe(0),Eingezahlt(0),Restgeld(0);
int summe(int x, int y);
int differenz(int x, int y);
float produkt(int x, int y);
float quotient(float x, float y);
int main(void)

{
char Nochetwas;
char n(110); // weist der Variable 'n' die Zahl 110 zu (ASCI CODE)
char j(106); // weist der Variable 'j' die Zahl 106 zu (ASCI CODE)
char programm_ende = 0;
do
{
do
{
printf ("Cafeteria-Automat\n"); //Anzeige der Auswahlmöglichkeiten
printf ("Waehlen Sie eines der folgenden Produkte:\n");
printf ("------------------\n");
printf ("1 - Kaffee \t\t\t\t1,20Euro\n");
printf ("2 - Tee \t\t\t\t1,00Euro\n");
printf ("3 - Kakaeo \t\t\t\t1,20Euro\n");
printf ("4 - Wasser \t\t\t\t0,80Euro\n");
printf ("5 - Sandwich Salami \t\t\t2,50Euro\n");
printf ("6 - Sandwich Schinken \t\t\t2,50Euro\n");
printf ("7 - Sandwich Deluxe \t\t\t3,00Euro\n\n");
do
{
fflush(stdin); // loeschen Tastaturpuffer//
scanf_return = scanf_s("%i", &Auswahl); // Erste Zahl einlesen //
if(scanf_return == 0)
{
printf("Das war keine gueltige Eingabe!\n");
}
}while (scanf_return == 0 || Auswahl>7 || Auswahl<1); //Bedingungen zum Fehler auffangen
printf("Auswahl:");

switch (Auswahl) //Auswahl zur Angabe des ausgewählten Artikels
{
case 1:
{
printf("Kaffee\n");
break;
}
case 2:
{
printf("Tee\n");
break;
}
case 3:
{
printf("Kakao\n");
break;
}
case 4:
{
printf("Wasser\n");
break;
}
case 5:
{
printf("Sandwich Salami\n");
break;
}
case 6:
{
printf("Sandwich Schinken\n");
break;
}
case 7:
{
printf("Sandwich Deluxe\n");
}
}
printf ("Waehlen sie die Anzahl aus!\n\n");
fflush(stdin); // loeschen Tastaturpuffer//
scanf_return = scanf_s("%i", &Anzahl); // Erste Zahl einlesen //
if(scanf_return == 0)
{
printf("Das war keine gueltige Eingabe!\n");
}

printf ("Anzahl: %i \n\n",Anzahl); //Einlesen der Anzahl

switch (Auswahl) // Berechnung der Zwischensumme mit Anzahl der Auswahl
{
case 1:
{
Zwischensumme=Eins*Anzahl;
break;
}
case 2:
{
Zwischensumme=Zwei*Anzahl;
break;
}
case 3:
{
Zwischensumme=Drei*Anzahl;
break;
}
case 4:
{
Zwischensumme=Vier*Anzahl;
break;
}
case 5:
{
Zwischensumme=Fünf*Anzahl;
break;
}
case 6:
{
Zwischensumme=Sechs*Anzahl;;
break;
}
case 7:
{
Zwischensumme=Sieben*Anzahl;
}
}

printf ("Zwischensumme: %.2f Euro\n\n",Zwischensumme); // Ausgabe der Zwischensumme

Summe=Summe+Zwischensumme; // Berechnung der Summe

printf ("Die gesamte Summe betraegt: %.2f Euro\n\n",Summe); // Ausgabe der Gesamtumme

printf ("Moechten Sie noch etwas kaufen? j=ja, n=nein\n");
do
{
Nochetwas = getch();
}while ((Nochetwas != n) && (Nochetwas != j)); //Bedingungen für ja/nein Eingabe

}while (Nochetwas != n); //Bedingung für weitere Auswahl
printf ("Die zu zahlende Summe beträgt %.2f Euro\n\n",Summe);
printf ("Bitte geben Sie die Hoehe des eingezahlten Geldes ein!\n\n");

do
{
fflush(stdin); // loeschen Tastaturpuffer//
scanf_return = scanf_s("%f", &Eingezahlt); // Erste Zahl einlesen //
if(scanf_return == 0)
{
printf("Das war keine gueltige Eingabe!\n");
}
}while ((scanf_return == 0) || (Eingezahlt < Summe));

Restgeld=Eingezahlt-Summe; // Berechnung des Restgeldes
printf ("Ihr Restgeld betraegt %.2f Euro\n\n",Restgeld); // Ausgabe des Restgeldes
printf ("Vielen Dank, das Sie mich benutzt haben. \n\n\n");
printf("Programm beenden mit 'ESC', zum Fortsetzen beliebige andere Taste \n\n\n");
programm_ende = getch();
system("cls");
}while (programm_ende != ESC); // Beendigung des Programmes mit ESC


return 0;
}

Und ich bekomme immer diese Warnungen:
http://www.abload.de/img/fehler5zv6p.jpg

Bis auf die Berechnung der Zwischensumme (Auswahl*Anzahl) scheint alles zu funktionieren.
Aber irgendwie finde ich den Fehler nicht bzw. weiß noch nicht, was das Problem ist. :(

Würde mich freuen, wenn mir jemand helfen kann.

Edit: Argh, jetzt hab ich auf einen Schlag gesehen, das ich bei der 2. Switch Anweisung in der Klammer Anzahl, statt Auswahl stehen hatte.

Warnungen kommen aber dennoch.

Trap
2011-12-05, 00:21:07
1.2 ist ein double, 1.2f wäre der float dazu. Geld mit Fließkommzahlen zu rechnen ist aber keine gute Idee.

Nightspider
2011-12-05, 00:27:18
1.2 ist ein double, 1.2f wäre der float dazu. Geld mit Fließkommzahlen zu rechnen ist aber keine gute Idee.

Oben in der Deklaration?

Sprich hier:
float Eins(1.20),Zwei(1.00),Drei(1.20f),Vier(0.80),Fünf(2.50),Sechs(2.50),Sieben(3.00) ;

?

Was wäre denn besser als float geeignet?

Noch eine Frage:

Kann ich die ganzen Klammern bei if, else und switch Anweisungen weglassen? Muss ich da was beachten?

Coda
2011-12-05, 00:55:52
Was wäre denn besser als float geeignet?
Fixed point. Also Integer mit fester Kommastelle (meistens rechnet man mit 1/10 oder 1/100 Cent).

Ectoplasma
2011-12-05, 10:52:04
Mal kurz was zum Style des Codes. Mich wundert immer wieder, dass es nur wenige Profs. gibt, die darauf achten, wie der Code geschrieben wird. Man sollte sich wenigstens darauf einigen, dass Variablen vorne kleine, von mir aus groß, geschrieben werden. Es sollte aber einheitlich sein. Dein Code ist einfach nicht schön zu lesen. In der Software-Industrie ist soetwas wichtig, weil es Zeit spart.

Nightspider
2012-01-04, 22:08:22
Eine aktuelle Frage:

Beim Erstellen eines Arrays werden ja nur die Grenzen des Arrays definiert. Der Inhalt bleibt jedoch genau so, wie er vorher war.

In meinen Fällen besaßen alle Felder meines Arrays den Wert [-858993460].

Ich habe diese bisher mit einer for-Schleife Feld für Feld auf 0 gesetzt.

Folgende Fragen:

1. Ist dieser Wert IMMER beim Erstellen in einem Feld?

2. Wenn nein: wovon ist der Wert abhängig, der im Feld steht? Von dem, was ein vorhergehendes Programm in den RAM an dieser Stelle geschrieben hat?

3. Wie kann ich das Array möglichst einfach und Effizient auf 0 setzen? Gibts da ein Befehl?

del_4901
2012-01-04, 22:55:12
1 nein
2 ja
3 memset

Coda
2012-01-04, 23:08:03
3. Alternativ std::fill falls C++ (Typsicher unso)

Weiß allerdings nicht, ob das wirklich gleich schnell ist. Könnte eine andere Semantik haben.

Nightspider
2012-01-05, 00:34:37
Danke euch beiden. memset hat funktioniert (musste aber aus dem int array ein char array machen)

Dein Befehl, Coda, werde ich auch nochnmal ausprobieren.

Könnt ihr mir sagen, ob die beiden Befehle zumindest schneller sind als mit for-Schleife jedes Feld einzeln, nacheinander zu beschreiben?

PS: schicker neuer Avatar Coda

del_4901
2012-01-05, 00:48:44
Memset kann optimiert sein/werden indem man immer mit der Registerbreite der Architektur kopiert. Dann muss man bei nicht alignten Adressen und Groessen Padden und den Verschnitt als Byteweise kopieren. Aber das wird wohl so schnell bei deinen Problemen nicht zum Flaschenhals werden koennen. Ansonsten kann ich nur Jedem raten sich selbst ein Bild zu machen indem man einen Profiler gebraucht. Warscheinlich wirst du kaum Unterschiede zw. Memset und For-Schleife messen koennen.

pest
2012-01-05, 07:59:38
(musste aber aus dem int array ein char array machen)

memset(feld,0,size*sizeof(type))

Xilavius
2012-01-05, 08:38:57
Ein anderer gravierender Fehler:
printf ("3 - Kakaeo \t\t\t\t1,20Euro\n");

:freak:

PatkIllA
2012-01-05, 08:46:57
2. Wenn nein: wovon ist der Wert abhängig, der im Feld steht? Von dem, was ein vorhergehendes Programm in den RAM an dieser Stelle geschrieben hat?Da steht eher drin, was dein Programm da schon mal hingeschrieben hat. Speicher den du vom OS bekommst ist erstmal genullt, weil das sonst ein Sicherheitsrisiko wäre.