www.mikrocontroller.net

Forum: PC-Programmierung C-programmieren Problem


Autor: KeX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Progger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: codehamster (Gast)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: Progger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: KeX (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdio.h>
#include <stdlib.h>

double QuadArea( double sideLength )
{
  return sideLength * sideLength;
}

int main ()
{
  int side;
  double Area;

  printf( "Quadratberechnung\n" );

  for( side = 1; side < 101; ++side )
  {
    Area = QuadArea( side );
    printf( "Seitenlaenge %d, Fläche %lf\n", side, Area );
  }

  system( "PAUSE" );
}

Fertig. Mehr ist nicht notwendig um die Vorgaben der Aufgabenstellung 
(fürs erste) zu erfüllen.

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
#define QUADRAT(x)   (x) * (x)

double QuadArea( double sideLength )
{
  return QUADRAT( sideLength );
}

Aber eigentlich machen wir jetzt immer mehr die Hausaufgaben des 
Fragestellers.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Imon (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht 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.)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Klaus Wachtler (mfgkw)
Datum:

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

Autor: berliner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.