PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Einfach C Fragen


AtTheEndofAugust
2008-07-04, 12:56:16
Auch wenn der Compiler mir eine Fehler meldet, bekomm ich bei dem Code Murks raus!


WOran liegt das?


#include<stdio.h>
#define MAXANZAHL 100
void main ()
{
int anzahl, minimum, posmin, i;
int liste[MAXANZAHL];


printf("\n Bitte Anzahl zwischen 1 und 100 eingeben");
scanf("%d",&anzahl);

if (anzahl>1 || anzahl< MAXANZAHL)


{
printf("\n %3d. Zahl zwischen -100 und 100 eingeben:",i+1);
scanf ("%d", &liste[i]);
}

else printf("Falsche anzahl");


}

Gast
2008-07-04, 12:58:21
Du benutzt i ohne vorher einen Wert dafür festgelegt zu haben

AtTheEndofAugust
2008-07-04, 13:20:51
mh okay, aber eigentlich müsste er mir doch bei der ersten eingabe, wenn ich eine zahl > 100 eingebe, ausgeben "falsche Anzahl"

creave
2008-07-04, 13:26:11
mh okay, aber eigentlich müsste er mir doch bei der ersten eingabe, wenn ich eine zahl > 100 eingebe, ausgeben "falsche Anzahl"


Nein, wenn du eine Zahl größer 100 eingibst, ist der folgende Ausdruck nicht falsch sondern wahr:

if (anzahl>1 || anzahl< MAXANZAHL)


Wenn du beide Bedingungen (>1, <100) gleichzeitig erfüllt haben möchtest, musst du schon das || durch && ersetzen.

pest
2008-07-04, 13:28:37
deine Logikoperation ist falsch muss ein and sein. (&&)

AtTheEndofAugust
2008-07-04, 13:49:38
bolsche Algebra, hab mal wiedr nen Brett vorm Kopf, es muss ja nur eine Beindung erfüllt sein!

Danke dir


Aber, mit nem && funktioniert es auch nicht irgendwie, also dass nur ins if gegangen wird, wenn bides war ist! Wenn ich dann 1000 eingebe geht er auch rein, weswegen auch immer

pest
2008-07-04, 13:54:32
nope, das geht.

TheGamer
2008-07-04, 14:36:31
bolsche Algebra, hab mal wiedr nen Brett vorm Kopf, es muss ja nur eine Beindung erfüllt sein!

Danke dir


Aber, mit nem && funktioniert es auch nicht irgendwie, also dass nur ins if gegangen wird, wenn bides war ist! Wenn ich dann 1000 eingebe geht er auch rein, weswegen auch immer

Bei MAXANZAHL = 100 und

if (anzahl > 1 && anzahl < MAXANZAHL)

macht er das mit Sicherheit nicht, nein ;)

AtTheEndofAugust
2008-07-05, 17:29:42
wieso lässt mich der folgende Code immer wieder wenn ich 10 Zahlen eingegeben habe, neue Zahlen ab 2 eingeben und wiederum bis 10 und immer so weiter?

als ich statt <= NZAHLEN nur < NZAHLEN genommen habe gings

#include <stdio.h>

#define NZAHLEN 10

int main(void)
{
int i;
int zahlen[NZAHLEN]; /* zahlen[0] ... zahlen[9] */

for (i=0; i <= NZAHLEN; i++)
{
printf ("Bitte Zahl %d eingeben: ", i);
scanf ("%d", & zahlen[i]);
printf ("\n");
}

printf ("Super!\n");

for (i=0; i < NZAHLEN; i++)
printf ("Zahl %d ist: %d\n", i, zahlen[i]);

return 0;
}

Trap
2008-07-05, 17:33:37
Weil bei <=NZAHLEN ein Wert in &zahlen[10] geschrieben wird und das undefiniertes Verhalten erzeugt.

Gast
2008-07-05, 17:34:12
#include <stdio.h>

#define NZAHLEN 10


int zahlen[NZAHLEN]; /* zahlen[0] ... zahlen[9] */

for (i=0; i <= NZAHLEN; i++)
scanf ("%d", & zahlen[i]);


Wie du schon richtig in deinem Code Kommentar erkannst hast gibt es zahlen[0] bis [9] aber NICHT 10
Bei for machst du aber ein i <= 10, also i geht BIS inklusive 10
und dann verwendest du mit scanf eben das nicht allokierte zahlen[10]

AtTheEndofAugust
2008-07-05, 18:00:09
okay danke euch hab noch ne Frage, warum geht das nicht?

Sondern nur mit Arrays?

Warum kann ich nicht immer neu auf summe speichern, ein jedes mal wenn die for schleife durchgeht?



#include <stdio.h>


void main ()

{

int alter;
int anzahl;
int personen;
int i;
int durchschnitt, summe=0, durschnitt;



printf ("Wieviele Personen?\n");
scanf ("%d",&anzahl);


for (i=0; i<anzahl; i++)

{ printf ("Bitte Alter der %d. Person angeben", i+1);
scanf ("%d", &alter);

summe=summe+alter;


}


durschnitt=summe/anzahl;

printf ("Das Durchschnittsalter der %d Personen liegt bei %d Jahren", anzahl, durchschnitt);

}

AtTheEndofAugust
2008-07-05, 19:24:39
wenn ich in meinem code 3 Funktionen habe (eine davon die main funktion), so wird diese doch immer zuerst aufgerufen oder?

Gast
2008-07-05, 19:29:29
wenn ich in meinem code 3 Funktionen habe (eine davon die main funktion), so wird diese doch immer zuerst aufgerufen oder?

Richtig, deswegen gibt es die main() ja. Das Betriebsystem muss ja beim starten des Programms irgendeine Funktion aufrufen.

