Forum: PC-Programmierung C-programmieren Problem


von KeX (Gast)


Lesenswert?

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

von Progger (Gast)


Lesenswert?

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...

von codehamster (Gast)


Lesenswert?

gefordert ist ein makro um zwei zahlen zu quadrieren nicht für den 
Flächeninhalt =)

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

Es gibt übrigens auch Bücher über C, falls du in der Vorlesung krank 
warst.

von Progger (Gast)


Lesenswert?

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

von KeX (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Thomas E. (thomase)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Peter (Gast)


Lesenswert?

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.

von Klaus W. (mfgkw)


Lesenswert?

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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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?

von Imon (Gast)


Lesenswert?

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?

von Klaus W. (mfgkw)


Lesenswert?

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.)

von Karl H. (kbuchegg)


Lesenswert?

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 :-)

von Klaus W. (mfgkw)


Lesenswert?

Es geht noch lustiger:
Was liefert bei deinem MAX der Ausdruck MAX( 4&4, 2&2 ) ?

von berliner (Gast)


Lesenswert?

@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
Noch kein Account? Hier anmelden.