Auswertung
-
Hallo!
Habe mit folgenden Programm ein Problem da es nicht den Notendurchschnitt berechnen will und die Tabelle nicht ausgeben will.
Kann mir jemand von euch helfen!MfG Christopher
#include <stdio.h>
#include <conio.h>int main (void)
{
struct Klausurdaten
{
char Fach [30];
char Datum[11];
int Teilnehmerzahl;
int Notenspiegel[7];
float Notenschnitt;
} Klausur = {"Programmierung in C"};
int i;clrscr();
printf("Bitte Klausur-Infprmationen"
"eingeben: \n\nDatum = ");
gets(Klausur.Datum);
printf("Anzahl der Teilnehmer = ");
scanf ("%d", &Klausur.Teilnehmerzahl);
printf ("Notenspiegel : \n");
for (i=1; i<=6; i++)
{
printf("Note %d: ", i);
scanf("%d", &Klausur.Notenspiegel[i]);
}
printf("\n\nAuswertung der "
"Strukturvariablen Klausur: \n\n");
printf("Fach : %s \n");
printf("Datum : %s \n" );
printf("Teilnehmer : %s \n");
printf("\n"
"Notenspiegel: 1 2 3 4 5 6 \n"
" ");
for (i=1; i<=6; i++)
printf("");
printf("\n\nNotenschnitt noch"
"nicht berechnet!");printf("Auswertung der c-Klausur ");
printf("Fach: %s", Klausur.Fach);
printf("Datum: %s", Klausur.Datum);
printf("Datum: %s", Klausur.Teilnehmerzahl);float summe=0;
for (i=1; i<=6; i++)
{
printf"Note %d: ",i);
scanf("%d", &Klausur.Notenspiegel [i]);
summe = Klausur.Notenspiegel[i];
}for (i=1; i<=6; i++)
{
printf("%d ", Klausur.Notenspiegel[i]);
}
-
o.0 Was bitte soll DAS sein??
1.es fehlen die Code Tags und einschübe
2.es fehlen klammern
3.printf("\n" "Notenspiegel: 1 2 3 4 5 6 \n" " ");
Was bitte soll sowas???
printf("formatstring",variablen); <-- so sieht das aus!Structuren solltest du ruhig außerhalb von main bauen und dann in main registrieren, ist aber nit falsch so wie du's gemacht hast.
...weiteres folgt später
***edit***
Falsch:struct Klausurdaten { //Variablen } Klausur = {"Programmierung in C"}; //hier ist der Bock!
Klausur ist eine Variable vom Typ 'Klausurdaten', der kannst du keinen string so einfach zuweisen!
desweiteren sind diese Zeile unglücklich:
int Teilnehmerzahl; scanf ("%d", &Klausur.Teilnehmerzahl);
für Integer gibts das '%i'. So kann scanf nen wert einlesen, der villeicht garnicht mehr in die Integer passt!
(Fals ich falsch liege möge man mich korrigieren )[hast du übrigends mehrfach gemacht]weiter im text:
printf("Fach : %s \n");
Was soll printf denn nun für '%s' ausgeben? 'Klausur.Fach'? das Musst ihm auch sagen!
richtig: printf("Formatstring",Variablen);Hier das Selbe:
printf("Teilnehmer : %s \n");
Nur leider hast du garkeinen String der die Teilnehmerzahl enthält, müsste also in etwa so aussehen:
printf("Teilnehmer : %i \n",Klausur.Teilnehmerzahl);
Was bitte soll diese Anweisung machen:
for (i=1; i<=6; i++) printf(""); //garnichts ausgeben? Kein wunder das keine Noten Kommen ;)
probiers mal damit:
for (i=1; i<=6; i++) printf("%i ",Klausur.Notenspiegel[i]);
printf("Auswertung der c-Klausur "); printf("Fach: %s", Klausur.Fach); printf("Datum: %s", Klausur.Datum); printf("Datum: %s", Klausur.Teilnehmerzahl); // Die Teilnehmerzahl ist immernoch vom Typ int! => %i
bau ein paar '\n' ein, sonnst hast alles in einer Zeile hängen!
int Notenspiegel[7];
Du brauchst doch nur 6 elemente, oder?
dann schreib in den schleifen doch einfach 'for(i=0;i<=5;i++)'so brauchst eine int weniger.Sorry, hab den Faden verloren, aber ich glaub wenn du das alles mal überprüft hast gehts schonmal ne Ecke besser.
Greetz
THE_FreaKps: falls ich irgendwo groben mist geschrieben hab korrigiert mich, weis nämlich schon garnimmer wasich geschrieben hab *g*
[ Dieser Beitrag wurde am 02.04.2003 um 22:01 Uhr von THE_FreaK editiert. ]
-
Original erstellt von THE_FreaK:
**3.printf("\n" "Notenspiegel: 1 2 3 4 5 6 \n" " ");
Was bitte soll sowas???
printf("formatstring",variablen); <-- so sieht das aus!
**Das printf ist vollkommen korrekt. In C darf man ja einen String auf mehrere aufteilen und so hat es für manche sogar ienen Anschein von übersichtlichkeit.
**
desweiteren sind diese Zeile unglücklich:int Teilnehmerzahl; scanf ("%d", &Klausur.Teilnehmerzahl);
für Integer gibts das '%i'. So kann scanf nen wert einlesen, der villeicht garnicht mehr in die Integer passt!
(Fals ich falsch liege möge man mich korrigieren )[hast du übrigends mehrfach gemacht]
**Laut meiner Doku erwartet %d als Parameter ienen zeiger auf einen int. Also legitim.
**
ps: falls ich irgendwo groben mist geschrieben hab korrigiert mich, weis nämlich schon garnimmer wasich geschrieben hab *g*
**Soeben passiert Aber die anderen Fehler sind trotzdem massiv berechtigt (vor allem die %s mit dem int).
-
for(int i=0;i<=5;++i)
ist böse
for(int i=0;i<6;++i)
ist VIEL besser
-
begründung?
-
Original erstellt von Shade Of Mine:
**for(int i=0;i<=5;++i)ist böse
for(int i=0;i<6;++i)
ist VIEL besser**??? Das ist doch scheiss egal, die Abbruchbedingung ändert sich dadurch schließlich nicht!
printf() über mehrere Zeilen nennt sich "Stringkonkatenation" und wird vor allem bei Ausgaben über mehrere Zeilen hinweg genommen...
-
@TriPhoenix & <RTC>
Danke für die Verbesserung, wusst ich bisweilen auchnochnicht, dass sowas geht (sieht irgendwie aus wie gewollt und nicht gekonnt *g*)@%d wo ist denn dann der Sinn, das man %i und %d unterscheidet?
generell unterscheiden sich ja int und double nur im wertebereich, r8? demnach müsste aber dann ja eine konstellation zwischen %i/%d und int/double probleme machen oder nicht?@christopher19 lass dich nicht entmutigen! Musst halt nur n bissel aufpassen, das meiste sieht mir verdammt nach Flüchtigkeitsfehlern aus. nicht zuende gedacht aber der Ansatz war da
-
Original erstellt von THE_FreaK:
@%d wo ist denn dann der Sinn, das man %i und %d unterscheidet?
generell unterscheiden sich ja int und double nur im wertebereich, r8? demnach müsste aber dann ja eine konstellation zwischen %i/%d und int/double probleme machen oder nicht?%d steht NICHT für double, sondenr für dezimal, so wie es noch %x für hexadezimal und %o für oktal gibt %i ist so ne Sammelstelle für die drei Formate, ich schätze Okatal wird erkannt durch 0 am anfang und Hex mit 0x oder so. So wie ich das hier sehe, gibts für double überhaupt keinen spezifizierer, nur %f für float. Kann aber gut sein,d ass das inzwischen erweitert wurde.
Und int und double Uneterscheiden sich durch wesentlich mehr als nur den Werteberiech. Int ist eine Ganzzahl, so breit wies dem laufenden Prozessor gefällt, also beim normalrechner 32-Bit. double ist eine Fließkommazahl mit doppelter Genauigkeit (ich glaube das dürften 64-bit sien, ohne Garantie), sind also durchaus zwei verschiedene Dinge.
[ Dieser Beitrag wurde am 03.04.2003 um 17:46 Uhr von TriPhoenix editiert. ]
-
Original erstellt von TriPhoenix:
So wie ich das hier sehe, gibts für double überhaupt keinen spezifizierer, nur %f für float. Kann aber gut sein,d ass das inzwischen erweitert wurde.Bei printf steht %f für double, bei scanf steht %f für float und %lf für double.
-
Warum ist i<=5 schlechter als i<6 ?
Der vom gcc (3.2.2) erstellte Assembler Code ist gleich.na ja.. andere Compiler, womöglich anderer Output, aber Shade sollte das schon mal begründen bzw. erklären
-
i<=5
liest sich nicht wie Ci<6
das liest sich wie Cwarum?
i<strlen(string)
und nicht
i<=strlen(string)-1bei
i<=5 muss ich immer umdenken, bei 0<6 ist es klar, dass die schleife n-1 mal durchläuft und das ist 5interessant ist vielleicht auch
i!=6
das ist etwas C++igerin C wird halt immer die abbruch bedingung angegeben, und kleiner gleich ist doch sinnlos. ich will nicht kleiner gleich sondern solange i kleiner als 6 ist, also solange i in range bleibt.
und nicht solange i kleiner gleich 5 ist - was ist 5? das letzte gültige element, aber das interessiert mich nicht. mich interessiert nicht das letzte gültige, sondern das 1. ungültige.vorallem
i=1;i<=6
das ist strange
wie oft wird das durchlaufen?
äh... <=6 heisst 0-6 sind 6 mal, aber i ist 1 also nur 5 mal
i=0;i<6
das sind 5das sind diese kleinen sachen die den sourceode leichter lesbar machen.