• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

C-Programmierkurs: "erster Tag"

Mumie

Hacker
Hallo,
ich möchte gern C lernen. Und suche dafür Mitstreiter. Ich habe
mir diesen Kurs ausgesucht:

http://wwwuser.gwdg.de/~kboehm/ebook/inhalt.html

Der Kurs besteht aus einer Einführung und 21 "Tagen". Ich habe jetzt den "ersten Tag" durchgearbeitet. Ich denke, ich schaffe
jeden Tag in einer Woche, wenn ich mich anstrenge. Der Kurs ist
übrigens für Anfänger ohne Vorkenntnisse. Ich selbst habe früher in der Schule mal Pascal gelernt. Ich habe auch schon ein paar
Fragen:
1) Die Übung 2 des ersten Tages. Es handelt sich offenbar um den Flächeninhalt des Kreises. Ich erhalte als Ergebnis nur eine ganze Zahl.
2) Aufgabe 6.
Wenn ich in Übung 3 diese Zeile printf( "%c", 1 ); einsetze, dann erhalte ich Leerzeichen. Es sollen aber Diamanten sein.

Viele Grüsse
Mumie
 

gerhard001

Newbie
1: #include <stdio.h>
2:
3: int radius, flaeche;
4:
5: int main(void)
6: {
7: printf( "Geben Sie einen Radius ein (z.B. 10): " );
8: scanf( "%d", &radius );
9: flaeche = (int) (3.14159 * radius * radius);
10: printf( "\n\nFläche = %d\n", flaeche );
11: return 0;
12: }

Wenn ich mir das ganze ansehe dann frag ich mich, warum die die variablen radius und flaeche als integer definieren, anschließend den radius als double wert einlesen und dann einen typecast auf integer machen :shock: (Hoffe ich habe jetzt nichts falsches gesagt, ist immerhin schon 3 jahre her wo ich c++ programimert habe)

probier mal den code hier aus:

1: #include <stdio.h>
2:
3: long float radius, flaeche;
4:
5: int main(void)
6: {
7: printf( "Geben Sie einen Radius ein (z.B. 10): " );
8: scanf( "%lf", &radius );
9: flaeche = (3.14159 * radius * radius);
10: printf( "\n\nFläche = %lf\n", flaeche );
11: return 0;
12: }

hoffe der funktioniert, wie gesagt ist schon lange her dass ich c++ programmiert habe.

zu frage 2:

wenn ich mich nicht irre wird hier einfach das ascii zeichen mit der nummer 1 eingefügt. da die ascii zeichen von 0 bis 31 allerdings die nicht druckbaren zeichen sind (zeichen mit denen geräte angesteuert werden) denke ich, dass du deswegen nur leerzeichen bekommst. probier mal statt 1 die zahl 42 aus. dann müssten alles * erscheinen.

hoffe ich habe jetzt wirklich keinen quatsch verzapft und konnte dir helfen!

mfg gerhard
 

TeXpert

Guru
gut dann schau ich mal ob ich Licht ins Dunkel bringen kann ;)


auf die relevanten zeilen gekürzt:
gerhard001 schrieb:
3: int radius, flaeche;

8: scanf( "%d", &radius );

9: flaeche = (int) (3.14159 * radius * radius);

10: printf( "\n\nFläche = %d\n", flaeche );

3: also als Ganzzahl deklariert -> nur Ganzzahlen
8: hier wird auch nur eine Ganzzahl eingelesen!
9: egal was bei der Rechnung rauskommt, das Ergebnis wird auf eine Ganzzahl gecastet
10: hier wird wieder eine Ganzzahl ausgegeben,


Kurz: wenn das mit Fließkommazahlen laufen soll, dann bitte so:

Code:
#include <stdio.h>

float radius, flaeche;

int main(void)
{
  printf( "Geben Sie einen Radius ein (z.B. 10): " );
  scanf( "%f", &radius );
  flaeche = (3.14159 * radius * radius);
  printf( "\n\nFläche = %f\n", flaeche );
  return 0;
}

(bitte erst Versuchen die Unterschiede anhand eines C-Buches zu verstehen ;) und erst dann hier nachfragen... )
[/code]
 

gerhard001

Newbie
also stimmt mein code sowieso:

probier mal den code hier aus:

