Zeiger auf Zeiger
-
Ne man berechnet erstmal, ob es ein normales Jahr oder ein Schaltjahr ist und dnan rechnet man wenn man die Anzahl der Monate eingegeben hat, die Tage im Jahr zusammen.
Die zusammengerechneten Tage im Jahr ergeben dann den Wert für den Jahrestag !
-
Und für was benötigst du dann 'Zeiger-Zeiger'?
Ich verstehe den Zusammenhang mit der Aufgabenstellung nicht!
-
also mein Chef hat gesagt, dass man diese Aufgabe auch mit Zeiger auf Zeiger programmieren kann und er wollte sehen, wie ich das löse.
Zum Zusammenhang kann man sagen, dass die Zeiger-Zeiger als zusätzliches Element der Auswahl fürs Schaltjahr gesehen werden sollten.
Zeiger-Zeiger1 -> Zeiger -> Werte von den Monatstagen im normalen Jahr
Zeiger-Zeiger2 -> Zeiger -> Werte von den Monatstagen im Schaltjahr
-
#include <stdio.h> #include <alloc.h> #include <conio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int *monat[12], tag, monatsanzahl, jahresanzahl, tagesanzahl, i, Zahl, leap, Test; int **Zeiger_auf_Monat, **Zeiger_auf_Jahr; //Zahl1 = (int*)malloc(sizeof(int); Zeiger_auf_Monat = (int**)malloc(sizeof(int*)); //scanf("%d", Zahl1); printf("Geben sie bitte das Jahr ein: \n"); scanf("%d", &jahresanzahl); printf("Geben sie den Monat bitte ein: \n"); scanf("%d", &monatsanzahl); printf("Geben sie bitte den Tag ein: \n"); scanf("%d", &tagesanzahl); leap = jahresanzahl%4 == 0 && jahresanzahl%100 != 0 || jahresanzahl%400 == 0; if (leap == 1) { Test = 1; monat[1] = 31; monat[2] = 29; monat[3] = 31; monat[4] = 30; monat[5] = 31; monat[6] = 30; monat[7] = 31; monat[8] = 31; monat[9] = 30; monat[10] = 31; monat[11] = 30; monat[12] = 31; Zeiger_auf_Monat = monat[monatsanzahl]; } else { Test = 0; monat[1] = 31; monat[2] = 28; monat[3] = 31; monat[4] = 30; monat[5] = 31; monat[6] = 30; monat[7] = 31; monat[8] = 31; monat[9] = 30; monat[10] = 31; monat[11] = 30; monat[12] = 31; Zeiger_auf_Monat = monat[monatsanzahl]; } /* Abfragen für falsche Eingaben - Dient zur Absicherung gegen den DAU*/ if (Test == 1 && monatsanzahl == 2 && tagesanzahl > 29) { printf("Der Februar hat niemals so viele Tage!\n"); getch(); exit(1); } if (Test == 0 && monatsanzahl == 2 && tagesanzahl > 28) { printf("Der Februar hat in den normalen Jahren nicht mehr als 28 Tage! \n"); getch(); exit(1); } if (monatsanzahl == 4 && tagesanzahl > 30 || monatsanzahl == 6 && tagesanzahl > 30 || monatsanzahl == 9 && tagesanzahl > 30 || monatsanzahl == 11 && tagesanzahl > 30) { printf("Der Monat hat niemals so viele Tage in einem Jahr !\n"); getch(); exit(1); } if (monatsanzahl == 1 && tagesanzahl > 31 || monatsanzahl == 3 && tagesanzahl > 31 || monatsanzahl == 5 && tagesanzahl > 31 || monatsanzahl == 7 && tagesanzahl > 31 || monatsanzahl == 8 && tagesanzahl > 31 || monatsanzahl == 10 && tagesanzahl > 31 || monatsanzahl == 12 && tagesanzahl > 31) { printf("Es gibt keinen Monat mit so vielen Tagen !\n"); getch(); exit(1); } /* Hier wird der Tag im Jahr bestimmt. Man zählt die Monatstage zusammen und ermittelt somit die Gesamtsumme des Betrages. Bisher besteht noch ein Problem mit der Berechnung im Januar und Februar, die anderen Tage nach Februar können richtig berechnet werden. */ for (i = monatsanzahl; i == monatsanzahl; i--) { if (monatsanzahl == 1) { Zahl = tagesanzahl; tag += Zahl; monatsanzahl--; } if (monatsanzahl == 0) { printf("Es ist der wievielte Tag in ihrem angegebenen Jahr: %d", tag-1); getch(); exit(1); } Zahl = monat[monatsanzahl]; tag += Zahl; monatsanzahl--; } getch(); return 0; }
Ich hab erstmal unabhängig von allem, was ich vorher gesagt habe ein Programm geschrieben.
Er rechnet ja schön die Tage im Jahr aus (Beispiel: 1.1.2004 = 1. Tag im Jahr), aber wenn ich einen Tag im Januar oder Februar ausgerechnet haben will, dann bekomme ich immer falsche Werte zurück... seht ihr vielleicht woran es liegen kann ?
-
Probier mal das hier:
#include "stdafx.h" #include <stdio.h> #include <malloc.h> #include <conio.h> #include <stdlib.h> int main(int argc, char* argv[]) { int *monat=(int*)malloc(sizeof(int)*13); int tag, monatsanzahl, jahresanzahl, tagesanzahl, i, Zahl, leap, Test; int **Zeiger_auf_Monat, **Zeiger_auf_Jahr; //Zahl1 = (int*)malloc(sizeof(int); Zeiger_auf_Monat = (int**)malloc(sizeof(int*)); //scanf("%d", Zahl1); printf("Geben sie bitte das Jahr ein: \n"); scanf("%d", &jahresanzahl); printf("Geben sie den Monat bitte ein: \n"); scanf("%d", &monatsanzahl); printf("Geben sie bitte den Tag ein: \n"); scanf("%d", &tagesanzahl); leap = jahresanzahl%4 == 0 && jahresanzahl%100 != 0 || jahresanzahl%400 == 0; if (leap == 1) { monat[2] = 29; } else { monat[2] = 28; } monat[1] = 31; monat[2] = 29; monat[3] = 31; monat[4] = 30; monat[5] = 31; monat[6] = 30; monat[7] = 31; monat[8] = 31; monat[9] = 30; monat[10] = 31; monat[11] = 30; monat[12] = 31; *Zeiger_auf_Monat = &monat[monatsanzahl]; tag=tagesanzahl; for (i = 1; i < monatsanzahl; i++) { tagesanzahl+=monat[i]; } getch(); return 0; }
-
Entspricht das deiner Zielsetzung?
Ich möchte dich nocheinmal daran erinnern:
Enn du ein Array hast, dann spricht man dieses von 0 (null) ab an.
d.h. das erste Element ist element[0] und das letzte wäre darum element[n-1].
In deinen Beispielen hast du immer mit Feld[1] begonnen und außerdem Feld[n] mit Werten versorgt.
-
#include "stdafx.h"
Was soll des denn bitte sein ? Da gibt der Compiler bei mir einen Fehler aus !
-
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//Kannst Du auskommentieren.
-
Hab ich auch gleich nach der Fehlermeldung gemacht...
Wenn ich das mache, funktioniert das Programm ohne Probleme. Ich muss nur noch ein paar Abfragestrukturen eingeben, damit man nicht den 13. Monat oder mehr oder den 45. Tag eingeben kann.
Dies sollte aber kein Problem sein ! - Generell bin ich mir noch unsicher, wegen der fehlenden Einbindung von Zeiger-Zeiger. Wir benutzen bei dem Programm bisher nur den Zeiger, aber der Zeiger-Zeiger kommt noch nicht wirklich zum Zuge !
-
Wir benutzen bei dem Programm bisher nur den Zeiger, aber der Zeiger-Zeiger kommt noch nicht wirklich zum Zuge !
Ich kann Dir auch sagen warum:
Weil Du die hier gar nicht benötigst! Wenn Du mit Zeiger-Zeigern üben/arbeiten willst, würde ich Dir vorschlagen, dass Du ein wenig mit Strings herumprobierst. Da kann man prima mit solchen Adressierungsverfahren experimentieren.
Aber hier an dieser Stelle sehe ich keinen Grund, so etwas zu machen.
-
Des muss ich mal nachher mit meinem Chef klären.... komisch, dass er es so geläöst haben will
-
Theoretisch kann man es nach folgendem Prinzip ja auch machen mit den Monaten:
#include <stdio.h> #include <malloc.h> #include <conio.h> int main(int argc, char* argv[]) { int *Hausnummer1 = (int*)malloc(sizeof(int)); int **Strasse1 = (int**)malloc(sizeof(int*)); int auswahl; Strasse1 = &Hausnummer1; printf("Es wohnen 3 Leute in der Hausnummer 1. Welche Person wollen sie namentlich gelistet haben ? 1,2 oder 3 ?\n"); scanf("%d", &auswahl); if (auswahl == 1) { Hausnummer1 = "Stefan Thieme"; } if (auswahl == 2) { Hausnummer1 = "Berta Thieme"; } if (auswahl == 3) { Hausnummer1 = "Hans Thieme"; } printf("In dieser Strasse wohnt %s\n", *Strasse1); getch(); return 0; }
-
Ich hab das Programm nun etwas angepasst:
#include <stdio.h> #include <malloc.h> #include <conio.h> int main(int argc, char* argv[]) { int *Hausnummer1 = (int*)malloc(sizeof(int)*10); int **Strasse1 = (int**)malloc(sizeof(int*)); int auswahl; Hausnummer1[1] = "PersonX1"; Hausnummer1[2] = "PersonX2"; Hausnummer1[3] = "PersonX3"; Hausnummer1[4] = "PersonX4"; Hausnummer1[5] = "PersonX5"; Hausnummer1[6] = "PersonX6"; Hausnummer1[7] = "PersonX7"; Hausnummer1[8] = "PersonX8"; Hausnummer1[9] = "PersonX9"; Hausnummer1[10] = "PersonX10"; printf("Es gibt 10 Bewohner im Haus Nr. 1. Welche Person möchten sie namentlich hier sehen ?\n"); printf("Bitte geben sie eine Zahl zwischen 1 - 10 ein !\n"); scanf("%d", &auswahl); if (auswahl > 0) { Strasse1[auswahl] = &Hausnummer1[auswahl]; } printf("In dieser Strasse wohnt %s", *Strasse1[auswahl]); /* Freigabe des reservierten Speichers */ free(Hausnummer1); free(Strasse1); getch(); return 0;
-
int *Hausnummer1 = (int*)malloc(sizeof(int)*10);
...
Hausnummer1[10] = "PersonX10";Das ist Falsch (siehe oben) !
-
jap es muss ein char sein.. hab ich eben gesehen, aber abgesehen davon muss ich ein neues Programm schreiben.
Aufgabe:
- Jemand sucht eine Wohnung. Dieser jemand kann angeben wieviele Zimmer er will und für jedes Zimmer Länge und Breite eingeben. Es gibt keine natürliche Begrenzung für die Anzahl der Zimmer.
Ausgegeben werden soll die gesamte Quadratmeteranzahl. Realisierung mit Zeigern und Zeiger-Zeigern !
-
Also so... jetzt hab ich das neue Programm mal gemacht. Der Chef meinte, dass es mir hier klarer wird, warum ich Zeiger-Zeiger brauche.
#include <stdio.h> #include <malloc.h> #include <conio.h> int main(int argc, char* argv[]) { /* Variablen benennen */ int **Zimmer, *Zimmerdaten; int eingabe, i, laenge, breite; printf("Wieviele Zimmer soll ihre neue Wohnung denn haben ?\n"); scanf("%d", &eingabe); Zimmer = (int**)malloc(sizeof(int*)*eingabe); Zimmerdaten = (int*)malloc(sizeof(int)); for(i = eingabe; i > 0; i--) { printf("Bitte geben sie die Laenge und Breite fuer das Zimmer ein: \n"); printf("Bitte Laenge eingeben: "); scanf("%d", &laenge); printf("Bitte Breite eingeben: "); scanf("%d", &breite); Zimmerdaten[i] = laenge * breite; } *Zimmer = &Zimmerdaten[i]; printf("Die einzelnen Zimmer sind so gross: \n"); /* Hier werden die einzelnen Quadratmeter-Ergebnisse ausgegeben */ for (i = eingabe; i > 0; i--) { printf("%d %s\n", Zimmerdaten[i], "Quadratmeter"); } /* Die gesamte Quadratmeterzahl wird hier errechnet */ for (i = eingabe; i > 0; i--) { Zimmerdaten[i-1] += Zimmerdaten[i]; eingabe--; if (eingabe == 0) { printf("Die Gesamtfläche der Wohnung beträgt: "); printf("%d %s\n", Zimmerdaten[i], "Quadratmeter"); } } /* Freigabe des reservierten Speichers */ free(Zimmer); free(Zimmerdaten); getch(); return 0; }
Gibts Verbesserungsvorschläge ?∞
-
Ich hab nur noch ein Problem, denn wenn ich den Speicher freigeben will, dann gibts einen Speicheradressenfehler:
/* Freigabe des reservierten Speichers */ free(Zimmer); for (i = eingabe; i > 0; i--) { *Zimmerdaten = Zimmerdaten[i]; free(Zimmerdaten); } getch(); return 0;
-
Ich hab den Fehler gefunden..... ich schreibe das Programm jetzt mal so um, dass ich den Zeiger-Zeiger benutzen muss, weil ich hab den Verdacht, dass es daran liegt:
#include <stdio.h> #include <malloc.h> #include <conio.h> /* Das Ziel ist es bei diesem Programm darauf zu kommen, wie man die einzelnen Wohnungen mit ihren Daten ansprechen kann */ int main(int argc, char* argv[]) { int **piZimmer = (int**)malloc(sizeof(int*)*3); int *piZimmerdaten = (int*)malloc(sizeof(int)*3); int Laenge, Breite, Flaeche; Laenge = 1; Breite = 2; Flaeche = Laenge * Breite; *piZimmerdaten = Laenge; *(piZimmerdaten+1) = Breite; *(piZimmerdaten+2) = Flaeche; printf("%d", *piZimmerdaten); getch(); return 0; }
-
also ich soll die Lösung dynamisch machen und Zeiger-Zeiger verwenden...
Hat jemand eine Idee, denn ich hab die statische Variante eben geschrieben aus der ich dann die dynamische bauen soll.
#include <stdio.h> #include <malloc.h> #include <conio.h> /* Das Ziel ist es bei diesem Programm darauf zu kommen, wie man die einzelnen Wohnungen mit ihren Daten ansprechen kann */ int main(int argc, char* argv[]) { int **piZimmer; int *piZimmerdaten = (int*)malloc(sizeof(int)*3); int Laenge1, Breite1, Laenge2, Breite2, Laenge3, Breite3, Flaeche1, Flaeche2, Flaeche3, i, zimmeranzahl; printf("Wieviele Zimmer soll ihre Wohnung denn haben ?\n"); scanf("%d", &zimmeranzahl); piZimmer = (int**)malloc(sizeof(int*)*zimmeranzahl); printf("%s%d%s", "Bitte geben sie die Laenge und Breite fuer das ", zimmeranzahl-2,". Zimmer ein: \n"); printf("Bitte Laenge eingeben: "); scanf("%d", &Laenge1); printf("Bitte Breite eingeben: "); scanf("%d", &Breite1); *(piZimmerdaten) = Laenge1; *(piZimmerdaten+1) = Breite1; Flaeche1 = Laenge1 * Breite1; *(piZimmerdaten+2) = Flaeche1; *piZimmer = piZimmerdaten; printf("%d%s%d%s%d\n", piZimmer[0][0], " x ", piZimmer[0][1], " = ", piZimmer[0][2]); printf("%s%d%s", "Bitte geben sie die Laenge und Breite fuer das ", zimmeranzahl-1,". Zimmer ein: \n"); printf("Bitte Laenge eingeben: "); scanf("%d", &Laenge2); printf("Bitte Breite eingeben: "); scanf("%d", &Breite2); *(piZimmerdaten) = Laenge2; *(piZimmerdaten+1) = Breite2; Flaeche2 = Laenge2 * Breite2; *(piZimmerdaten+2) = Flaeche2; *(piZimmer+1) = piZimmerdaten; printf("%d%s%d%s%d\n", piZimmer[1][0], " x ", piZimmer[1][1], " = ", piZimmer[1][2]); printf("%s%d%s", "Bitte geben sie die Laenge und Breite fuer das ", zimmeranzahl,". Zimmer ein: \n"); printf("Bitte Laenge eingeben: "); scanf("%d", &Laenge3); printf("Bitte Breite eingeben: "); scanf("%d", &Breite3); *(piZimmerdaten) = Laenge3; *(piZimmerdaten+1) = Breite3; Flaeche3 = Laenge3 * Breite3; *(piZimmerdaten+2) = Flaeche3; *(piZimmer+2) = piZimmerdaten; printf("%d%s%d%s%d\n", piZimmer[2][0], " x ", piZimmer[2][1], " = ", piZimmer[2][2]); getch(); return 0; }
Ich habe noch einen Zusatz eingebaut, in dem alle Zimmerflächen zusammenaddiert werden und dabei ist ein kleiner Fehler aufgetreten, denn alle Zimmerflächen nehmen dem Wert der letzten Zimmerfläche an, wodurch ein falscher Wert heraus kommt. Woran kann das liegen ?:
printf("%d%d%d", piZimmer[0][2]+piZimmer[1][2]+piZimmer[2][2])
Ich benutze das hier !