Einige Probleme-Fragen ... Einfaches programmieren



  • Hallo,
    ich bin Anfänger und deshalb ist es vllt. falsch bzw. zu kompliziert geschrieben.. 😉

    Ich möchte gerne ein Programm schreiben, dass folgende Funktionen hat :

    - Das Programm wiederholt sich unendlich
    - Wenn man Zahlen eingibt, sie nicht mit Enter bestätigen muss
    - Das ausgerechnete Ergebnis immer wieder mit verrechnet, z.B. -2 mit in die neue Addition mit aufnimmt, endlos..
    - Wenn keine 1 oder 2 eingeben wird, das Programm die Eingabe ignoriert und einfach weiter macht...

    Das Programm sollte so funktionieren:(Fett-Druck=Ergebnis)
    1
    1
    2
    2
    1
    2
    2
    2
    0
    2
    2
    -2
    2
    2
    -4

    usw....

    So weit bin ich 🙂

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    
    int zahl1;
    int zahl2;
    
    void summe()
    {
         system("color 0A");
        printf("\nErgebnis: %i\n", (zahl1) + (zahl2));
        Sleep(1000);
        system("color 0F");
    }
    
    int main()
    {
    
        scanf("%i", &zahl1);
                    if(zahl1==1)
                    {
                    zahl1=1;
                    }
                    else if(zahl1==2)
                    {
                    zahl1=-1;
                    }
    
        scanf("%i", &zahl2);
                    if(zahl2==1)
                    {
                    zahl2=1;
                    }
                     else if(zahl2==2)
                    {
                    zahl2=-1;
                    }
        summe();
    
        getchar();
    
        system("PAUSE");
        return 0;
    }
    

    Danke für eure Hilfe !



  • Kannst du Aufgabe so formulieren, dass man sie verstehen kann? 😕 Nimm Papier und Bleistift und zeichne ein Ablaufdiagramm und dann poste uns einen Pseudocode.



  • Das Programm soll so ablaufen..(Zahlen-Beispiel):

    Man gibt eine 1 ein -> Der PC rechnet +1
    Man gibt eine 1 ein -> Der PC rechnet +1
    Der PC gibt folgendes Ergebnis 2

    Man gibt eine 2 ein -> Der PC rechnet -1
    Man gibt eine 2 ein -> Der PC rechnet -1
    Der PC gibt folgendes Ergebnis 0 (2-1-1)

    Man gibt eine 2 ein -> Der PC rechnet -1
    Man gibt eine 2 ein -> Der PC rechnet -1
    Der gibt folgendes Ergebnis -2 (0-1-1)

    Man gibt eine 2 ein -> Der PC rechnet -1
    Man gibt eine 1 ein -> Der PC rechnet +1
    Der PC gibt folgendes Ergebnis -2 (-2-1+1)

    So ist die Grundfunktion beschrieben!
    Das Programm nimmt somit immer das letzte Ergebnis und verrechnet dieses mit den neuen Eingaben...

    Mir fehlen nur noch die 4 oben beschriebenen Eigenschaften, die ich gerne mit einbringen möchte.

    Noch was unklar? Dann bitte schreiben was genau.

    Danke !



  • Ziemlich sinnlose Aufgabe ...

    #include <stdio.h>
    
    #include <conio.h> // platform-specific: getche()
    
    int main()
    {
    	char ch = 0;
    	long sum = 0;
    	int op = 0;
    	int is_first = 1;
    
    	for( ;; ) {
    
    		ch = getche();
    		putchar( '\n' );
    
    		if( ch != '1' && ch != '2' ) continue;
    
    		if( is_first ) {
    
    			op = ( ch == '1' ? 1 : -1 );
    			is_first = 0;
    
    		} else {
    
    			sum += op + ( ch == '1' ? 1 : - 1 );		
    			printf( "%d\n", sum );		
    			is_first = 1;
    		}
    
    	}
    }
    

  • Mod

    Jetzt machst du, anstatt den Code X-Mal zu wiederholen, eine Schleife um deinen scanf-if-Block. Außerdem fügst du eine Ausgabe dazu 8nicht deine jetzige Ausgabefunktion, die ist Müll). Dann machst du noch anstatt Zuweisungen richtige Rechnungen in deine if-Blöcke. Es soll ja schließlich 1 addiert bzw. subtrahiert werden, nicht irgendwo ein Wert zugewiesen werden.

    Außerdem solltest du die globalen Variablen loswerden. Wenn schon Funktionen, dann richtig (aber Funktionen sind hier übertrieben, da das Programm ca. 20 Zeilen haben wird). Außerdem überlegst du, welche Variablen du wirklich brauchst und welche nicht. Warum hast du hier zwei Zahlen, wenn deine Aufgabe doch nur eine Zahl hat, die abundzu verändert wird?

    Wenn du das gemacht hast, dann bist du fertig und kannst sogar sagen, dass du es selber gemacht hast und etwas gelernt hast. Das ist natürlich noch einiger Aufwand, aber das ist der Sinn von Übungsaufgaben.

    edit: Oder du schreibst Swordfish' Musterlösung ab und lernst nix 🙄 (ja, du lernst dabei nix, auch wenn du dir einredest, dass du am fertigen Programm mehr verstehst. Man lernt auch nicht zu malen, wenn man sich ein Gemälde ansieht)



  • Ich danke dir, für die Hilfe:)

    Eins noch --

    Eine kurze Farbänderung oder Ähnliches, wenn das Ergebnis erscheint.
    (Dass somit auffällt, dass das Ergebnis jetzt da seht...)



  • Swordfish schrieb:

    Ziemlich sinnlose Aufgabe ...

    In der Tat! 😞 Selbst wenn das Programm so läuft, wie er sich vorstellt, ist es für jeden anderen Anwender unsinnig im Zweck und im Einsatz. 😃 Für Übungszwecke bitte nur Aufgaben fragen, bei denen man kein Kopfweh bekommt! 😡



  • SeppJ schrieb:

    Jetzt machst du, anstatt den Code X-Mal zu wiederholen, eine Schleife um deinen scanf-if-Block. Außerdem fügst du eine Ausgabe dazu 8nicht deine jetzige Ausgabefunktion, die ist Müll). Dann machst du noch anstatt Zuweisungen richtige Rechnungen in deine if-Blöcke. Es soll ja schließlich 1 addiert bzw. subtrahiert werden, nicht irgendwo ein Wert zugewiesen werden.

    Außerdem solltest du die globalen Variablen loswerden. Wenn schon Funktionen, dann richtig (aber Funktionen sind hier übertrieben, da das Programm ca. 20 Zeilen haben wird). Außerdem überlegst du, welche Variablen du wirklich brauchst und welche nicht. Warum hast du hier zwei Zahlen, wenn deine Aufgabe doch nur eine Zahl hat, die abundzu verändert wird?

    Wenn du das gemacht hast, dann bist du fertig und kannst sogar sagen, dass du es selber gemacht hast und etwas gelernt hast. Das ist natürlich noch einiger Aufwand, aber das ist der Sinn von Übungsaufgaben.

    edit: Oder du schreibst Swordfish' Musterlösung ab und lernst nix 🙄 (ja, du lernst dabei nix, auch wenn du dir einredest, dass du am fertigen Programm mehr verstehst. Man lernt auch nicht zu malen, wenn man sich ein Gemälde ansieht)

    Ja du hast vollkommen recht !

    Ich habe erst angefangen C zu lernen, und bin ganz am Anfang und wollte die Aufgabe mit meinem aktuellen Wissen lösen, somit konnte ich keinen anderen Lösungsansatz sehen.

    Also ist wohl die Aufgabe von meinen derzeiten Wissenstand nicht lösbar.



  • SeppJ schrieb:

    [...] da das Programm ca. 20 Zeilen haben wird [...]

    ok ...

    Denim schrieb:

    Eine kurze Farbänderung oder Ähnliches, wenn das Ergebnis erscheint.

    Puh, dann wird's gequetsche ...

    #include <stdio.h>
    #include <conio.h> // platform-specific: getche()
    #include <windows.h> // platform-specific: SetConsoleTextAttribute()
    
    int main() {
    	char ch = 0;
    	long sum = 0, op = 0, is_first = 1;
    	HANDLE const hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
    	for( ;; ) {
    		if( ch = getche(), putchar( '\n' ), ch == '1' || ch == '2' ) {
    			if( is_first ) op = ( ch == '1' ? 1 : -1 );
    			else {
    				SetConsoleTextAttribute( hstdout, 0x0c );
    				printf( "%d\n", (sum += op + ( ch == '1' ? 1 : - 1 ) ) );
    				SetConsoleTextAttribute( hstdout, 0x07 );
    			}
    			is_first = !is_first;
    		}
    	}
    }
    


  • Herzlichen Dank.

    Falls du noch Zeit hast---

    Mir ist noch eingefallen:

    Wenn man z.B eingibt :

    1
    1
    2 (Ergebnis)
    1
    Enter drücken -> Erscheint das aktuelle Ergebnis, hier 3. Danach rechnet er ganz normal weiter...

    Also so:

    1
    1
    2 (Ergebnis)
    1
    Enter
    3 (Ergebnis)
    2
    2
    1 (Ergebnis)
    2
    Enter
    0 (Ergebnis)
    .
    .
    .

    Dass heisst man kann jederzeit das aktuelle Ergebnis sehen, durch drücken der Enter-Taste.



  • Denim schrieb:

    Falls du noch Zeit hast [...]

    Dann reichts aber - mehr geht nicht in 20 Zeilen ...

    #include <stdio.h>
    #include <conio.h> // platform-specific: getche()
    #include <windows.h> // platform-specific: GetStdHandle(), SetConsoleTextAttribute(), GetConsoleScreenBufferInfo(), SetConsoleCursorPosition()
    HANDLE const hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
    void print_colorful( int value ) {
    	SetConsoleTextAttribute( hstdout, 0x0c ); printf( "%d\n", value ); SetConsoleTextAttribute( hstdout, 0x07 ); }
    void undo_linebreak( void ) {
    	CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo( hstdout, &csbi );
    	csbi.dwCursorPosition.Y--; SetConsoleCursorPosition( hstdout, csbi.dwCursorPosition ); }
    int main( void ) {
    	char ch = 0; int sum = 0, op = 0, is_first = 1;
    	for( ;; ) {
    		if( ch = getche(), putchar( '\n' ), ch == '1' || ch == '2' ) {
    			if( is_first ) op = ( ch == '1' ? 1 : -1 );
    			else { print_colorful( sum += op + ( ch == '1' ? 1 : - 1 ) ); op = 0; }
    		} else if( ch == '\r' ) { undo_linebreak(); print_colorful( sum += ( is_first ? 0 : op ) );
    		} else continue;
    		is_first = !is_first;
    	}
    }
    


  • So herzlichen Dank!

    Programm ist fast fertig hänge noch an folgendem:

    Wenn man z.B. die Leertaste drückt, wird angezeigt wie viele Zahlen man bereits eingegeben hat (Enter wird nicht mitgezählt, nur die Zahlen), man kann aber sofort weiter danach weiter Zahlen eingeben, also nur eine kleine Statusinformation, die nichts am Programmablauf verändern soll.

    Es können auch ruhig 25 Zeilen sein :).

    Danach ist das Programm endgültig fertig !



  • Denim schrieb:

    Es können auch ruhig 25 Zeilen sein :).

    Sicher ned.

    #include <stdio.h>
    #include <conio.h> // platform-specific: getche()
    #include <windows.h> // platform-specific: GetStdHandle(), SetConsoleTextAttribute(), GetConsoleScreenBufferInfo(), SetConsoleCursorPosition()
    HANDLE const hstdout = GetStdHandle( STD_OUTPUT_HANDLE );
    void print_colorful( int value, short unsigned color ) {
    	SetConsoleTextAttribute( hstdout, color ); printf( "%d\n", value ); SetConsoleTextAttribute( hstdout, 0x07 ); }
    void undo_linebreak( void ) {
    	CONSOLE_SCREEN_BUFFER_INFO csbi; GetConsoleScreenBufferInfo( hstdout, &csbi );
    	--csbi.dwCursorPosition.Y; SetConsoleCursorPosition( hstdout, csbi.dwCursorPosition ); }
    int main( void ) {
    	char ch = 0; int sum = 0, op = 0, is_first = 1, num_ops = 0;
    	for( ;; ) {
    		if( ch = getche(), putchar( '\n' ), ch == '1' || ch == '2' ) {
    			if( is_first ) op = ( ch == '1' ? 1 : -1 );
    			else { print_colorful( sum += op + ( ch == '1' ? 1 : - 1 ), 0x0c ); op = 0; } ++num_ops;
    		} else if( ch == '\r' ) { undo_linebreak(); print_colorful( sum += ( is_first ? 0 : op ), 0x0c );
    		} else if( ch == ' ' ) { printf( "\r" ); undo_linebreak(); print_colorful( num_ops, 0x0a ); continue;
    		} else continue; is_first = !is_first;
    	}
    }
    


  • Danke !!!
    Ein Meisterstück 🙂



  • Ne, wahrscheinlich Trollfutter...



  • Ja, das stimmt, aus Sicht derjenigen, die nicht wissen wozu das Programm benutzt wird, dass alles musste ich bis jetzt im Kopf sehr schnell machen, jetzt macht das das Programm, eine echte Erleichterung :).
    Danke



  • In diesem Falle:

    Swordfish expressly disclaims any warranty for the above code snippet. It is provided 'As Is' without any express or implied warranty of any kind, including but not limited to any warranties of merchantability, noninfringement, or fitness of a particular purpose. Swordfish does not warrant or assume responsibility for the accuracy or completeness of any information, text, or other items contained within. Swordfish makes no warranties respecting any harm that may be caused by the transmission of a computer virus, worm, time bomb, logic bomb, or other such computer program. Swordfish further expressly disclaims any warranty or representation to Authorized Users or to any third party.


  • Mod

    Denim schrieb:

    Also ist wohl die Aufgabe von meinen derzeiten Wissenstand nicht lösbar.

    Es muss ja nicht so elegant sein wie bei Swordfish. Ich dachte an folgendes:

    #include <stdio.h>
    int main()
    {
        int sum = 0;
        char choice;
        while (scanf(" %c", &choice) == 1)
        {
            if (choice == '1')
            {
                sum += 1;
                printf("%d\n", sum);
            }
            if (choice == '2')
            {
                sum -= 1;
                printf("%d\n", sum);
            }
        }
        return 0;
    }
    

    Da dürftest du alles verstehen, oder? Die einzig neue Idee ist vielleicht, das scanf(" %c", &choice) == 1 direkt in die while-Bedingung zu packen, du hättest vermutlich eine Endlosschleife mit break oder änhliches gemacht (oder den Rückgabewert gar nicht geprüft?). Dann wäre ich aber nicht ohne Quetschen auf 20 Zeilen gekommen 🙂 (beachte, dass 8 meiner Zeilen nur aus Klammern bestehen).



  • Und, was lernt uns das nun? 😕 Klar, auch eine unsinnige Aufgabe kann man zum Laufen bringen - auch wenn niemand anderes als der Fragesteller damit etwas anfangen kann. Ich bewundere die Mühe der anderen Poster zur Lösung beigetragen zu haben. Solche Denksportprogramme können möglicherweise das Gehirn trainieren und somit Alzheimer aufschieben - super! 🕶


  • Mod

    Was findet ihr eigentlich alle so unsinnig an der Aufgabe? Sie hat eine klare Formulierung, welche Eingabe, welche Ausgabe erzeugt. Sie ist in wenigen Zeilen zu lösen, benötigt aber mehrere Konstrukte zur Ablaufsteuerung und ein paar Überlegungen zu eben diesem Ablauf. Und es gibt sie, zumindest bis jetzt, nicht schon im Internet gelöst. 😋

    Ich hoffe mal, die Farbe und

    Wenn man z.B. die Leertaste drückt, wird angezeigt wie viele Zahlen man bereits eingegeben hat (Enter wird nicht mitgezählt, nur die Zahlen), man kann aber sofort weiter danach weiter Zahlen eingeben, also nur eine kleine Statusinformation, die nichts am Programmablauf verändern soll.

    waren nur Sachen, die sich der Threadersteller selber ausgedacht hat. Die wären wirklich ziemlich sinnlos.


Log in to reply