1 / 195

ARRAY oder FELD oder VEKTOR

ARRAY oder FELD oder VEKTOR. Aufgabe :. Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. int main(){ int a; int b; int c; //.

cachez
Télécharger la présentation

ARRAY oder FELD oder VEKTOR

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. ARRAY oderFELDoderVEKTOR

  2. Aufgabe: Drei über Tastatur eingegebene ganzzahlige Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden.

  3. int main(){int a;int b;int c; //...

  4. printf("1.Zahl eingeben\n");scanf("%d", &a);fflush(stdin);printf("2.Zahl eingeben\n");scanf("%d", &b);fflush(stdin);printf("3.Zahl eingeben\n");scanf("%d", &c);fflush(stdin);printf("umgekehrt: %d %d %d", c, b, a);

  5. return 0;}

  6. Was ist der Nachteil ? SchreibaufwendigeLösung !

  7. Warum nicht mit Schleife lösbar ? keine "nächste" Variable:a  b  c

  8. Man benötigt: Eine Variable, die aus mehreren Zellen (Elementen) besteht und deshalb gleichzeitig mehrere Werte speichern kann. Dies ist eine indizierte Variable, ein sogenanntes Feld (Array, Vektor).

  9. 13 17 19 23 27 0 1 2 3 4 Der Index der ersten Zelle (Element) ist 0 Die Feldlänge ist5

  10. C-Syntax

  11. int v[3]; Diese Feldlänge ist eine Konstante und muß dem Compiler bei der Übersetzung des Programms bekannt sein. Sie kann NICHT während des Programmlaufs (z.B. durch den Anwender über Tastatur) verändert werden !!! Länge des Feldes: KONSTANTE !!! Variablenname Datentyp: Jede Zelle hat den gleichen Datentyp

  12. int main(){ v x y int v[3],x,y; ? ? ? ? ? ? ? 19 ? ? v[2]=19; 17 ? 19 ? ? v[0]=17; 17 13 19 ? ? v[1]=13; 17 13 19 2 ? x=2; 17 13 23 2 ? v[x]=23; 17 13 23 2 13 y=v[1]; 17 13 13 2 13 v[x]=y;

  13. int main(){ int len; scanf("%d",&len); fflush(stdin); int v[len]; v[len-2]=123; return 0; } Warum ist dieses Programm syntaktisch falsch ? (Compiler meldet einen Fehler) Weil Feldlänge len eine Konstante sein muß !!

  14. int main(){ int v[3]; Warum macht diese Anweisung Probleme ? v[3]=56; Weil auf nicht reservierten Speicher zugegriffen wird, konkret: auf die 4. Zelle des Feldes ! Dies kann schwer erkennbare Fehler nach sich ziehen. Siehe später !

  15. int main(){ int v[3];size_t erg; erg = sizeof(v); Liefert Speicherplatzbedarf einer Variable. // Welchen Wert hat erg ? // 12 = 3*Speicher(int) return 0; }

  16. Initialisierung bei der Deklaration int zahlen[4]={23,7}; 23 7 ? ? double d[4]={1.4,7.3,2,4}; 1.4 7.3 2.0 4.0

  17. int main(){ int v[2] = {10,20}; int w[3] = {50,60,70}; int r; r=w[4]; printf("r=%d\n",r); return 0; } Weil auf nicht reservierten Speicher zugegriffen wird, konkret: auf die 5. Zelle des Feldes w ! Warum macht diese Anweisung Probleme ? // mit VC++ 6.0 kompiliert. // Ausgabe auf Bildschirm: // 20

  18. int main(){ int v[2] = {10,20}; int w[3] = {50,60,70}; int r; r=w[4]; printf("r=%d\n",r); return 0; } Arbeitsspeicher -Ausschnitt ... r ? 0096 w[0] 0100 50 Der Teil des Speichers, in dem diese Variablen gespeichert werden, nennt man den STACK.Er „wächst“ in Richtung der kleineren Adressen. Welche Variablen werden also hier ab dieser Adresse hintereinander abgespeichert? w[1] 0104 60 0108 70 w[2] v[0] 0112 10 v[1] 0116 20 ...

  19. int main(){ int v[2] = {10,20}; int w[3] = {50,60,70}; int r; r=w[4]; printf("r=%d\n",r); return 0; } Arbeitsspeicher -Ausschnitt ... r ? 0096 w[0] 0100 50 w[4] ist die 5. Zelle relativ zum Feldbeginn bei w[0]. Deshalb ist die nichtreservierte Zelle w[4] gleich der Zelle v[1]. w[1] 0104 60 0108 70 w[2] v[0] 0112 10 v[1] 0116 20 Was wird also in r gespeichert und auf dem Bildschirm ausgegeben? ...

  20. int main(){ int v[2] = {10,20}; int w[3] = {50,60,70}; int r; r=w[4]; printf("r=%d\n",r); return 0; } Arbeitsspeicher -Ausschnitt ... r 0096 20 w[0] 0100 50 w[4] ist die 5. Zelle relativ zum Feldbeginn bei w[0]. Deshalb ist die nichtreservierte Zelle w[4] gleich der Zelle v[1]. w[1] 0104 60 0108 70 w[2] v[0] 0112 10 v[1] 0116 20 Was wird also in r gespeichert und auf dem Bildschirm ausgegeben? ...

  21. Aufgabe: Drei über Tastatur eingegebene Zahlen sollen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. EVA beachten !!

  22. int main(){ int i; // Zähler int v[3]; // Feld i=0; while(i<3){ printf("Zahl eingeben:"); scanf("%d", &v[i]); fflush(stdin); i=i+1; }

  23. printf("Zahlenausgaben\n"); i=2; while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0; }

  24. Aufgabe: Verändern Sie das letzte Programm so, daß 10 über Tastatur eingegebene Zahlen in umgekehrter Reihenfolge der Eingabe wieder auf dem Bildschirm ausgegeben werden. EVA beachten !!

  25. int main(){ int i; int v[10]; i=0; while(i<10){ printf("Zahl eingeben:"); scanf("%d", &v[i]); fflush(stdin); i=i+1; } hier muß eine Änderung gemacht werden hier muß eine Änderung gemacht werden

  26. printf("Zahlenausgaben\n"); i=9; while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0; } hier muß eine Änderung gemacht werden Welchen Nachteil haben diese vielen Änderungen für den Programmierer ? Der Programmierer kann eine zu tätigende Änderung einfach übersehen.

  27. Deswegen ist es besser mit sogenannten Konstanten zu arbeiten. (Die Feldlänge muß eine Konstante sein !)

  28. int main(){ int v[10]; ... Länge des Feldes v ist eine Konstante ! Kann während des Programmlaufs NICHT mehr verändert werden. Elegantere Möglichkeit: int main(){ const int LEN = 10; int v[LEN]; Empfehlung:Konstanten mit Großbuchstaben schreiben ! LEN=LEN+1; // Fehler

  29. Eine Konstante kann man als eine schreibgeschützte Variable auffassen.(Deswegen ist sie im eigentlichen Sinne des Worts keine Variable mehr).

  30. Aufgabe: Benutzen Sie beim letzten Programm statt der Feldlänge 10 eine Konstante.

  31. int main(){ const int LEN = 10; int i; int v[LEN]; i=0; while(i<LEN){ printf("Zahl eingeben:"); scanf("%d", &v[i]); fflush(stdin); i=i+1; } falls die Feldlänge z.B. auf 100 verändert werden soll, muß der Programmierer nur noch die 10 durch die 100 ersetzen (eine einzige Änderung machen).

  32. printf("Zahlenausgaben\n"); i= LEN-1; while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0; }

  33. Aufgabe: Verändern Sie das C-Programm so, dass der Anwender die Anzahl der einzugebenden Zahlen festlegen kann.

  34. int main(){ int i; int v[100]; int anz; // Anzahl do{  printf("Anz. eing.\n"); scanf("%d", &anz); fflush(stdin); } while((anz>100)||(anz<=0));

  35. printf("Zahleneingaben\n"); i=0; while(i<=anz-1){ printf("Zahleingabe:\n"); scanf("%d", &v[i]); fflush(stdin); i=i+1; }

  36. printf("Zahlenausgabe\n"); i=anz-1; while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0; }

  37. Besser mit einer Konstante...

  38. int main(){ const int LEN = 100; int i; int v[LEN]; int anz; // Anzahl do{  printf("Anz. eing.\n"); scanf("%d", &anz); fflush(stdin); } while((anz>LEN)||(anz<=0));

  39. printf("Zahleneingaben\n"); i=0; while(i<=anz-1){ printf("Zahleingabe:\n"); scanf("%d", &v[i]); fflush(stdin); i=i+1; }

  40. printf("Zahlenausgabe\n"); i=anz-1; while(i>=0){ printf("%d\n", v[i]); i=i-1; } return 0; }

  41. Aufgabe: Bestimmen Sie das Maximum und das Minimum der in der vorigen Aufgabe eingegebenen Zahlen. EVA beachten !!

  42. int main(){ const int LEN = 100; int i; int anz; int v[LEN]; int max; int min; // Programm von vorher ...

  43. i = 0; max = v[0]; min = v[0]; do{ if(v[i]>max) max = v[i]; if(v[i] < min) min = v[i]; i=i+1; } while(i<anz); printf("Maxim. = %d\n", max); printf("Minim. = %d\n", min); return 0; }

  44. Strings (Zeichenketten)

  45. Strings sind Felder mit dem Datentyp char. Beispiel: 'M' 'E' 'S' 'K' ... Wie wird dies in C++ realisiert ?

  46. int main(){ Gibt Zeichenkette aus char v[100]; v[0]='M'; Woher kennt printf das Ende des Strings ? v[1]='E'; v[2]='S'; v[3]='K'; v[4]='\0'; printf("%s",v); return 0; } // Was wird ausgegeben ?

  47. Zeichenkette beenden mit: ASCII-Zeichen mit Wert 0 Dieses Zeichen bezeichnet man als Zeichen '\0' im Gegensatz zum Zeichen '0' mit dem ASCII-Wert 48.

  48. Ausgabe eines string: printf mit dem Formatierungszeichen %s printf gibt so lange Zeichen aus, bis es an das Zeichen \0 kommt !

  49. Eingabe eines string: scanf mit dem Formatierungszeichen %sEingabe wird durch ENTER beendet und eingelesene Zeichenkette automatisch mit \0 abgeschlossen (beendet)

  50. Bemerkung: Das Drücken der ENTER-Taste zum Beenden der Eingabe eines Zeichens oder einer Zeichenkette veranlasst, dass noch der ASCII-Wert 10 in den Tastaturpuffer geschrieben wird.

More Related