Gast
2008-07-05, 19:37:44
int durchschnitt, summe=0, durschnitt;
durschnitt=summe/anzahl;

printf ("Das Durchschnittsalter der %d Personen liegt bei %d Jahren", anzahl, durchschnitt);



Fällt dir was auf?
Du berechnest den durchschnitt in durschnitt aber nutzt printf() mit durchschnitt

AtTheEndofAugust
2008-07-05, 19:43:09
oh man !

Danke euch, also ist es lediglich eleganter das durch arrays zu machen ja?

Coda
2008-07-05, 20:17:40
Verwende doch bitte den code-Tag für sowas.

AtTheEndofAugust
2008-07-06, 13:20:31
Sobald ich ein n > 16 eingebe, gibt er mir negative fakultäten aus!

Kann mir jemand sagen wieso?





#include <stdio.h>
int fakultaet (int n)
{
int k; /* lokale Hilfsvariable */
if (n==0) k=1; /* Endebedingung! */
else {
if (n>0) k=(fakultaet(n-1))*n;
};
return k;
}






void main()
{
int fakult,n;
printf("\n Fakultaet von n=");scanf("%d",&n);
fakult=fakultaet(n); //funktionsaufruf
printf("\n %3d ! ist %d \n",n,fakult);
}

Gast
2008-07-06, 13:32:53
das Problem ist das du einen signed int benutzt
int ist 32bit maximal wert also 2^32 = 4 GiB
signed aber braucht das vorderste Bit für das Vorzeichen also + oder -
also 2^31 = 2 GiB
Deswegen wird bei einem Ergebnis über 2 Millionen ein - angezeigt
Da du in diesem Fall gar keine negativen Zahlen brauchst nimm am besten unsigned int oder gar unsigned long long
long auf 32bit ist auch 32bit auf 64bit wäre long 64bit
long long ist immer 64bit
für unsigned int musst dann %u verwenden statt %d
bei unsigned long long dann %llu
bei unsgined long %lu

SGT.Hawk
2008-07-06, 13:34:28
Bereichsüberlauf.

Gast
2008-07-06, 13:36:50
http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_007_009.htm#RxxobKap0070090400263E1F01618C

Solltest vielleicht mal ein bissl in dem OpenBook rumschnüffeln
Hab dir mal die Seite mit den Limits verlinkt, wobei dort nichts von 64bit long bzw. long long steht
aber sind halt bei signed eben 2^63 bit und bei unsigned 2^64 bit

AtTheEndofAugust
2008-07-06, 14:47:21
wow danke euch vielmals =)