1: #include <stdio.h>
2:
3: long float radius, flaeche;
4:
5: int main(void)
6: {
7: printf( "Geben Sie einen Radius ein (z.B. 10): " );
8: scanf( "%lf", &radius );
9: flaeche = (3.14159 * radius * radius);
10: printf( "\n\nFläche = %lf\n", flaeche );
11: return 0;
12: }

long float hat nur einen größeren wertebereich als float.

(bitte erst Versuchen die Unterschiede anhand eines C-Buches zu verstehen Wink und erst dann hier nachfragen... )
Bitte erst GENAU die Antworten lesen und dann posten :wink:
 

TeXpert

Guru
die Grundidee funktioniert, aber wir reden hier von C also schauen wir in den Kernighan/Richie -> Anhang A Sprachbeschreibung (A.8.2)

Typen (gekürzt):
float
double

Kommentar (gekürzt):
Long darf zusammen mit double angegeben werden.

jetzt füttern wir das ganze in den gcc und ganz brav meldet der bei einem
Code:
long float foo;
ein
$ gcc -o foo foo.c
foo.c:5: error: long or short specified with floating type for `foo'
foo.c:5: error: the only valid combination is `long double'

Du redest von C++, auch stroustrup kennt nur float, double, long double...

die Einzige Sprache bei der es bei mir bei long float klingelt ist irgendein Lisp-Dialekt (oder alle ?) keine Ahnung...
 
OP
M

Mumie

Hacker
Aha! "alles klar" !

Naja, den Flächeninhalt vom Kreis habe ich jetzt soweit hingekriegt.
Und auch mehr oder weniger verstanden.
Auch das mit den Zeichen habe ich jetzt so halb hinbekommen.
Ich habe da ein Programm geschrieben:

#include <stdio.h>

int x,y;

int main(void)
{
for ( x = 0; x < 350; x++ )
printf("\nZeichennummer: %d,%c",x,x);

return 0;
}

Es läuft, allerdings gibt es ein paar Meldungen während der Laufzeit des Programmes. Und ich weiß immer noch nicht, welches Zeichen der Diamant sein soll. Die Funktion printf finde ich ziemlich schwierig. Ich habe mir noch einmal das Beispiel 2 aus der Einführung angeschaut:

#include <stdio.h>

int main (void)

{

printf ("Dieser Befehl gibt ein Zeichen, %c\neine Zahl,

%d\nund eine Fließkommazahl, %f\naus ", 'z', 123, 456.789);

return 0;

}

Da steckt tatsächlich mehr dahinter, als ich zuerst dachte. Das mußte ich mir eine ganze Weile anschauen, bis mir das alles (halbwegs) klar wurde. Ich hoffe, das wird in dem Kurs noch näher erklärt.

Viele Grüsse
Mumie
 

TeXpert

Guru
Mumie schrieb:
Da steckt tatsächlich mehr dahinter, als ich zuerst dachte. Das mußte ich mir eine ganze Weile anschauen, bis mir das alles (halbwegs) klar wurde. Ich hoffe, das wird in dem Kurs noch näher erklärt.

im Prinzip ist das ganz einfach, printf bekommt eine varable Argumentliste, d.h. die Funktion weiß vorher nohc nicht, wie viele Parameter sie bekommt.

Konkret geht ein Formatstring (zeichenkette mit potentiellen Platzhaltern) und eine Reihe von Werten.

minimal: printf("Hallo Welt\n") --> hier stehen in der Zeichenkette keine Platzhalter, also muss nichts ersetzt werden, weiterhin ist die Werteliste leer

printf("Hallo Welt\n", 35) --> hier werden zusätzliche Werte übergeben, da aberkeine Platzhalter vorkommen werden die einfach ignoriert.

printf("Zahl: %d\n", 25, 35, 45); --> hier kommen im Formatstring Platzhalter (%d) also genau einer vor -> das erste Element der Werteliste wird verwendet, der Rest ignoriert.

die Platzhalter werden von links nach rechts mit den Parametern ersetzt: printf("1==%d 2==%d 3==%d\n", 1,2,3)

Dann musst Du nur noch dafür sorgen, dass der Platzhalter und der entsprechende Wert vom gleichen Typ sind.
 
OP
M

Mumie

Hacker
Ich bin nun beim zweiten Tag. Und ich stelle jetzt mal keine Frage. Aber ich muß hier was kommentieren.
Also: Der Kurs ist mir sehr angenehm. Ja! Man lernt leicht. Aber es sind hier scheinbar doch eine Menge Fehler. Ich habe mir vom 2. Tag die Übung 5 angeschaut. Das Programm soll die Länge einer Zeichenkette ausgeben. Aber das Programm verzählt sich! Es zählt eins zu viel. Also so was! Während meiner Programmierübungen habe ich gemerkt, das man doch sehr schnell sehr viele Fehler macht. - Ja. - Aber hier in einem Lehrbuch sollten die Übungsprogramme doch mal getestet sein. Das hat der Autor offensichtlich nicht gemacht. Schade. Trotzdem werde ich diesen Kurs zuende machen. Er ist einfach zu gut.

Viele Grüsse
Mumie
 

oc2pus

Ultimate Guru
ändere mal deinen Topic um (erster Tag ist vorbei ...)

das mit dem 1 zuviel, liegt mit grosser Wahrscheinlichket daran, das in c/c++ alle Vektoren etc NULL-Basiert sind!

Das ist ein "beliebter" Fallstrick, auch bei Profis :)
 
