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...
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.
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
doubleQuadArea(doublesideLength)
5
{
6
returnsideLength*sideLength;
7
}
8
9
intmain()
10
{
11
intside;
12
doubleArea;
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
doubleQuadArea(doublesideLength)
4
{
5
returnQUADRAT(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 :-)
@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..)