AtTheEndofAugust
2008-07-06, 21:19:50
Wie geht man bei solchen Codes am besten vor? ich bekomm schon beim Anblick Pani und weiss nicht wie ich anfangen soll, ihn zu durchforsten und zu verstehen


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NMAX 100000
void main() {
int a[NMAX];
int i,j,temp,currsize;
long start, stop;
srand((unsigned)time (NULL));
for (currsize=10000; currsize<=NMAX; currsize=currsize+10000) {
for (i=0;i<currsize;i++) a[i]=rand()%currsize;
start=clock();
for (i=0;i<=currsize-2;i++)
{for (j=i+1;j<=currsize-1;j++)
{if (a[i]>=a[j]){temp=a[i]; a[i]=a[j]; a[j]=temp;}}
}
stop=clock();

pest
2008-07-06, 21:40:17
BubbleSort

AtTheEndofAugust
2008-07-06, 21:48:56
soll mir jetzt was sagen?

robobimbo
2008-07-06, 21:52:10
Erstmal den Code lesbararer machen durch "schönere" Formatierung - dann die Sachen kommentieren die Du leicht verstehst.

Funktionen nachschlagen die aus Libraries aufgerufen werden - schauen welche Parameter kommen rein, was kommt wieder raus.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define NMAX 100000 /* Präprozessordirektive, die sagt: Ersetze jedes Vorkommen der Zeichenkette NMAX im Quelltext mit 100000 */
void main()
{
int a[NMAX]; /* Deklariert ein Array aus Integern mit 100.000 Einheiten*/
int i,j,temp,currsize; /* Variablendeklaration */
long start, stop; /* Variablendeklaration */
srand((unsigned)time (NULL)); /* Funktionsaufruf aus der library stdlib.h - Siehe auch http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_022_003.htm#RxxobKap02200304002B751F0481C6 */

/* Eine For-Schleife die in 10000er Schritten von 10000 bis NMAX (100000) zählt*/
for (currsize=10000; currsize<=NMAX; currsize=currsize+10000)
{
/* Eine For-Schleife die in 1er Schritten von 0 bis zum aktuellen Wert von currsize zählt (currsize verändert sich durch die erste schleife!) */
/* Diese For-Schleife hat nur ein Statement - daher wurden da die geschwungenen Klammern weggelassen */
/* Das innere Statement der Schleife weist dem i.ten Element den Wert eine Zufallszahl aus dem Bezeich 0 - currsize zu (Siehe auch Funktionsweise des Modulooperators %) */
for (i=0;i<currsize;i++) a[i]=rand()%currsize;
/* start soll wohl so eine art zeitmessung sein... */
start=clock();
/* Eine For-Schleife die in 1er Schritten von 0 bis zum aktuellen Wert von currsize - 2 zählt (currsize verändert sich durch die allererste schleife!) */
for (i=0;i<=currsize-2;i++)
{
/* Eine For-Schleife die in 1er Schritten von i + 1 (wird definiert durch die Schleife davor) bis zum aktuellen Wert von currsize - 1 zählt (currsize verändert sich durch die allererste schleife!) */
for (j=i+1;j<=currsize-1;j++)
{
/* Das sind drei Statements in eine Zeile geschrieben. Hier werden nur zwei Werte verglichen (aus dem Array) - und wenn das grössere weiter "vorne" steht, dann wechseln die beiden die Postion */
/* Es ist ein sehr einfacher Sortieralgorithmus - nicht schnell, aber einfach zu verstehen. */
if (a[i]>=a[j]){temp=a[i]; a[i]=a[j]; a[j]=temp;
}
}
}
stop=clock();
}

AtTheEndofAugust
2008-07-06, 21:57:47
vielen dank für deine Mühe!


Ist das das Bubble Sortverfahren?

robobimbo
2008-07-06, 22:11:26
ja

an.zgep
2008-07-07, 15:15:18
wenn du ernsthaft code schreiben willst solltest du was für deinen programmierstil tun.

mal ein paar kleine tipps:
-variablen bei der deklaration auch immer gleich initialisieren

-aussagekräftige namen für variablen wählen. i, t, n, ... sind in einem jahr nicht mehr hilfreich, counter, temp_result, initial_value dagegen schon

-if(n==0) k=1; ist zwar möglich, trotzdem solltest du immer {} benutzen. nennt sich defensives programmieren und erleichtert die wartung und lesbarkeit.

AtTheEndofAugust
2008-07-07, 16:07:02
Ist nicht mein Code, ist der meines Professors, den ich versuche zu verstehen!

Ich programmiere sauberer - danke dennoch für die tips!

Also auch bei einzelnen Anweisungen, wie bei Anweisungsblöcken in {} setzen ja?

Sprechende Variablen nehm ich eigentlich auch!


Mal ne andere Frage!

While(true) ist doch eine endlos Schleife nicht?

Und was ist while() ?




Achja und wie kann ich einzelne Seiten eines PDF Dokuments abspeichern?

pest
2008-07-07, 17:18:06
warum kaufst du dir kein Buch?

Coda
2008-07-07, 17:36:44
Nichtmal das wäre nötig. Es gibt wohl mehr als genug Online-Resourcen über C/C++.

an.zgep
2008-07-10, 21:12:18
Ist nicht mein Code, ist der meines Professors, den ich versuche zu verstehen!

Ich programmiere sauberer - danke dennoch für die tips!

Also auch bei einzelnen Anweisungen, wie bei Anweisungsblöcken in {} setzen ja?

Sprechende Variablen nehm ich eigentlich auch!


Mal ne andere Frage!

While(true) ist doch eine endlos Schleife nicht?

Und was ist while() ?




Achja und wie kann ich einzelne Seiten eines PDF Dokuments abspeichern?

da machts dir dein prof aber nicht grade einfach:wink:

jepp, auch einzelne anweisungen immer in {}. kostet kein geld und erhöht wartbarkeit und lesbarkeit (besonders für kollegen. programmieren ist schon längst teamarbeit)

while(true) ist tatsächlich eine endlosschleife. ist oft das erste statement in einem programm für ein embedded system. while(){ ... } produziert übrigens einen compilerfehler

pdfs sind eigentlich dazu designt, nicht nachträglich verändert zu werden. wenn das dokument aber nicht durch zb passwort geschützt ist kannst du natürlich mit zb adobe acrobat (nicht reader!) die seiten die du nicht brauchst löschen.

AtTheEndofAugust
2008-07-12, 18:01:44
Hab da mal wieder ne für euch wahrscheinlich recht einfache Frage!

Und zwar sollen wir Matrizen einlesen und anschließend unterschiedlich ausgeben!

Ich möchte das Prozedere aber nicht stur auswendig lernen sondern lieber verstehen - haken tuts bei:

- Obere Dreiecks Matrix ausgeben (Versteh den Anweisungsblock nicht, bzw. hab Probleme ihn zu lesen)

- Hauptdiagonale ausgeben

- Matrix Schbrettartig ausgeben


#include <stdio.h>
#define MAXZ 10
#define MAXS 10

void main()
{ int mata[MAXZ][MAXS], matb[MAXZ][MAXS], matc[MAXZ][MAXS];
int n,i,j;
printf("\n Matrixgroesse 1<=n<=10 - n=");scanf("%d",&n);

for(i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
printf("\n eingeben ma[%2d][%2d]=",i+1,j+1);
scanf("%d",&mata[i][j]);
}
}
// zeilenweise ausgeben
printf("\n erste matrix lesen");
for(i=0;i<n;i++)
{ printf("\n");
for (j=0;j<n;j++)
{
printf(" %3d",mata[i][j]);
}
}


printf("\n zweite matrix lesen");
for(i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
printf("\n eingeben m[%2d][%2d]=",i+1,j+1);
scanf("%d",&matb[i][j]);
}
}
// zeilenweise ausgeben
for(i=0;i<n;i++)
{ printf("\n");
for (j=0;j<n;j++)
{
printf(" %3d",matb[i][j]);
}
}
// matrizen addieren und ergebnis ausgeben
for(i=0;i<n;i++)
{ printf("\n");
for (j=0;j<n;j++)
{
matc[i][j]=mata[i][j]+matb[i][j];
}
}
for(i=0;i<n;i++)
{ printf("\n");
for (j=0;j<n;j++)
{
printf(" %3d",matc[i][j]);
}
}

printf("\n obere dreiecksmatrix ausgeben");

for(i=0;i<n;i++)
{ printf("\n");
if (i>0) for (j=0;j<i;j++) printf(" ");
for (j=i;j<n;j++)
{
printf(" %3d",matc[i][j]);
}
}


printf("\n Hauptdiagonale ausgeben");

for(i=0;i<n;i++)
{ printf("\n");
printf(" %3d",matc[i][i]);
}

for(i=0;i<n;i++)
{ printf("\n");
for (j=i;j<=i;j++)
{
printf(" %3d",matc[i][j]);
}
}


printf("\n matrix rueckwaerts");

for(i=n-1;i>=0;i--)
{ printf("\n");
for (j=n-1;j>=0;j--)
{
printf(" %3d",matc[i][j]);
}
}


printf("\n matrix schachbrett");

for(i=0;i<n;i++)
{ printf("\n");
for (j=i%2;j<n;j=j+2)
{
printf(" %3d",matc[i][j]);
}
}


}

AtTheEndofAugust
2008-07-12, 19:13:53
Ähnliches Problem hier

#include <stdio.h>



void main()

{int i, j;

int a[5][5]={(0,1,2,3,4),(5,6,7,8,9),(10,11,12,13,14),(15,16,17,18,19),(20,21,22,23,24)};

for (i=0;i<5;i=i+2)

{
for (j=i;j<5;j=j+2)

{printf("%4d",a[i][j]); printf("\n"); }


}


}

Beim ersten Schleifendurchlauf ist i danach 2 und j 4


also müsste er auf das 4. Element in der 2 Zeile zugreifen

komischerweise sieht die Ausgabe aber so aus:

4
14
24
0
0
0


les ich die Schleife falsch???

Gast
2008-07-12, 19:22:02
Arrays beginnen bei 0 nicht 1
so 4 ist das 5. Element

AtTheEndofAugust
2008-07-12, 19:27:20
Ja okay, aber das i steht doch bei 2 und das j bei 4 nach dem ersten durchlauf beider Schleifen!

Somit müsste es doch die 8 sein?

Gast
2008-07-12, 19:31:53
int a[5][5]={(0,1,2,3,4),(5,6,7,8,9),(10,11,12,13,14),(15,16,17,18,19),(20,21,22,23,24)};

int[0][5]=(0,1,2,3,4)
int[1][5]=(5,6,7,8,9)
int[2][5]=(10,11,12,13,14)
int[3][5]=(15,16,17,18,19)
int[3][5]=(20,21,22,23,24)

int[2][0]=10
int[2][1]=11
int[2][2]=12
int[2][3]=13
int[2][4]=14

jetzt klar?

Gast
2008-07-12, 19:32:23
ach ups, das 2. int[3][5] soll natürlich int[4][5] sein

AtTheEndofAugust
2008-07-12, 19:38:17
Also seh ich das richtig, dass die i Schleife erst nachdem die in die j schleife gegangen ist, erhöht wird?

Aber in der j Schleife mit dem inkrementierten i gearbeitet wird?

Dann befände ich mich in der ersten Zeile wie gewollt, aber nach dieser Logik müsste doch dann auch das "noch nicht erhöhte j" an die Printf anweisung übergeben werden oder?

Bin verwirrt

Gast
2008-07-12, 19:49:20
Ach sorry mein Fehler
Habs grad mal unter Linux mit GDB analysiert

(gdb) print a
$6 = {{4, 9, 14, 19, 24}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}}

