cedi gc
14. Januar 2010 - 16:17 Uhr
So wie vielleicht ein paar wissen mache ich die Lehre als Informatiker, Richtung Systemtechnik. Leider müssen wir in der Berufssschule auch programmieren und zwar im Moment mit der Sprache C.
Im Moment müssen wir so ein Rechnungshilfe Programm schreiben mit dem man eingeben kann ob man Multiplikation,Divison,Addition oder Subtraktion üben will. Zudem kann man eingeben ob Minuszahlen drin vorkommen, wieviele Rechnungen man machen will und wie hoch das Resultat maximal sein kann (Die zwei Zufallszahlen dürfen diese grösse auch nicht überschreiten).
Am Schluss sollte dieses Programm ausgeben was man für eine Note hat.
Wenn man eine Lösung falsch eingibt soll diese Rechnung gespecihert werden und am Schluss wiedergefragt werden bis man es richtig hat.
Nun im Moment habe ich ein Programm, das noch Probleme hat die Note auszugeben. Zudem weiss ich nicht wie ich das mit den falschen Rechnungen
speichern machen soll. Der Lehrer sagte es gehe auch ohne Array (mir eignetlich egal, weiss auch den Lösungsweg mit Array nicht.
mein momentaner Code sieht so aus:
[codebox]
/*******************************************************************************
********************************************************************************
* Programm: Rechnungshilfe
*
* Filename: Rechnungshilfe.c
*
* Autor: Cédric Christen
*
* Version: 1.0
*
* Datum: 12.01.2010
*
* Entwicklungsablauf(Version, Datum, Autor, Entwicklungsschritt):
* 1.0 12.01.2010 CCh Ganzes Programm erstellt
*
********************************************************************************
*
* Verwendungszweck: C-Schulung
*
*
* Beschreibung:
*
*
* Precondition:
* -
*
* Postcondition:
* -
*
* Benötigte Libraries:
* - stdlib.h
* - stdio.h
* - time.h
*
* Copyright © 2009 by Cédric Christen, CH-5632 Buttwil
********************************************************************************
*******************************************************************************/
/*******************************************************************************
* Include Files
*******************************************************************************/
#include <stdlib.h> /* Funktionsbibliothek: Hilfsfunktionen */
#include <stdio.h> /* Funktionsbibliothek: Standard Ein- Ausgabe */
#include <time.h> /* Funktionsbibliothek: Zeit */
/*******************************************************************************
* Globale Deklarationen und Definitionen
*******************************************************************************/
/*******************************************************************************
******************************* HAUPTPROGRAMM **********************************
*******************************************************************************/
int main(void) {
// Lokale Variablen
int Rechnungsart;
int MaxResultat;
int Negativ;
int Anzahl;
int Richtig;
int Random1, Random2;
int Resultat;
int MaxRandom;
int Index = 0;
int Random3;
int Eingabe;
int Punkte = 0;
double Wertung;
srand(time(NULL));
// Intro
puts("Dieses Programm ist ein Rechnungs-Generator.");
printf("\n");
// Eingabe
printf("Bitte geben Sie die Rechnungsart ein (0 = +; 1 = -; 2 = *; 3 = /): ");
scanf("%d", &Rechnungsart);
printf("Bitte geben Sie das groesstmoeglichste Resultat an: ");
scanf("%d", &MaxResultat);
printf("Darf das Resultat negativ sein (0 = Nein; 1 = Ja): ");
scanf("%d", &Negativ);
printf("Wie viele Aufgaben sollen erstellt werden?: ");
scanf("%d", &Anzahl);
// Berechnung
while(Anzahl > 0){
MaxRandom = MaxResultat;
switch(Rechnungsart){
case 0:
Random1 = rand() % MaxRandom;
MaxRandom = MaxResultat - Random1;
Random2 = rand() % MaxRandom;
printf("%d + %d = ", Random1, Random2);
scanf("%d", &Eingabe);
Resultat = Random1 + Random2;
if (Resultat != Eingabe){
printf("Das war leider Falsch!");
printf("\n");
}
else {
printf("Richtig \n");
Punkte++;
}
break;
case 1:
Random1 = rand() % MaxRandom;
MaxRandom = MaxResultat - Random1;
Random2 = rand() % MaxRandom;
if (Negativ == 0){
if (Random1 < Random2){
Random3 = Random1;
Random1 = Random2;
Random2 = Random3;
}
}
printf("%d - %d = ", Random1, Random2);
scanf("%d", &Eingabe);
Resultat = Random1 - Random2;
if (Resultat != Eingabe){
printf("Das war leider Falsch! \n");
}
else {
printf("Richtig \n");
Punkte++;
}
break;
case 2:
Random1 = rand() % MaxRandom;
MaxRandom = MaxResultat / Random1;
Random2 = rand() % MaxRandom;
printf("%d * %d = ", Random1, Random2);
scanf("%d", &Eingabe);
Resultat = Random1 * Random2;
if (Resultat != Eingabe){
printf("Das war leider Falsch! \n");
}
else {
printf("Richtig \n");
Punkte++;
}
break;
case 3:
Random1 = rand() % MaxRandom;
MaxRandom = MaxResultat / Random1;
Random2 = rand() % MaxRandom;
if (Negativ == 0){
if (Random1 < Random2){
Random3 = Random1;
Random1 = Random2;
Random2 = Random3;
}
}
if (Random1 < 1){
Random1 = Random1 + 1;
}
if (Random2 < 1){
Random2 = Random2 + 1;
}
printf("%d / %d = ", Random1, Random2);
scanf("%d", &Eingabe);
Resultat = Random1 / Random2;
if (Resultat != Eingabe){
printf("Das war leider Falsch! \n");
}
else {
printf("Richtig \n");
Punkte++;
}
break;
}
Anzahl--;
}
Wertung = 'Punkte' / 'Anzahl' * 5 + 1;
printf("\n");
printf("%d""\n", Wertung);
printf("\n");
system ("PAUSE"); /* Nur während der Entwicklungsphase, später löschen! */
return (0);
}
[/codebox]
Mfg, Cedi
Fatalis
14. Januar 2010 - 17:12 Uhr
Zu den Noten: ich seh nicht genau wo dein Problem ist. Du hast am Ende die erreichten Punkte und die Anzahl der Aufgaben, daraus ne einfache Fallunterscheidung machen, wie genau die aussieht wird denke ich vorgegeben sein, ab welchem Prozentteil es welche Note gibt.
Zu dem Speichern, ich weiß nicht wie viele Datentypen udn sowas ihr habt, deshalb versuche ich mal ne einfache Vorgehensweise zu erläutern (ich kenne die C++ Syntax und Besonderheiten nicht, daher mal allgemein formuliert. Ich gehe ferner davon aus, dass solange die gleiche Frage gestellt wird bis man sie richtig beantwortet und dann erst die nächste kommt in diesem Fall)
- Allokiere zu Beginn drei Array mit sovielen Elementen wie gewählten Aufgaben und ein Integer falsch (=0)
- Wenn eine Aufgabe falsch beantwortet wird, schreibe in die Arrays an die erste freie Stelle jeweils Zahl 1, Zahl 2, Resultat und erhöhe falsch um 1
- Am Ende wird überprüft ob falsch > 0. Falls nein, sind alle Aufgaben richtig beantwortet worden, ansonsten kommt die Wiederholung
- Starte eine for Schleife von 0 (Arrays fangen bei 0 an) bis Anzahl falsch - 1
- Lese die Zahlen der gespeicherten Aufgabe aus den Arrays (Array1[i] , ...)
- Bei richtiger Antwort normal weiter, bei falscher Antwort i um eins verringern -> am Ende der For-Schleife wird i wieder erhöht, sodass die gleiche Frage wieder gestellt wird
- Die for-Schleife terminiert, sobald alle Fragen richtig beantwortet wurden
So in etwa sollts funktionieren, geht sicher auch eleganter, habs aber versucht verständlich / einfach zu halten.
Weathercast0
14. Januar 2010 - 18:08 Uhr
Fatalis sagte am 14.01.2010, 17:12:
- Allokiere zu Beginn drei Array mit sovielen Elementen wie gewählten Aufgaben und ein Integer falsch (=0)
- Wenn eine Aufgabe falsch beantwortet wird, schreibe in die Arrays an die erste freie Stelle jeweils Zahl 1, Zahl 2, Resultat und erhöhe falsch um 1
- Am Ende wird überprüft ob falsch > 0. Falls nein, sind alle Aufgaben richtig beantwortet worden, ansonsten kommt die Wiederholung
- Starte eine for Schleife von 0 (Arrays fangen bei 0 an) bis Anzahl falsch - 1
- Lese die Zahlen der gespeicherten Aufgabe aus den Arrays (Array1[i] , ...)
- Bei richtiger Antwort normal weiter, bei falscher Antwort i um eins verringern -> am Ende der For-Schleife wird i wieder erhöht, sodass die gleiche Frage wieder gestellt wird
- Die for-Schleife terminiert, sobald alle Fragen richtig beantwortet wurden
Oder der dritte Array speichert nicht das resultat, sondern 0 für richtig und 1 für falsch und nachher geht er den dritten array durch und sucht dann nach ner 1 und stellt die frage neu und ändert dann falls die antwort richtig war in 0 um... falls das geht

hab in der schule nur dieses blöde Delphi gelernt ^^
Fatalis sagte am 14.01.2010, 17:12:
- Starte eine for Schleife von 0 (Arrays fangen bei 0 an) bis Anzahl falsch - 1
Angenommen du beantwortest Frage 5 falsch...
falsch wird um 1 erhöht
geht die for schleife dann nicht von 0 bis 0 und ist direkt abgebrochen oder selbst wenn du 2 falsch machst, dass er frage 1 widerholt?
mfG,
Weathercast0
cedi gc
14. Januar 2010 - 18:41 Uhr
Danke für die Antworten.
Hat jemand noch ne Lösung ohne Array?
Weil wir müssen Array nicht können an der Prüfung Ende Januar.
Ach ja wegen den Punkten ich will die Note wissen (Formel: (Punkte*5)/MaxPunkte + 1)
Weiss aber nicht wo den integer 'Wartung = ? zu definieren so dass mir die Note richtig ausgegeben wird.
Fatalis
15. Januar 2010 - 22:01 Uhr
Ich kann mir nicht vorstellen wie man das vernünftig lösen kann ohne Array oder weitere datentypen (Liste, Schlange oder sonstwas), man muss, egal wie mans macht, alle Werte der falsch beantworteten Fragen irgendwo speichern. Wenn man nur Integer verwendet, braucht man für jede rechnung 3 (bzw 2, Ergebnis kann man ja neu ausrechnen lassen) Integer zum Speichern. Im Programmtext weiß man nicht wie viele Aufgaben es sein sollen, man kann zB 20 Integer (Rechnung1.1, rechnung 1.2 ...) deklarieren, wenn der benutzer aber 11 Rechnunge will hat man schon ein Problem, zudem kann man Integernamen nicht dynamisch ansprechen (Also du kannst zB nicht in einer forschleife den Integer Integeri für Integer1, Integer2 .. aufrufen) und überhaupt funktioniert das vorne und hinten nicht.
Die nächste Möglichkeit wäre es, die zahlen in einen String zu speichern, zwischen die Werte ein ; zu setzen und dann den String an den Semikola trennen, aber einfach als mit Arrays ist das nicht und solche String-Operationen sind auch denke ich nicht Teil eures Stoffs.
Langer rede kurzer Sinn, mit primitiven Datentypen und ohne Array lässt sich das ganze nicht vernünftig lösen, ziemlich sicher. Vielleicht hat der Lehrer was anderes gemeint dass es ohne Array gehen soll, keine Ahnung.