OP
M

Mumie

Hacker
Das y ist überflüssig. Das ist übriggeblieben. Ich habe den Programmrumpf aus der Übungsaufgabe verwendet. Auch das void ist überflüssig.

Viele Grüsse
Mumie
 

Keepers

Advanced Hacker
oc2pus schrieb:
ändere mal deinen Topic um (erster Tag ist vorbei ...)

das mit dem 1 zuviel, liegt mit grosser Wahrscheinlichket daran, das in c/c++ alle Vektoren etc NULL-Basiert sind!

also char[4] hat nicht 4 sondern 5 Elemente. Das ist ein "beliebter" Fallstrick, auch bei Profis :)

sicher?

ich haette jetzt gesagt char[4] hat 4 Elemente {0,1,2,3}... hab ich da was falsches im Kopf?
 

oc2pus

Ultimate Guru
Keepers schrieb:
oc2pus schrieb:
ändere mal deinen Topic um (erster Tag ist vorbei ...)

das mit dem 1 zuviel, liegt mit grosser Wahrscheinlichket daran, das in c/c++ alle Vektoren etc NULL-Basiert sind!

also char[4] hat nicht 4 sondern 5 Elemente. Das ist ein "beliebter" Fallstrick, auch bei Profis :)

sicher?

ich haette jetzt gesagt char[4] hat 4 Elemente {0,1,2,3}... hab ich da was falsches im Kopf?

sag ich doch ... Fallstrick, auch bei Profis :)
ja du hast recht *schäm* zu schnell gepostet. Immer die Finger zum zählen nehmen ... bis 10 geht das wunderbar.
 

oc2pus

Ultimate Guru
done ;)

aber durch eure Zitate ist es dokumentiert ... ich habe einen Fehler gemacht .. Ich habe einen Fehler gemacht ..ich habe einen Fehler gemacht :twisted:
 

oc2pus

Ultimate Guru
hm, du darfst dir ein RPM wünschen ...
oder ich muss Yehudi 10x eine "ordentliche" Antwort geben ...
oder ich nehme dich mit, zum jacklab Meeting im Herbst :)
oder ich muss das Forum verlassen ...
oder ich darf nie wiede rnach zwei Flaschen Wein posten hier ...

richtet mich :)
 

}-Tux-{

Hacker
oc2pus schrieb:
hm, du darfst dir ein RPM wünschen ...
hmm ne das mach ich lieber selbst :wink:

oc2pus schrieb:
oder ich muss Yehudi 10x eine "ordentliche" Antwort geben ...
<edit> nochmal anders überlegt </edit>

oc2pus schrieb:
oder ich nehme dich mit, zum jacklab Meeting im Herbst :)
lol - das wird aber ein großer umweg

oc2pus schrieb:
oder ich muss das Forum verlassen ...
nee... dann kann ich ja (sowie gerade) nicht mehr richten *g*

oc2pus schrieb:
oder ich darf nie wiede rnach zwei Flaschen Wein posten hier ...
hehe...

naja da war irgendwie noch nicht das richtige bei :)
 
Oben