das int a wird wie du siehst anders gesetzt als du es eigentlich willst.

Gast
2008-07-12, 19:52:03
statt den () musste { } verwenden

AtTheEndofAugust
2008-07-12, 23:14:36
ich verstehs einfach nicht, wie kommt er an die 24 und die drei Nullen?

AtTheEndofAugust
2008-07-12, 23:41:16
Okay danke habs jetzt endlich verstanden - durch falsche Notation auf dem Übungsblatt wurd eich verwirrt und 2 stunden gingen drauf =(


egal könnt ihr nochmal was zu dem Problem hier sagen?


Und zwar sollen wir Matrizen einlesen und anschließend unterschiedlich ausgeben!

Ich möchte das Prozedere aber nicht stur auswendig lernen sondern lieber verstehen - haken tuts bei:

- Obere Dreiecks Matrix ausgeben (Versteh den Anweisungsblock nicht, bzw. hab Probleme ihn zu lesen)

- Hauptdiagonale ausgeben

- Matrix Schbrettartig ausgeben
#include <stdio.h>
#define MAXZ 5
#define MAXS 5

void main()
{ int mata[MAXZ][MAXS], matb[MAXZ][MAXS], matc[MAXZ][MAXS];
int n,i,j;
printf("\n Matrixgroesse 1<=n<=10 - n=");scanf("%d",&n);

for(i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
printf("\n eingeben ma[%2d][%2d]=",i,j);
scanf("%d",&mata[i][j]);
}
}
// zeilenweise ausgeben
printf("\n erste matrix lesen");
for(i=0;i<n;i++)
{ printf("\n");
for (j=0;j<n;j++)
{
printf(" %3d",mata[i][j]);
}
}


printf("\n zweite matrix lesen");
for(i=0;i<n;i++)
{
for (j=0;j<n;j++)
{
printf("\n eingeben m[%2d][%2d]=",i+1,j+1);
scanf("%d",&matb[i][j]);
}
}
// zeilenweise ausgeben
for(i=0;i<n;i++)
{ printf("\n");
for (j=0;j<n;j++)
{
printf(" %3d",matb[i][j]);
}
}
// matrizen addieren und ergebnis ausgeben
for(i=0;i<n;i++)
{ printf("\n");
for (j=0;j<n;j++)
{
matc[i][j]=mata[i][j]+matb[i][j];
}
}
for(i=0;i<n;i++)
{ printf("\n");
for (j=0;j<n;j++)
{
printf(" %3d",matc[i][j]);
}
}

printf("\n obere dreiecksmatrix ausgeben");

for(i=0;i<n;i++)
{ printf("\n");
if (i>0) for (j=0;j<i;j++) printf(" ");
for (j=i;j<n;j++)
{
printf(" %3d",matc[i][j]);
}
}


printf("\n Hauptdiagonale ausgeben");

for(i=0;i<n;i++)
{ printf("\n");
printf(" %3d",matc[i][i]);
}

for(i=0;i<n;i++)
{ printf("\n");
for (j=i;j<=i;j++)
{
printf(" %3d",matc[i][j]);
}
}


printf("\n matrix rueckwaerts");

for(i=n-1;i>=0;i--)
{ printf("\n");
for (j=n-1;j>=0;j--)
{
printf(" %3d",matc[i][j]);
}
}


printf("\n matrix schachbrett");

for(i=0;i<n;i++)
{ printf("\n");
for (j=i%2;j<n;j=j+2)
{
printf(" %3d",matc[i][j]);
}
}


}

