Ordnen der Fragen...
-
Moinsen wiedermal =b
Ich arbeite immer noch an meiner Software (wobei ich eh ziemlich rasch voran komme)...
nur hab ich ein kleines, wenn auch nicht unwichtiges, problem... damit die
Quize nicht all zu langweilig werden, wird die reihenfolge der Antworten verändert.
damit das programm jetzt aber noch weiß, welches die richtige antwort ist, setze
ich gleich den neuen index der richtigen Antwort... nur stimmt der in den meisten
fällen nicht überein. nur ist jetzt mein problem, dass ich jetzt nicht weiß wo
der fehler liegt, entweder in der Überprüfung oder in der Setzung der Reihenfolge.Hier mal beide Funktionen:
Setzen der Reihenfolge
void SetOrder(){ int idx[MAX_ANSWERS_PER_QUESTION]; char Answers[MAX_ANSWERS_PER_QUESTION][MAX_CHAR]; int i,j,z,y; srand(time(NULL)); for(i=0; i<_INI_Quiz.AnzQuestion; i++){ for(j=0; j<_INI_Quiz.AnzAnswerPerQuestion; j++) strcpy(Answers[j], AnswerQuestion.Answer[i][j]); for(j=0; j<_INI_Quiz.AnzAnswerPerQuestion; j++){ idx[j]=rand()%_INI_Quiz.AnzAnswerPerQuestion; AnswerQuestion.RightIdx[i]=idx[0]; for(z=0; z<j; z++) if(idx[j]==idx[z]){ j--; break; } } for(j=0; j<_INI_Quiz.AnzAnswerPerQuestion; j++) strcpy(AnswerQuestion.Answer[i][j], Answers[idx[j]]); } }
Überprüfen auf Wahr/Falsch
void CheckTrue(int call, QNR quest){ if(AnswerQuestion.RightIdx[quest-1] == call-1){ AnswerQuestion.RightFalse[quest-1]=_TRUE_; AnswerQuestion.anzRight++; } else AnswerQuestion.RightFalse[quest-1]=_FALSE_; }
zu CheckTrue(...): -1 weil ich ja den benutzer nicht 0 für die antwort 1 eingeben
lassen kann ^^es wäre wirklich super von euch, wenn ihr mir auf die spünge helfen könntet =b
gruß
ITEDVO
-
Es wäre doch einfacher, statt eines Index auf die richtige Antwort zu speichern, die Richtigkeit einer Antwort direkt dort zu speichern:
struct Answer { char answ[MAX_CHAR]; int korrekt; // 0 || 1 };
Dann ist die Reihenfolge egal - außerdem könntest Du später evtl. mehrere richtige Antworten haben, vielleicht mit einer unterschiedlichen Punktzahl versehen ...
struct Answer { char answ[MAX_CHAR]; int points; // 0 --> falsch };
-
hmm, inwiefern meinst du das, anhand deines beispieles kann man nur eine
antwort speichern, ok, könnt aus dem 1 dimensionalen ein
2 dimensionales feld machen, aber dann ist wieder das problem, welches
ist das richtige?
denn die richtigen Antworten werden aus einer Datei gelesen, die 1. antwort ist
intern immer die richtige... die reihenfolge wird dann geändert um eben
einem richtigen Quiz nahe zu kommen...oder übersehe ich jetzt was?
ich muss doch wissen "wo" die richtige antwort ist...
[EDIT]: und wie sieht es aus wenn ich die richtige Antwort in ein Extra Feld speichere und die falschen in ein anderes? dann hät ich das getrennt... aber ich
seh im moment die logik nich dahinter, sitze wohl schon zu lange am gleichen ^^
-
Mein Beispiel ist EINE Antwort UND gleichzeitig die Information, ob diese Antwort falsch oder richtig ist:
struct Answer { char answ[MAX_CHAR]; int korrekt; // 0 || 1 }; ... Answer answers[anzahl_antworten];
Von diesem kannst Du doch ein Array anlegen, so daß Du in jedem Array - Eintrag eine Antwort und die Information richtig/falsch hast.
Du musst doch auch irgendwo zuordnen, welche Antworten zu welcher Frage gehören?Vielleicht so:
struct Answer { char answ[MAX_CHAR]; int korrekt; // 0 || 1 }; struct QuizFrage { char frage[MAX_CHAR]; //vier mögliche Antworten zu jeder Frage Answer answers[4]; }; //Insgesamt haben wir 50 Fragen und jeweils 4 Antworten: QuizFrage fragen[50];
Wenn Du nun eine Frage auswählst, hast Du die dazugehörigen Antworten gleich parat - Du musst natürlich zu Beginn das Array fragen aus Deiner Datei füllen. Wenn Du nach Ausgabe einer Frage das dazugehörige Array answers 'mischst', bleibt bei jeder Antwort Answer die Information, richtig oder falsch (korrekt) erhalten, weil Du nicht nur den Antworttext austauschst, sondern die ganze, aus Antworttext UND richtig/falsch-Information bestehende Struktur.
-
das würde mein gesammtes Datensystem auseinander nehmen, mehr noch, es würde
die gesammte datenstruktur auseinander nehmen was die folge hat ich könnt mal einfach
so alles löschen und neu anfang
-
itedvo schrieb:
das würde mein gesammtes Datensystem auseinander nehmen, mehr noch, es würde
die gesammte datenstruktur auseinander nehmen was die folge hat ich könnt mal einfach
so alles löschen und neu anfangDu tust mir ja so Leid. Die ganze, übrige Welt kapselt zusammengehörende Daten zusammen, weil es viel einfacher ist, mit einem Objekt, das alle Werte beinhaltet, zu arbeiten. Kannst du mir verraten, wieso man es vorziehen sollte, mit dieser Struktur zu arbeiten:
char*Questions[100]; char*Answers[100];
und dann jedes mal folgendes schreiben zu müssen:
for(i=0;i<100;i++) printf("\"%s\" ist die Antwort auf die Frage: \"%s\"",Answer[i],Question[i]);
, wenn es auch so aussehen kann:
typedef struct { char*Question; char*Answer; }MyArray[100];
Der Code:
for(i=0;i<100;i++) printf("\"%s\" ist die Antwort auf die Frage: \"%s\"",MyArray[i].Answer,MyArray[i].Question);
Vor allem, wenn die Programme komplexer werden und du mehrere solche Konstrukte verwalten musst, wirst du froh sein, die Daten kapseln zu können.
-
alter, bevor ihr postet lest gefälligst... wenn ihr meinen code anschauen würdet, würdet ihr sehen dass ich die daten sehr wohl kapsle... mehr und mehr überleg ich mir nich in ein anderes forum zu gehen denn die verhöhnung hier ist
ja zum kotzen... verdamt, wenn jemanden gegen über steht, würde so mancher von euch
nich mal s' maul aufkriegen, so siehts aus...
-
Tschuldige, wenn ich Dich verhöhnt habe ... ich poste nicht mehr auf Deine Fragen ...
-
Belli schrieb:
Tschuldige, wenn ich Dich verhöhnt habe ... ich poste nicht mehr auf Deine Fragen ...
ich spreche von "glühbirne" und Co.
hab ja geschrieben "so mancher"... du warst davon nicht betroffen... aber es gibt
einige in diesem forum die mehr als nur einfach "unhöflich" sind...
-
Warum machst du dir überhaupt die Mühe, die Antworten mehrfach umzukopieren? Ich hätte mir nur ein Index-Array mit einer zufälligen Permutation der Werte 0 bis n-1 aufgebaut und beim Ausgeben dieses Array verwendet:
int idx[...]; //... //fülle Array mit Werten in zufälliger Reihenfolge //... //Ausgabe: for(int n = 0;n<Quiz.AnzahlAntworten;++n) printf("%i - %s\n",n+1,Quiz.Antworten[idx[n]]); scanf("%i",&antwort); if(idx[antwort-1]==0) printf("richtig\n"); else printf("falsch\n");
(zum Bauen des Zufallsarrays hätte ich std::random_shuffle() verwendet, aber das fällt in C leider aus)
-
CStoll schrieb:
Warum machst du dir überhaupt die Mühe, die Antworten mehrfach umzukopieren? Ich hätte mir nur ein Index-Array mit einer zufälligen Permutation der Werte 0 bis n-1 aufgebaut und beim Ausgeben dieses Array verwendet:
int idx[...]; //... //fülle Array mit Werten in zufälliger Reihenfolge //... //Ausgabe: for(int n = 0;n<Quiz.AnzahlAntworten;++n) printf("%i - %s\n",n+1,Quiz.Antworten[idx[n]]); scanf("%i",&antwort); if(idx[antwort-1]==0) printf("richtig\n"); else printf("falsch\n");
(zum Bauen des Zufallsarrays hätte ich std::random_shuffle() verwendet, aber das fällt in C leider aus)
autsch, autsch... auf das hät ich selber auch kommen können... danke viel mals,
das is es ^^danke dir