Am verzweifeln mit Arrays



  • Hallo Community

    ich hab ein riesen Problem. Ich hab in 2 Wochen Prüfungen und ich komm einfach mit Informatik nicht klar.
    Wir haben einige Prüfungsübungsaufgaben gekriegt. Unter anderem sollen wir das mathematische Hornerschema mit arrays programmieren.
    Achtung, für den Folgenden Programmtext hab ich 5 Stunden gesessen. Zeit in der Prüfung: 2 Stunden.
    Und er funktioniert hinten und vorne nicht 😞

    int ReadInt(int,int,char*);
    int Menue();
    //void Fibonacci(int*,int);
    //void FibAuslesen(int*,int);
    int HornerSchema(int*,int, int);
    void HornerFeldEinlesen(int*,int);
    void Message(char*,int);
    //------------------------------------------------------------------------------------------
    // Hauptfunktion: Einstiegspunkt 
    void main()
    {
    
    	while(Menue());
    }
    //------------------------------------------------------------------------------------------
    int Menue()
    {
    	system("cls");
    	int Wahl=0;
    	printf("\n\n\tAbschlusspruefung Informatik");
    	printf("\n\n\tHorner Schema..............1");
    	printf("\n\n\tFibonacci..................2");
    	Wahl=ReadInt(0,3,"\n\nBitte waehlen:");
    	system("cls");
    	switch(Wahl)
    	{
    	case 1:
    		{
    			printf("\n\n %s","\tHornerschema");
    			int N=6;
    			int XWert=1;
    			N=ReadInt(0,6,"\n\n\tPolynomgrad:");
    			int HornerFeld[N];
    			XWert=ReadInt(-10,10,"\n\n\tX-Wert:");
    			//printf("\n\n\tBitte Polynomgrad eingeben:", N);
    			//printf("\n\n\tX-Wert:", XWert);
    			HornerFeldEinlesen(HornerFeld,N);	
    			printf("\n\n\tX-Wert %i",HornerSchema(HornerFeld, N, XWert));
    			break;
    		}
    	case 2:
    		{
    		}
    
    	}
    	Message("\n\n\tWeiter mit beliebiger Taste....",1);
    	return (Wahl);
    }
    //-------------------------------------------------------------------------------------------
    int HornerSchema(int*HornerFeld,int N, int XWert)
    {
    	//system("cls");
    	int Summe=HornerFeld[0];
    	int Produkt=0;
    	for (int i=0;i<=N;i++)
    		{	
    		Produkt=Summe*XWert;
    		Summe=HornerFeld[N+i]+Produkt;
    		}
    	HornerFeld[N-1]=XWert;
    	return XWert;
    }
    //-------------------------------------------------------------------------------------------
    void HornerFeldEinlesen(int*HornerFeld, int N)
    {
    	printf("\n\n\n");
    	for (int i=N;i>=0;i--)
    	{
    		printf("\n\n\tKoeffizient ai:"); scanf("%i", &HornerFeld[N-i]);
    	}
    //-------------------------------------------------------------------------------------------
    void Message(char*Text,int Stop)
    {
    		fflush(stdin);
    	if(Text!="")
    		printf(Text);
    	if(Stop==1)
    		{fflush(stdin);getchar();}
    }
    //-------------------------------------------------------------------------------------------
    int ReadInt(int UG,int OG,char *Text)
    {
    	int IZahl;
    	do
    	{
    		printf("\n %s( %d...%d) ",Text,UG,OG);
    		scanf("%d",&IZahl);
    			if ((IZahl<UG)||(IZahl>OG))
    				printf("\a\n");
    	}
    	while((IZahl<UG)||(IZahl>OG));
    return (IZahl);
    }
    // Readint Funktion
    //--------------------------------
    

    Also er debuggt. Aber er rechnet nichts. Ich bekomme den XWert so raus wie er eingegeben ist...
    Und noch eine Spezielle frage zu diesem Part:

    int N=6;
    int XWert=1;
    N=ReadInt(0,6,"\n\n\tPolynomgrad:");
    int HornerFeld[N];
    

    Ich will hier 6 maximale Felder deklarieren. Gleichzeitig soll aber die Anzahl der Felder eingegeben werden können. Und das funktioniert nicht. Egal wie ich es gedreht habe, jedes mal kam ne andere Fehlermeldung raus...

    Danke schonmal für eure Hilfe...



  • Cabooze schrieb:

    Und noch eine Spezielle frage zu diesem Part:

    int N=6;
    int XWert=1;
    N=ReadInt(0,6,"\n\n\tPolynomgrad:");
    int HornerFeld[N];
    

    Ich will hier 6 maximale Felder deklarieren. Gleichzeitig soll aber die Anzahl der Felder eingegeben werden können. Und das funktioniert nicht. Egal wie ich es gedreht habe, jedes mal kam ne andere Fehlermeldung raus...

    Arrays müssen eine zur Compilezeit feststehende Länge haben. Das ist bei dir nicht der Fall. Um sowas zu erreichen kannst du sowas schreiben:

    #include <vector>
    std::vector<int> HornerFeld(N);
    //normal mit HornerFeld[3] oder so auf einzelne Elemente zugreifen
    


  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum C (C89, C99 und C11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • nwp3 schrieb:

    Cabooze schrieb:

    Und noch eine Spezielle frage zu diesem Part:

    int N=6;
    int XWert=1;
    N=ReadInt(0,6,"\n\n\tPolynomgrad:");
    int HornerFeld[N];
    

    Ich will hier 6 maximale Felder deklarieren. Gleichzeitig soll aber die Anzahl der Felder eingegeben werden können. Und das funktioniert nicht. Egal wie ich es gedreht habe, jedes mal kam ne andere Fehlermeldung raus...

    Arrays müssen eine zur Compilezeit feststehende Länge haben. Das ist bei dir nicht der Fall. Um sowas zu erreichen kannst du sowas schreiben:

    #include <vector>
    std::vector<int> HornerFeld(N);
    //normal mit HornerFeld[3] oder so auf einzelne Elemente zugreifen
    

    Das bringt mir leider nichts. Die Datenbibliothek ist in der Prüfung vorgeschrieben. Ich hab den obigen Programmtext auf einer Vorlage aufgebaut.
    Ein #include<vector> kann ich da leider nicht einbauen. Mal abgesehen davon dass ich nicht mal weiß was es eigentlich ist und macht, was du mir da geschrieben hast. Ich möchte versuchen zu verstehen was ich tue. Dafür lerne ich ja gerade.


  • Mod

    Das liegt da dran, dass du C machst, aber im C++-Forum gefragt hast. C und C++ sind ganz unterschiedliche Sprachen*. In C darf man das so machen, wie du es versucht hast. Dein ganzer Code ist C, daher habe ich deinen Thread mal verschoben.
    Es ist natürlich kein gutes Zeichen für eine Prüfung, wenn man nicht einmal weiß, welche Sprache man benutzt.

    *: Ein weit verbreitetes Problem. Viele Sprachen haben einen am populären C angelehnten Namen: C++, C#, Objective-C, D. Dazu gibt es noch Sprachen, die dann wieder an diesen Sprachen angelehnt sind, wie C++/CLI. Diese Sprachen sind aber untereinander allesamt inkompatibel und teilweise ziemlich verschieden. Sie haben bloß die gleiche Syntax (=Grammatik), weshalb sie auf den ersten Blick sehr ähnlich aussehen. Ganz problematisch ist C++ vs. C, da C++ historisch eine Obermenge von C war (auch wenn das mittlerweile nicht mehr so ist), daher kann selbst ein alter Hase wie nwp3 ein C-Programm für ein (dann sehr schlechtes) C++-Programm halten, ohne ganz genau hin zu sehen.


  • Mod

    Zum eigentlichen Problem:
    Was erwartest du denn? Du veränderst XWert nirgends und gibst es dann unverändert zurück. Klar bleibt es dabei unverändert! Vielleicht möchtest du eher die Summer zurück geben? Die letzte Zeile vor der Rückgabe würde ich ebenfalls noch einmal überdenken. Und wie du auf das Feld zugreifst ebenfalls. Eigentlich ist die ganze Funktion ziemlich falsch. Man sieht, dass du mal das Horner-Schema gesehen hast, aber bei der technischen Umsetzung ist so viel falsch, dass eigentlich jeder Einzelschritt irgendwelche Fehler drin hat. Das wirkt - das muss man mal so grob sagen - als hättest du das einfach nur so hingeschmiert, bis irgendetwas compilierbares bei raus kam, was an einigen Stellen Ähnlichkeit mit dem Horner-Schema hat. Programmieren geht so nicht. Code ist Logik pur, kein zusammengerotzter Haufen von Zeichen. Du musst genau wissen, warum du wo welches Zeichen setzt.

    Allgemein: Das was du hier im Forum gepostet hast, compiliert nicht einmal, weil die Klammern nicht richtig gesetzt wurden. Auch anderswo sind viele kleine Fehler und Schwächen. Der für mich herausragendste Fehler, der schwere Wissenslücken vermuten lässt ist: if(Text!="") : Nein! Zeichenketten in C gehen ganz anders.



  • Definiere das Feld vorher. Ausreichend groß.
    Und dann benutzt du nur N Felder davon.

    Cabooze schrieb:

    Aber er rechnet nichts. Ich bekomme den XWert so raus wie er eingegeben ist...

    Welchen Wert gibst du denn aus deiner Funktion HornerSchema zurück? Und was machst du vorher mit dem?



  • SeppJ schrieb:

    Zum eigentlichen Problem:
    Was erwartest du denn? Du veränderst XWert nirgends und gibst es dann unverändert zurück. Klar bleibt es dabei unverändert! Vielleicht möchtest du eher die Summer zurück geben? Die letzte Zeile vor der Rückgabe würde ich ebenfalls noch einmal überdenken. Und wie du auf das Feld zugreifst ebenfalls. Eigentlich ist die ganze Funktion ziemlich falsch. Man sieht, dass du mal das Horner-Schema gesehen hast, aber bei der technischen Umsetzung ist so viel falsch, dass eigentlich jeder Einzelschritt irgendwelche Fehler drin hat. Das wirkt - das muss man mal so grob sagen - als hättest du das einfach nur so hingeschmiert, bis irgendetwas compilierbares bei raus kam, was an einigen Stellen Ähnlichkeit mit dem Horner-Schema hat. Programmieren geht so nicht. Code ist Logik pur, kein zusammengerotzter Haufen von Zeichen. Du musst genau wissen, warum du wo welches Zeichen setzt.

    Allgemein: Das was du hier im Forum gepostet hast, compiliert nicht einmal, weil die Klammern nicht richtig gesetzt wurden. Auch anderswo sind viele kleine Fehler und Schwächen. Der für mich herausragendste Fehler, der schwere Wissenslücken vermuten lässt ist: if(Text!="") : Nein! Zeichenketten in C gehen ganz anders.

    Also wie gesagt. Da ist eine Vorlage gewesen. Und in die Vorlage habe ich den Programmtext eingefügt, von dem ich gehofft hatte, dass er funktioniert. Die Vorlage war das hier:

    int ReadInt(int,int,char*);
    int Menue();
    int HornerSchema(int*,int, int);
    void HornerFeldEinlesen(int*,int);
    void Message(char*,int);
    //------------------------------------------------------------------------------------------
    // Hauptfunktion: Einstiegspunkt
    void main()
    {
    
        while(Menue());
    }
    //------------------------------------------------------------------------------------------
    int Menue()
    {
        system("cls");
        int Wahl=0;
        printf("\n\n\tAbschlusspruefung Informatik");
        printf("\n\n\tHorner Schema..............1");
        printf("\n\n\tFibonacci..................2");
        Wahl=ReadInt(0,3,"\n\nBitte waehlen:");
        system("cls");
        switch(Wahl)
        {
        case 1:
            {
                printf("\n\n %s","\tHornerschema");
                break;
            }
        case 2:
            {
            }
    
        }
        Message("\n\n\tWeiter mit beliebiger Taste....",1);
        return (Wahl);
    }
    //-------------------------------------------------------------------------------------------
    int HornerSchema()
    {
    
    }
    //-------------------------------------------------------------------------------------------
    void HornerFeldEinlesen(int*HornerFeld, int N)
    {
        printf("\n\n\n");
        for (int i=N;i>=0;i--)
        {
        }
    //-------------------------------------------------------------------------------------------
    void Message(char*Text,int Stop)
    {
            fflush(stdin);
        if(Text!="")
            printf(Text);
        if(Stop==1)
            {fflush(stdin);getchar();}
    }
    //-------------------------------------------------------------------------------------------
    int ReadInt(int UG,int OG,char *Text)
    {
        int IZahl;
        do
        {
            printf("\n %s( %d...%d) ",Text,UG,OG);
            scanf("%d",&IZahl);
                if ((IZahl<UG)||(IZahl>OG))
                    printf("\a\n");
        }
        while((IZahl<UG)||(IZahl>OG));
    return (IZahl);
    }
    // Readint Funktion
    //--------------------------------
    

    Das alles hat unser Prüfer gemacht. Nicht ich. Ich hab nur einen Teil des Programmtextes hinzugefügt. Also den Teil in case 2, die Hornerschema Funktion und die Hornerfeldfunktion.
    Ich kann mich also nur für den Müll rechtfertigen, den ich gebaut habe. Was if(Text!="") macht, weiß ich nicht mal.

    Ich weiß ja nicht mal konkret, was ich eigentlich verbessern soll...



  • SeppJ schrieb:

    Das liegt da dran, dass du C machst, aber im C++-Forum gefragt hast. C und C++ sind ganz unterschiedliche Sprachen*. In C darf man das so machen, wie du es versucht hast. Dein ganzer Code ist C, daher habe ich deinen Thread mal verschoben.
    Es ist natürlich kein gutes Zeichen für eine Prüfung, wenn man nicht einmal weiß, welche Sprache man benutzt.

    *: Ein weit verbreitetes Problem. Viele Sprachen haben einen am populären C angelehnten Namen: C++, C#, Objective-C, D. Dazu gibt es noch Sprachen, die dann wieder an diesen Sprachen angelehnt sind, wie C++/CLI. Diese Sprachen sind aber untereinander allesamt inkompatibel und teilweise ziemlich verschieden. Sie haben bloß die gleiche Syntax (=Grammatik), weshalb sie auf den ersten Blick sehr ähnlich aussehen. Ganz problematisch ist C++ vs. C, da C++ historisch eine Obermenge von C war (auch wenn das mittlerweile nicht mehr so ist), daher kann selbst ein alter Hase wie nwp3 ein C-Programm für ein (dann sehr schlechtes) C++-Programm halten, ohne ganz genau hin zu sehen.

    Das würde mir doch sehr zu denken geben. Unser Lehrer sagt uns schon seit anfang des Jahres wir machen C++. Ich mach übrigens Fachabi falls das wen juckt.



  • Cabooze schrieb:

    Das alles hat unser Prüfer gemacht. Nicht ich. Ich hab nur einen Teil des Programmtextes hinzugefügt. Also den Teil in case 2, die Hornerschema Funktion und die Hornerfeldfunktion.
    Ich kann mich also nur für den Müll rechtfertigen, den ich gebaut habe. Was if(Text!="") macht, weiß ich nicht mal.

    Cabooze schrieb:

    Das würde mir doch sehr zu denken geben. Unser Lehrer sagt uns schon seit anfang des Jahres wir machen C++. Ich mach übrigens Fachabi falls das wen juckt.

    Ach du scheiße.



  • Also um das nochmal zu verdeutlichen:

    int Menue()
    {
    	system("cls");
    	int Wahl=0;
    	printf("\n\n\tAbschlusspruefung Informatik");
    	printf("\n\n\tHorner Schema..............1");
    	printf("\n\n\tFibonacci..................2");
    	Wahl=ReadInt(0,3,"\n\nBitte waehlen:");
    	system("cls");
    	switch(Wahl)
    	{
    	case 1:
    		{
    			printf("\n\n %s","\tHornerschema");
    			[b]int N=6;
    			int XWert=1;
    			N=ReadInt(0,6,"\n\n\tPolynomgrad:");
    			int HornerFeld[7];
    			XWert=ReadInt(-10,10,"\n\n\tX-Wert:");
    			//printf("\n\n\tBitte Polynomgrad eingeben:", N);
    			//printf("\n\n\tX-Wert:", XWert);
    			HornerFeldEinlesen(HornerFeld,N);	
    			printf("\n\n\tX-Wert %i",HornerSchema(HornerFeld, N, XWert));[/b]
    			break;
    		}
    	case 2:
    		{
    			printf("\n\n %s","\tFibonacci");
    			break;
    		}
    
    	}
    	Message("\n\n\tWeiter mit beliebiger Taste....",1);
    	return (Wahl);
    //----------------------------------------------------------------
    int HornerSchema([b]int*HornerFeld,int N, int XWert[/b])
    {
    	[b]
    	int Summe=HornerFeld[0];
    	int Produkt=0;
    	for (int i=1;i<=N;i++)
    		{	
    		Produkt=Summe*XWert;
    		Summe=HornerFeld[N+i]+Produkt;
    		}
    	XWert=Summe;
    	return XWert;[/b]
    }
    //-------------------------------------------------------------------------------------------
    void HornerFeldEinlesen(int*HornerFeld, int N)
    {
    	printf("\n\n\n");
    	for (int i=N;i>=0;i--)
    	{
    		[b]printf("\n\n\tKoeffizient ai:"); scanf("%i", &HornerFeld[N-i]);[/b]
    	}
    
    }
    

    Alles was hier fett markiert ist, ist auf meinem Mist gewachsen.
    ICh hab nochmal was dran geändert und ich krieg jetzt einen X Wert zurück. Allerdings gibt er mir Werte im 8-stelligen Bereich zurück.
    Vielleicht kann bitte jemand drüber schauen und mir meine Fehler erklären und sagen was ich besser machen kann. Ich seh sonst kein Land mehr...

    Edit: Ok ist wohl nichts markiert.
    Also Zeilen 15-23,39-47 und 55 sind von mir


  • Mod

    Was soll man da machen? Euer Lehrer hat absolut 0 Ahnung. Nein, das ist schmeichelhaft. Euer Lehrer hat -10 Ahnung. Und er hat versucht euch möglichst, möglichst viel davon mitzugeben. Das ist nicht deine Schuld, aber du bist vermutlich geschädigt fürs Leben und wirst niemals mehr programmieren können.

    Was sollen wir da empfehlen, außer aus dem Kurs auszusteigen, alle Hirnzellen mit Alkohol abzutöten und neu anzufangen?

    Wenn die Vorlage schon derart krass fehlerhaft ist, dann ist die Aufgabe nicht zu retten.



  • Wenn ein Array mit N Elementen definiert wurde, dann gehen die Indizes von 0 bis N-1
    In deiner Schleife (Zeile 41) gehst du aber schon bis N und greifst in der Schleife noch auf N+1 zu.
    Beim Einlesen gehst du auch zu weit.

    Lass dir die eingegebenen Wert mal ausgeben.

    ^Bis 1999 habe ich auch noch C++ programmiert. Dann wurde der einzeilige Kommentar in den C-Standard aufgenommen.^


  • Mod

    DirkB schrieb:

    ^Bis 1999 habe ich auch noch C++ programmiert. Dann wurde der einzeilige Kommentar in den C-Standard aufgenommen.^

    Hier liegt aber ohne Zweifel C vor*. VLAs gibt's in C++ schlicht und einfach nicht und der gesamte Rest ist ebenfalls C.

    *: Selbstverständlich wird aber gewiss der GCC im C++-Modus zur Übersetzung benutzt (der VLAs als Zusatzfeature auch unter C++ anbietet). Anders will ich es von diesem Lehrer nicht erwarten 🙂 .



  • Die Qualitäten deines Lehrers wurden ja schon beleuchtet, wie man deinen Code wenigstens halbwegs retten könnte (selbst ein nur normaler C-Programmierer würde das natürlich nie so machen):

    http://ideone.com/7coBQN

    #include <stdio.h>
    #include <stdlib.h>
    
    int ReadInt(int,int,char*);
    int Menue(void);
    int HornerSchema(int*,int, int);
    void HornerFeldEinlesen(int*,int);
    void Message(char*,int);
    //------------------------------------------------------------------------------------------
    // Hauptfunktion: Einstiegspunkt
    int main()
    {
        while(Menue());
        return 0;
    }
    //------------------------------------------------------------------------------------------
    int Menue()
    {
        int Wahl=0;
        printf("\n\n\tAbschlusspruefung Informatik");
        printf("\n\n\tHorner Schema..............1");
        printf("\n\n\tFibonacci..................2");
        Wahl=ReadInt(0,3,"\n\nBitte waehlen:");
        switch(Wahl)
        {
        case 1:
            {
              int feld[1000]; /* das sollte reichen */
              int n = ReadInt(0,6,"\n\n\tPolynomgrad:");
              int wert = ReadInt(-10,10,"\n\n\tX-Wert:");
                printf("\n\n %s","\tHornerschema");
              HornerFeldEinlesen(feld,n);
              printf("\n\n\tX-Wert %i",HornerSchema(feld, n, wert));
                break;
            }
        case 2:
            {
            }
    
        }
        Message("\n\n\tWeiter mit beliebiger Taste....",1);
        return (Wahl);
    }
    //-------------------------------------------------------------------------------------------
    int HornerSchema(int*HornerFeld, int N,int Wert)
    {
      int i;
      int r = 0;
    
      for(i=N-1; i >= 0; i--)
      {
        r = r * Wert + HornerFeld[i];
      }
      return r;
    }
    //-------------------------------------------------------------------------------------------
    void HornerFeldEinlesen(int*HornerFeld, int n)
    {
        printf("\n\n\n");
        while(n--)
        {
          printf("\n%d.Wert: ",n+1);
          scanf("%d",&HornerFeld[n]);
        }
    }
    //-------------------------------------------------------------------------------------------
    void Message(char*Text,int Stop)
    {
        while(getchar()!='\n');
        if(Text)
            printf(Text);
        if(Stop==1)
            getchar();
    }
    //-------------------------------------------------------------------------------------------
    int ReadInt(int UG,int OG,char *Text)
    {
        int IZahl;
        do
        {
            printf("\n %s( %d...%d) ",Text,UG,OG);
            scanf("%d",&IZahl);
                if ((IZahl<UG)||(IZahl>OG))
                    printf("\a\n");
        }
        while((IZahl<UG)||(IZahl>OG));
    return (IZahl);
    }
    

  • Mod

    Wutz schrieb:

    printf(Text);
    

    Hier kommt Text zwar aus einem statischen Stringliteral, aber es juckt mich schon irgendwie in den Fingern, wenn ich so etwas sehe, es da mal ordentlich knallen zu lassen...

    Na gut, du hattest sicher keine Lust, jede Zeile neu zu schreiben. Dass der Originalautor sicherlich vollkommen ungewahr der Gefahr ist, steht wohl außer Zweifel.



  • Okay. Also ich hab nochmal ein bisschen an dem Code gefeilt. Und jetzt gehts. Werd mir einige Dinge mal anschauen müssen und üben. Ich will ein Informatikstudium anfangen diesen Herbst, da geht eh alles nochmal von vorne los denk ich.


Anmelden zum Antworten