robobimbo
2008-07-13, 18:45:34
das ist zu einem böse - du definierst (mittels #define) maximale arraygrössen, du legst die arrays mit den maxima von 5 an - aber erlaubst dann aber dem benutzer arraygrössen bis zu 10 anzugeben, das heisst sobalde der benuzter 6 eingibt hast du ein problem weil dein programm einen bereichsüberlauf macht - unbedingt die defines anpassen!

obere dreiecksmatrix ausgeben:
Definition dreiecksmatrix: http://de.wikipedia.org/wiki/Obere_Dreiecksmatrix

Deine äussere Schleife (i) zählt ganz normal
- laut definiton der dreiecksmatrix - ist nur die erste zeile (index 0) komplett, daher da eine if abfrage damit das printf erst ab der zweiten zeile "greift". dann werden genau so viele leere elemente ausgegeben wie es schon zeilen gibt (dadurch dass aber bei 0 zu zählen begonnen wird, wird im endeffekt in der zweiten zeile nur 1 leeres element ausgegeben.

- in der inneren schleife wird der startwert abhängig vom aktuellen wert der äusseren schleife gesetzt. warum? das programm gibt ja vorher die richtige anzahl an leerelemente aus - und die musst du ja praktisch überspringen...

- die hauptdiagonale ist ja leicht - bei einer matrix die von 0 bis 3 geht ist die diagonale 0,0 1,1 2,2 3,3 - nichts anderes macht diese schleife

- schachbrett: die äussere schleife durchläuft jede zeile - abhängig in welcher zeile du gerade bist musst du ja für das schachbrettmuster entweder mit dem ersten feld (index 0) oder dem zweiten feld (index 1) beginnen. dafür ist die innere schleife zuständig - erreicht wird dass durch eine modulo-operation (i%2). wenn du nicht weisst was ein modulo operand macht, frag mal google. wenn dieser startwert bekannt ist, wird dann einfach in zweierschritten hochgezählt - weil du willst ja nur jedes zweite element ausgeben....

Gast
2008-07-14, 23:40:16
while(true) ist tatsächlich eine endlosschleife. ist oft das erste statement in einem programm für ein embedded system. while(){ ... } produziert übrigens einen compilerfehler


Habe dazu auch mal kurz ne Frage, wie ist das mit dem while(true) gemeint?
Benutzt du true jetzt einfach als Synonym dafür, dass der Ausdruck in der Klammer war ist, also != 0? weil das boolsche true gibt es ja nicht in C, wenn ich das nicht falsch verstanden habe.

Noch eine weitere Frage zum while: Microcontroller werden ja oftmals auch in C programmiert. Ich habe z.b. ein Tutorial gefunden, in welchem ein Microcontroller so programmiert wird, dass er im Sekundenabstand eine LED aufleuchten lässt. Der Code ist einfach:

pseudo:

while(1)
{
if (led == on)
dann ausmachen
else anmachen

2 Sekunden sleep
}


Ist das denn die typische Art, soetwas zu regeln? Denn der Microcontroller kann ja in der Zeit nichts anderes tun (außer mit mehrern Threads, aber weiß nicht inwiefern das mit einem Micocontroller möglich ist).

Gast
2008-07-14, 23:42:31
Habe dazu auch mal kurz ne Frage, wie ist das mit dem while(true) gemeint?
Benutzt du true jetzt einfach als Synonym dafür, dass der Ausdruck in der Klammer war ist, also != 0? weil das boolsche true gibt es ja nicht in C, wenn ich das nicht falsch verstanden habe.


http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_022_008.htm#RxxobKap02200804002B7A1F020190

mit der stdbool.h wird true und false auf 1 und 0 definiert und auch ein bool typ eingeführt.

Gast
2008-07-15, 00:41:25
http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_022_008.htm#RxxobKap02200804002B7A1F020190

mit der stdbool.h wird true und false auf 1 und 0 definiert und auch ein bool typ eingeführt.

Jop aber das Schlüsselwort "true/false" lässt sich im Code ja nicht verwenden, dass wollte ich eigentlich wissen (also von Textersetzung durch den Präprozessor mal abgesehen).

Gast
2008-07-15, 00:55:04
(Ist drüber übrigens eine Frage, keine Feststellung)

Gast
2008-07-15, 09:06:30
Jop aber das Schlüsselwort "true/false" lässt sich im Code ja nicht verwenden, dass wollte ich eigentlich wissen (also von Textersetzung durch den Präprozessor mal abgesehen).

Du beantwortest dir die Frage doch damit selbst?
Klar ist es implementiert durch #define true 1 und damit mit dem Präprozessor
Aber was für ein Unterschied machts?
Wenn du selber ein #define MAXZ 5 machst wie im letzten Post von AtTheEndofAugust dann kannst es auch normal im Code verwenden
Der Präprozessor ist ja fester Bestandteil von C/C++
Man kann den wahrscheinlich irgendwie auch umgehen aber dann funktioniert auch nicht mal ein #include was man ja auch braucht
Es macht doch gar kein Unterschied ob der Präprozessor true auf 1 definiert oder ob true so wie in C++ direkt im Code erlaubt ist
Gibt es in C++ mit "richtigem" bool überhaupt einen Unterschied zwischen dem richtigen true/false und 1/0 ?

DocEW
2008-07-15, 10:01:58
Es macht doch gar kein Unterschied ob der Präprozessor true auf 1 definiert oder ob true so wie in C++ direkt im Code erlaubt ist.
Naja... was kommt denn im ersten Fall raus, wenn man "int a = true + true" schreibt? Müsste dann 2 sein, und zwar ohne jegliche Warnung, oder? Bei einem ordentlich definierten true sollte das nicht passieren.

Gast
2008-07-15, 10:26:58
Naja... was kommt denn im ersten Fall raus, wenn man "int a = true + true" schreibt? Müsste dann 2 sein, und zwar ohne jegliche Warnung, oder? Bei einem ordentlich definierten true sollte das nicht passieren.

Und wieso sollte man auf die Idee kommen int a = true + true zu schreiben?
Wo ist da der Sinn?

Gast
2008-07-15, 11:10:50
Und wieso sollte man auf die Idee kommen int a = true + true zu schreiben?
Wo ist da der Sinn?
Oh die Leute kommen auf die komischsten Ideen... ;) Deswegen ist es ja wichtig eine hieb und stichfest definierte Sprache zu haben. "Wird schon keiner so schreiben" gilt nicht.

lg

Xmas
2008-07-15, 11:26:29
Gibt es in C++ mit "richtigem" bool überhaupt einen Unterschied zwischen dem richtigen true/false und 1/0 ?
Ja, bei überladenen Funktionen macht dies einen Unterschied:
void test(bool);
void test(int);

test(true); // ruft die erste Funktion auf
test(1); // ruft die zweite Funktion auf

int a = true + true; funktioniert übrigens in VC++.

Gast
2008-07-15, 11:33:42
Ja, bei überladenen Funktionen macht dies einen Unterschied:
void test(bool);
void test(int);

test(true); // ruft die erste Funktion auf
test(1); // ruft die zweite Funktion auf

int a = true + true; funktioniert übrigens in VC++.

Ah, da merkt man das ich nicht so der C und C++ Coder bin ;)
Stimmt, an die überladenen Funktionen hab ich jetzt garnicht gedacht

