Hallo, Ich studieren derzeit Wirtschaftsinformatik im ersten Semester und habe ein Problem mit folgender Aufgabe. Das folgende gilt FÜR ALLE der folgenden Aufgaben: In den folgenden Aufgaben sollen Sie verschiedene Präprozessor-Anweisungen und Funktionen programmieren und diese in Hauptprogrammen testen und anwenden. Teilen Sie dazu den Code in jeder Aufgabe in sinnvolle Übersetzungeinheiten auf, die Sie getrennt kompilieren und am Ende zu einem Programm verlinken. Schalten Sie beim Compilieren alle Ihnen bekannten Warnungen ein (-ansi -pedantic -W -Wall -Wextra [-Wmain]) und achten Sie dabei darauf, dass der Code beim Compilieren keinerlei Warnung mehr produziert. Und nun die Aufgabe: Implementieren Sie in dieser Aufgabe Funktionen zum Berechnen von Umfang und Flächeninhalt von Kreisen und Rechtecken. Den Wert der Zahl PI implementieren Sie als symbolische Konstante mittels einer Präprozessor-Direktive. Das Quadrieren von Zahlen realisieren als Makro ebenfalls mittels einer Präprozessor-Direktive. Schreiben Sie ein Hauptprogramm zum Testen der Funktionen, in dem Sie in der main-Funktion die Funktionen für die Kreis-Radien bzw. Rechteck-Seitenlängen von jeweils 1 bis 100 aufrufen und das Ergebnis ausgeben. Was für einen Effekt beobachten Sie, wenn Sie an Ihr Makro zum Quadrieren von Zahlen i++ für eine int-Variable i übergeben? Wie erklärt sich dieser Effekt? Leider habe ich keine Ahnung wie ich das machen soll.... nach einiger Zeit (1-2stden :P), bin ich dann soweit gekommen... #include <stdio.h> -Wall #include <stdlib.h> #define PI 3.14; #define inhalt(r) PI*(r)*(r); main () { printf("Hier wird der Umfang und Flächeninhalt von Kreisen und Rechtecken berechnet."); printf("\nBitte geben Sie ein ob es sich um ein Rechteck(e) oder Kreis(k) handelt.\n"); char e,k,x; int a,b,r; double pi; pi=3,14; getchar("%c",&x); if(x=e) { printf("Bitte geben Sie hier die Seitenlaenge von a und b ein,\num den Umfang und Flaecheninhalt zu erhalten:\n"); scanf("%i",&a); scanf("%i",&b); printf("Der Umfang betraegt:%i\n",2*a+2*b); printf("Der Flaecheninhalt betraegt:%i", a*b); } else if(x=k) { printf("Bitte geben Sie hier den Radius des Kreises ein,\n um den Umfang und Flächeninhalt zu erhalten:\n"); scanf("%i",&r); printf("Der Umfang betraegt:%i\n",pi*2*r) ; printf("Der Flaecheninhalt betraegt:%i",pi*r*r); } system("PAUSE"); } Ich weiß, dass das nicht richtig ist, deswegen hoffe ich Ihr könnt mir vielleicht weiterhelfen und wenn möglich auch irgendwie erklären wie das geht. Mit freudlichen Grüßen, KeX
KeX schrieb: > if(x=e) müßste das nicht if(x = 'e') heißen? ausserdem ist der Prototyp von getchar zu beachten -> int getchar(void). Du kannst also mit getchar keine Parameter übergeben. Der Aufruf währe: x=getchar(); jetzt kannst Du x auswerten. Beliebt ist hier auch ein switch / case...
gefordert ist ein makro um zwei zahlen zu quadrieren nicht für den Flächeninhalt =)
KeX schrieb: > Ich weiß, dass das nicht richtig ist Stimmt: > #define PI 3.14; Lass da mal das Semikolon weg. > double pi; > pi=3,14; Da hast Du wohl was falsch verstanden. Du sollst keine Variable namens pi anlegen, sondern die Präprozessordefinition verwenden, die Du weiter oben definiert hast. Obendrein werden floating-Point-Werte mit einem Dezimalpunkt geschrieben, Du hast hier pi mit dem Wert 3 initialisiert. Und bist über den Komma-Operator gestolpert. Ansonsten solltest Du Dir nochmal genau die Datentypen ansehen, mit denen Du arbeitest. Nachtrag: if(x=e) Das ist doppelt fehlerhaft, einerseits ist es eine Zuweisung und kein Vergleich, andererseits: Wo wird die Variable e initialisiert? Welcher Wert steht da drin? Soll wirklich mit einer Variablen namens e verglichen werden, oder sollte nicht vielleicht doch mit dem Zeichen 'e' verglichen werden?
1. Bitte Quelltext vernünftig formatieren, dann hier reinstellen (mit [...]...[/...] garniert, siehe Formatierungshinweise beim Schreiben). Sei einen Misthaufen will keiner lesen, das ist eine Zumutung. 2. Wozu sind if(x=e) und else if(x=k) gut? Wahrscheinlich soll das jeweils == heißen. 3. system("PAUSE") ist doof. Unter Windows ist notfalls getchar() sinnvoller, wenn man eine IDE hat, die einen die Ausgabe nicht lesen lässt.
Es gibt übrigens auch Bücher über C, falls du in der Vorlesung krank warst.
irgendwie kommt mir die Aufgabe bekannt vor.. ach ja das schöne grüne Buch von RRZN - "Die Programmiersprache C. Ein Nachschlagewerk" Hier auf Seite 22
Danke für die schnellen Antworten. Werde das heute zu Hause noch einmal komplett neu schreiben und versuchen das alles einzubauen. Werde dann am Abend nocheinmal den neuen Code hochladen. (Der den ich jetzt hochgeladen hab, ist total falsch und das weiß ich auch, aber wusste einfach nichtmehr weiter...) Habe mir ein Buch bei Amazon.de bestellt ;) werd da dann alles nochmal nachlesen.
Und das nächste mal genauer lesen. In deiner Aufgabe steht > und diese in Hauptprogrammen testen und anwenden HauptprogrammeN ! Da steht nicht, dass du anfänglich alles in ein Programm quetschen musst! Weiters > Schreiben Sie ein Hauptprogramm zum Testen der Funktionen, in dem > Sie in der main-Funktion die Funktionen für die Kreis-Radien bzw. > Rechteck-Seitenlängen von jeweils 1 bis 100 aufrufen und das > Ergebnis ausgeben Das steht auch nicht, dass du den Benutzer wortreich um die Werte fragen musst. Ich weiß schon, gerade Neulinge geben gerne Text aus, weil es das einzige ist, was sie hinkriegen. Wundert mich, dass dein Programm nicht vorneweg erst mal 5 Seiten Copyrightvermerk ausgibt. Aber: Du sollst das implementieren was gefordert war! Gefordert sind Funktionen, die die jeweilige Flächenberechnung machen! Ein Programm, welches die Teilaufgabe "Berechnung eines Quadrates" löst, könnte so aussehen
1 | #include <stdio.h> |
2 | #include <stdlib.h> |
3 | |
4 | double QuadArea( double sideLength ) |
5 | {
|
6 | return sideLength * sideLength; |
7 | }
|
8 | |
9 | int main () |
10 | {
|
11 | int side; |
12 | double Area; |
13 | |
14 | printf( "Quadratberechnung\n" ); |
15 | |
16 | for( side = 1; side < 101; ++side ) |
17 | {
|
18 | Area = QuadArea( side ); |
19 | printf( "Seitenlaenge %d, Fläche %lf\n", side, Area ); |
20 | }
|
21 | |
22 | system( "PAUSE" ); |
23 | }
|
Fertig. Mehr ist nicht notwendig um die Vorgaben der Aufgabenstellung (fürs erste) zu erfüllen.
Karl heinz Buchegger schrieb: > double QuadArea( double sideLength ) > { > return sideLength * sideLength; > } Die Berechnungen sollen aber nicht in einer Funktion, sondern mit einem Makro erfolgen. Also: #define QuadArea (SideLength) ((SideLength) * (SideLength)) mfg.
Thomas Eckmann schrieb: > Karl heinz Buchegger schrieb: >> double QuadArea( double sideLength ) >> { >> return sideLength * sideLength; >> } > > Die Berechnungen sollen aber nicht in einer Funktion, sondern mit einem > Makro erfolgen. Nochmal die Aufgabenstellung genau lesen, wofür Funktionen und wofür Makros gefordert sind? Was ich mir auf den Hut schreiben muss: Für das Quadrieren selber war ein Makro gefordert. Wenn schon exakt entsprechend der AUfgabenstellung, dann daher so
1 | #define QUADRAT(x) (x) * (x)
|
2 | |
3 | double QuadArea( double sideLength ) |
4 | {
|
5 | return QUADRAT( sideLength ); |
6 | }
|
Aber eigentlich machen wir jetzt immer mehr die Hausaufgaben des Fragestellers.
Karl heinz Buchegger schrieb: > system( "PAUSE" ); aber doch bitte nicht nicht system, sotwas sollte man niemand als beispiel geben, keine ahnung woher diese unsitte kommt.
Peter schrieb: > Karl heinz Buchegger schrieb: >> system( "PAUSE" ); > > aber doch bitte nicht nicht system, sotwas sollte man niemand als > beispiel geben, keine ahnung woher diese unsitte kommt. Geb ich dir recht. Aber wenn es ihnen ihr Lehrer so gezeigt hat, dann ist es nicht besonders schlau, da jetzt dazwischenzufunken.
Peter schrieb: > aber doch bitte nicht nicht system, sotwas sollte man niemand als > beispiel geben, keine ahnung woher diese unsitte kommt. Das hat mit "exe-File-im-Explorer-Doppelklickern" zu tun, die nicht in der Lage sind, Konsolapplikationen aus einem Konsolenfenster heraus zu starten.
Rufus t. Firefly schrieb: > Das hat mit "exe-File-im-Explorer-Doppelklickern" zu tun, die nicht in > der Lage sind, Konsolapplikationen aus einem Konsolenfenster heraus zu > starten. das ist aber auch kein grund für system, dafür kann man ja auch getc verwenden.
Rufus t. Firefly schrieb: > Das hat mit "exe-File-im-Explorer-Doppelklickern" zu tun, die nicht in > der Lage sind, Konsolapplikationen aus einem Konsolenfenster heraus zu > starten. Bzw. mit einem VC++, das nach dem Start der frisch kompilierten Konsolenanwendung das Fenster gleich wieder wegwirft. Deine Begründung kann natürlich trotzdem stimmen, wenn die Entwickler bei Ms ebenfalls solche exe-File-im-Explorer-Doppelklicker sind.
Klaus Wachtler schrieb: > Bzw. mit einem VC++, das nach dem Start der frisch kompilierten > Konsolenanwendung das Fenster gleich wieder wegwirft. Warum auch nicht, wenn man das Programm nicht im Debugger laufenlässt?
KeX schrieb: > Was für einen > Effekt beobachten Sie, wenn Sie an Ihr Makro zum Quadrieren von Zahlen > i++ für eine int-Variable i übergeben? Wie erklärt sich dieser Effekt? Auwa, ist klar worauf der Dozent hier hinaus will, aber ist das nicht streng genommen undefiniertes Verhalten?
Rufus t. Firefly schrieb: > Warum auch nicht, wenn man das Programm nicht im Debugger laufenlässt? Wenn das Programm keine interessante Ausgabe produziert, ist es ja egal. Aber ich will gar nicht wissen, wieviele Leute irgendwo in den unendlichen Weiten des Internet herumfragen, weil sie ein Hallo Welt geschrieben haben, aber das Hallo Welt nicht sehen - und gar nicht selbst schuld daran sind. Gerade die wenigen, die lobenswerterweise einen K&R nehmen und danach arbeiten, sehen - nichts. So kommt es dann dazu, daß irgendeiner sich daran erinnert, das es mit system("PAUSE") doch mal besser geklappt hat und schon nimmt der Murks seinen Lauf. Sinnvoller fände ich es zumindest als Voreinstellung) schon, wenn die IDE bei Programmende das Fenster noch offen halten würde. Gerade bei einfachen Standard-C-Programmen, die ja als Ausgabe nur stdout und stderr haben, ist es doof, wenn genau das unterdrückt wird. Genau genommen fehlt ein zusätzlicher Projekttyp: neben GUI und Konsole sollte es einen geben, der nicht einmal das DOS-Fenster braucht und einfach nur ohne Interaktion läuft. (Aber mich betrifft es gottlob nicht, weil ich eh fast nur ohne IDE arbeite.)
Imon schrieb: > KeX schrieb: >> Was für einen >> Effekt beobachten Sie, wenn Sie an Ihr Makro zum Quadrieren von Zahlen >> i++ für eine int-Variable i übergeben? Wie erklärt sich dieser Effekt? > > Auwa, ist klar worauf der Dozent hier hinaus will, aber ist das nicht > streng genommen undefiniertes Verhalten? Ist es. Man kann aber auch andere Makros konstruieren, die nicht auf undefiniertem Verhalten beruhen und trotzdem auf den ersten Blick überraschende Ergebnisse liefern #define MAX( a, b ) ( a > b ? a : b ) Für a oder b nach belieben i++ oder j++ einsetzen. Da ist es dann besonders lustig alle Fälle durchzuspielen :-)
Es geht noch lustiger: Was liefert bei deinem MAX der Ausdruck MAX( 4&4, 2&2 ) ?
@KeX >Habe mir ein Buch bei Amazon*.de bestellt ;) werd da dann alles nochmal >nachlesen. Schon mal gehört? es gibt an deiner Uni so'n Ding, nennt sich Bibliothek, da kann man diese Bücher umsonst ausleihen. (Wichtiger Hinweis: das Ausleihen eines Buches führt nicht automatisch zur Erlangung des darin enthaltenen Wissens..)
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.