Gast
2008-07-15, 11:42:31
Ja, bei überladenen Funktionen macht dies einen Unterschied:
void test(bool);
void test(int);

test(true); // ruft die erste Funktion auf
test(1); // ruft die zweite Funktion auf

int a = true + true; funktioniert übrigens in VC++.
Und was kommt raus? Eins oder zwei? *Neugier*

DocEW
2008-07-15, 12:21:00
Und wieso sollte man auf die Idee kommen int a = true + true zu schreiben?
Wo ist da der Sinn?
Wieso sollte man auf die Idee kommen, einen Pointer falsch zu setzen? Wo ist da der Sinn?
Bevor du jetzt schreibst, dass das was ganz anderes ist: Natürlich schreibt niemand "true + true" hin. Aber wenn du keinen eigenen Datentyp für bool hast, musst du ja wohl einen ganzzahligen Typ verwenden. Und dann hast du halt überhaupt keine Sicherheit mehr und kannst beliebige (unsinnige) Rechenoperationen drauf loslassen. Oder Funktionen aufrufen, die nicht für bool, sondern für Integer gedacht sind (Beispiel von Xmas) etc.

SGT.Hawk
2008-07-15, 16:07:57
Habe dazu auch mal kurz ne Frage, wie ist das mit dem while(true) gemeint?
Benutzt du true jetzt einfach als Synonym dafür, dass der Ausdruck in der Klammer war ist, also != 0? weil das boolsche true gibt es ja nicht in C, wenn ich das nicht falsch verstanden habe.

Noch eine weitere Frage zum while: Microcontroller werden ja oftmals auch in C programmiert. Ich habe z.b. ein Tutorial gefunden, in welchem ein Microcontroller so programmiert wird, dass er im Sekundenabstand eine LED aufleuchten lässt. Der Code ist einfach:

pseudo:

while(1)
{
if (led == on)
dann ausmachen
else anmachen

2 Sekunden sleep
}


Ist das denn die typische Art, soetwas zu regeln? Denn der Microcontroller kann ja in der Zeit nichts anderes tun (außer mit mehrern Threads, aber weiß nicht inwiefern das mit einem Micocontroller möglich ist).


Ja, ist der gangbare Weg, denn der MC soll ja nun nicht grossartig was anderes machen. Threading macht man sowieso nicht in MCs. Andererseits kann man, wenn es um besonders kritische I/O geht Interrupts verwenden.

Gast
2008-07-15, 17:16:37
Ja, ist der gangbare Weg, denn der MC soll ja nun nicht grossartig was anderes machen. Threading macht man sowieso nicht in MCs. Andererseits kann man, wenn es um besonders kritische I/O geht Interrupts verwenden.

Danke.
Naja, meine kleine Kaffeemaschine kann während eine Taste ständig blinkt noch auf einem einzeiligen Display diverse Dinge anzeigen, welche sich ändern lassen, die Pumpe fürs Wasser Steuern etc.. Oder muss man für sowas einfach mehr als nur einen MC verwenden?

Coda
2008-07-15, 18:32:19
Und was kommt raus? Eins oder zwei? *Neugier*
Da ein impliziter Cast von true auf einen int nach Standard 1 ergibt: 2. So undefiniert ist das gar nicht.

Wenn man die 2 nach bool castet hat man auch wieder 1 und nicht 2.

AtTheEndofAugust
2008-09-23, 18:22:09
Hab da mal wieder ne Frage oO

Wieso bekomme ich hier Fehlermeldungen? 21 Stück an der Zahl

#include <stdio.h>

#define MAX_zeil 5;
#define MAX_spal 5;

void main()

{int i, j;

int a[MAX_zeil][MAX_spal]={{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14},{15,16,17,18,19},{20,21,22,23,24}};

for (i=0;i<MAX_zeil;i=i+2)

{
for (j=i;j<MAX_spal;j=j+2)

{ printf("%4d",a[i][j]); printf("\n"); }


}


}

Trap
2008-09-23, 19:44:21
Lass mal nur den Präprozessor laufen, dann siehst du wo der Fehler ist.

Coda
2008-09-23, 20:18:53
Und genau deshalb ist der Präprozessor böse und man sollte C++ und const verwenden.

AtTheEndofAugust
2008-09-23, 21:51:22
und wieso lern ich dfann an meiner hochschule c und nicht c++?

gibts dafür nen plausiblen Grund? ich höre von vielen C++ sei besser


also ich check immer noch nicht woran das liegt

Gast
2008-09-23, 22:11:45
Hab da mal wieder ne Frage oO

Wieso bekomme ich hier Fehlermeldungen? 21 Stück an der Zahl

#include <stdio.h>

#define MAX_zeil 5;
#define MAX_spal 5;



Dort darf kein ; am Ende stehen, denn MAX_zeil und MAX_spal wird sonst durch 5; ersetzt was du sicherlich nicht willst.

Mr.Freemind
2008-09-23, 22:16:10
Ich denke du lernst C als Einstiegssprache oder? C ist eigentlich relativ gut um einen an das Programmieren zu führen. Du bekommst nen Einstieg in Schleifen( if, else), Umgang mit der Syntax und du kannst schön zum Anfang Algorithmen in Code knallen usw. usf..

Also mir hat es nicht weh getan am Anfang meines Studiums C zu lernen, der Rest kommt ja dann später :-)

In meinem Studium war der Aufbau in etwa so:

Programmieren 1 : C
Programmieren 2: C++
Programmieren 3: Java

Allerdings muss ich sagen das man das Programmieren nicht unbedingt an der Hochschule gelernt bekommt, sondern nur die Ansätze der Rest kommt dann in privaten und sehr sehr langen Nächten :-)

AtTheEndofAugust
2008-09-23, 22:31:06
Naja ich studier Mechantronik, habe also noch Elektrotechnik und Mechani in Hülle und Fülle!

Was anderes als C werden wir nicht mehr lernen

danke für eure Hilfe

Mr.Freemind
2008-09-23, 22:39:19
Ok, aber dennoch denke ich ist eine imperative Programmiersprache nicht der falsche Einstieg, wenn du eine Objektorientierte (C++, Java) dazu haben möchtest musst du dich dann wohl oder übel privat damit auseinandersetzen.

Kurz, als Einstieg ist es absolut nicht falsch was du da in deinem Studium lernst :smile:

noid
2008-09-23, 22:56:10
Und genau deshalb ist der Präprozessor böse und
man sollte C++ und const verwenden.

Ich dachte früher auch immer "mehr als #define braucht man nicht"....
Ich mag den Preprozessor, damit kann man so wunderschöne Dinge treiben X-D

und wieso lern ich dfann an meiner hochschule c und nicht c++?

gibts dafür nen plausiblen Grund? ich höre von vielen C++ sei besser


also ich check immer noch nicht woran das liegt

Weil die meisten C++ eh nicht verstehen und du mit C idR bei Mechatronik besser wegkommst. Wer lässt schon C++ auf einen Mikrocontroller los? :upuke:

RMC
2008-09-23, 23:13:54
Wieso bekomme ich hier Fehlermeldungen? 21 Stück an der Zahl


Wundere dich nie über die Fehleranzahl, die so ein Compiler ausspuckt ;)
Manchmal ist es nur eine Kleinigkeit, die dann eine ganze Reihe von Folgefehlern auslöst (besonders bei Präprozessoranweisungen und Headerfiles).

Coda
2008-09-24, 01:12:13
Weil die meisten C++ eh nicht verstehen und du mit C idR bei Mechatronik besser wegkommst. Wer lässt schon C++ auf einen Mikrocontroller los? :upuke:
Was genau wäre daran ein Problem?

noid
2008-09-24, 09:29:14
Was genau wäre daran ein Problem?

Kein Problem, nur bist du quasi eh gezwungen alles mit statischen Objekten zu machen (runtime, overhead). Und da kann ich auch C mit guten Strukturen schreiben.

Trap
2008-09-24, 11:30:41
Es gibt in C++ auch ein paar für embedded Anwendungen brauchbare Erweiterungen von C:
-const
-Templates
-damit auch template metaprogramming
-Referenzen
-evtl. ab und zu virtual anstatt das gleiche von Hand zu machen

Außerdem gibt es funktionierende C++ zu C Compiler, C++ zu benutzen ist deshalb keine Einschränkung an die Prozessoren, die man benutzen kann.

Coda
2008-09-24, 13:59:17
Auch die Typsicherheit ist bei C++ besser. Man muss lange nicht so viel void* durch die gegend schieben.

Ich würde auch prozedural lieber mit C++ programmieren, es vergessen offenbar viele dass man keine Klassen benutzen muss.

AtTheEndofAugust
2008-09-24, 14:09:24
Okay danke euch für eure Hilfe - eine Frage hab ich aber noch

Wie kommt er hier zur Ausgabe von
0
2
4
12
14
24

#include <stdio.h>



void main()

{int i, j;

int a[5][5]={{0,1,2,3,4},{5,6,7,8,9},{10,11,12,13,14},{15,16,17,18,19},{20,21,22,23,24}};

for (i=0;i<5;i=i+2)

{
for (j=i;j<5;j=j+2)

{

printf("%4d",a[i][j]); printf("\n");

}


}


}



Die 0 ist klar, weil erst nach Ausführung um 2 inkrementiert wird, aber dann müsste doch beim zweiten Durchlauf i=2 und j ebenfalls 2 sein???

e hat sich erledigt

AtTheEndofAugust
2008-09-25, 14:15:20
Hat jemand ne Ahnung was für Ablaufsteuerungen es in C gibt?

Steh da irgendwie aufem Schlauch

robobimbo
2008-09-25, 14:41:11
if

if ... else ...

if ... else if ...

switch / case

AtTheEndofAugust
2008-09-25, 17:11:37
vielen lieben Dank, hab da noch eine Frage

wie sieht die IEEE Darstellung bei Gleitkommazahlen aus?

Ich find dazu nichts im Netz

noid
2008-09-25, 18:34:22
Nichts finden, weil nicht suchen? http://de.wikipedia.org/wiki/Gleitkommazahl

http://de.wikipedia.org/wiki/IEEE_754

Coda
2008-09-25, 18:48:11
Wir sind hier auch nicht dazu da deine Hausaufgaben zu bearbeiten.

DocEW
2008-09-25, 19:45:07
Haha, du hättest deine Frage exakt so bei Google eingeben können, und es wäre der erste Treffer gewesen! Also, ein bisschen Mühe kannst du dir schon geben. Wobei, das wäre sogar weniger Arbeit für dich gewesen! :uup:

AtTheEndofAugust
2008-09-30, 15:07:09
Hab hier in meinen Unterlagen widersprüchliche Aussagen!

Einmal steht hier int habe eine Länge von 8 Bit, meiner Meinung nach aber hat int genau wie float 4 Bit!

Short int hat 1 Bit!


Was stimmt denn nun?

Danke schon mal

Gast
2008-09-30, 15:12:36
Hab hier in meinen Unterlagen widersprüchliche Aussagen!

Einmal steht hier int habe eine Länge von 8 Bit, meiner Meinung nach aber hat int genau wie float 4 Bit!

Short int hat 1 Bit!


Was stimmt denn nun?

Danke schon mal
Nichts weil ein int normalerweise auf x86/x86_64 Architektur 32 bit hat oder auch 4 byte und ein short hat 16 bit oder 2 byte.

Gast
2008-09-30, 15:13:45
http://www.galileocomputing.de/openbook/c_von_a_bis_z/c_007_000.htm#Xxx999334

AtTheEndofAugust
2008-09-30, 16:27:25
okay danke eine frage hab ich noch

die Hex Zahl

80AF soll ich in eine Dualzahl umwandeln!

Okay als Dezimal zahl ergibt es: 35344

und das in Dual 1000 1010 0001 0000

In meinen Unterlagen steht allerdings als Ergebnis Binär: 1000 0000 1010 1111

aber mein oben errechnetes stimmt doch oder?

Gast
2008-09-30, 16:35:47
GNOME gcalctool sagt 0x80AF = 32943 Dezimal und 1000000010101111 binär.
Also stimmen wohl eher deine Unterlagen.

Ectoplasma
2008-09-30, 17:06:15
okay danke eine frage hab ich noch

die Hex Zahl

80AF soll ich in eine Dualzahl umwandeln!

Okay als Dezimal zahl ergibt es: 35344

und das in Dual 1000 1010 0001 0000

In meinen Unterlagen steht allerdings als Ergebnis Binär: 1000 0000 1010 1111

aber mein oben errechnetes stimmt doch oder?

Du bist von deinem falschen Dezimalergebnis ausgegangen :wink:
Warum benutzt du zum überprüfen der Werte nicht einfach den Windows-Calculator. Der kann alle Formate hin und her rechnen. Das ist doch viel einfacher, als hier zu posten.

AtTheEndofAugust
2008-09-30, 17:28:29
e: kann raus -___-

AtTheEndofAugust
2008-10-01, 19:56:53
Ich habe nun schon 2 Stunden lang über dieser Aufgabe gebrütet und komm nicht drauf, wie das funktioniert!

Kann mir das einer sagen?

Nur wenige Mikrocontroller-Typen kennen Multiplizier- bzw. Dividierbefehle: Auf welche Weise wird ohne diese Befehle dennoch multipliziert?

multiplizieren: Schieben um ein Bit nach links und nachschieben einer 0
von links heißt multiplizieren mit 2
dividieren: Schieben um ein Bit nach rechts und Nachschieben einer 0 von
rechts heißt dividieren durch 2

(„shiften“)
Durch Schleifen die eine Zahl n mal aufaddieren, kann man auch multiplizieren.
Multiplizieren:
Zahl1 * Zahl2 = Ergebnis
Man betrachtet das Bit0 von Zahl2. Ist es eine 1, so wird Zahl1 zum Ergebniss addiert. Ist es eine 0, so wird nichts gemacht. Dann schiebt man Zahl1 einmal nach Links (Mal 2, da im Binärsystem die Stellen um den Faktor 2 verschieden sind) und Zahl2 einmal nach rechts, um sich das nächste Bit anzusehen.
Dann wiederholt man die ganze Prozedur solange, bis Zahl2 = 0 ist.

3 * 13
3 = 0B11
13 = 0B1101

1101 * 11
1101
+ 1101
100111 = 39d

ManuelCalavera
2008-10-01, 20:49:28
ohne garantie:

int ergebnis = 0;
while (zahl2 != 0) {
if ( (zahl2 & 1) > 0 ) {
ergebnis += zahl1;
}
zahl1 <<= 1;
zahl2 >>= 1;
}