URL: https://www.overclockers.at/coding-stuff/c-anfnger-kommt-nicht-weiter_232609/page_1 - zur Vollversion wechseln!
Hy
Kleine Einleitung:
Ich bin jetzt im 3.Semester in der Abend HTL für Elektrotechnik
und wir haben heuer mit C-Programmieren angefangen (leider haben wir nur jede zweite woche am Montag eine Einheit und am Mittwoch zwei)
Am Anfang haben wir uns in Informatik nochmal mit Binär und Hex Zahlen beschäftigt dann ist Hello World gekommen.
Das war noch kein Problem
Nach ein paar kleinen Programmen die auch noch nicht wirklich ein Problem dargestellt haben hat der Lehrer dann Vollgas gegeben
das war vor 2 Wochen
Wir haben die Erstellung und von Struktogrammen und deren Verwendung durchgenommen kein Problem
Dann haben wir einen Source Code von Ihm bekommen "Tippt das ab und versteht es" ohne jegliche Auskunft zu den schleifen ect.
Jetzt zu meinem Problem:
Diese Woche haben wir ein Struktogramm bekommen ohne Infos und Anhaltspunkte wie wir das lösen sollten/können
Es geht um einen Binär zu Dezimal Umrechner der ein Nibble umrechnen kann
und bei jeder Eingabe sofort die Zahl auf einen Fehler (sprich 0 od. 1 sonst Fehler) prüft
am ende gibt es dann eine Abfrage ob man noch eine Zahle umrechnen will oder ob das Programm beendet werden soll
Das wären mal meine Überlegungen gewesen nur sagt mir schon der Compiler da passt was nicht "Syntax Fehler":
Übrigens die IDE ist Bloodsheed Dev. C/Cpp unter Win 7
Code: C#include <stdio.h> #include <stdlib.h> int main(void) { int a, b, c, d, erg; char bin0, bin1, bin2, bin3, janein; printf ("Binaer Nibbel in Dezimalzahl umwandeln\n"); do // beginn der programm-schleife { do { printf ("4 Binaer-Ziffern eingeben: "); bin0 = getche(); //erste zahl einlesen for (bin0 != 0 && bin0 != 1) { //überprüfen ob wirklich nur 0 oder 1 eingegben wurde printf ("Nur Null oder Eins eingeben"); //fehlermeldung wenn eine andere zahle eigegeben wurde } bin1 = getche(); //zweite zahl einlesen for (bin1 != 0 && bin1 != 1) //überprüfen ob wirklich nur 0 oder 1 eingegben wurde { printf ("Nur Null oder Eins eingeben"); //fehlermeldung wenn eine andere zahle eigegeben wurde } bin2 = getche(); //dritte zahl einlesen for (bin2 != 0 && bin2 != 1) //überprüfen ob wirklich nur 0 oder 1 eingegben wurde { printf ("Nur Null oder Eins eingeben"); //fehlermeldung wenn eine andere zahle eigegeben wurde } bin3 = getche(); //vierte zahl einlesen for (bin3 != 0 && bin3 != 1) //überprüfen ob wirklich nur 0 oder 1 eingegben wurde { printf ("Nur Null oder Eins eingeben"); //fehlermeldung wenn eine andere zahle eigegeben wurde } }while ( (bin0 !=0 || bin0 !=1) && (bin1 !=0 || bin1 !=1) && (bin2 !=0 || bin2 !=1) && (bin3 !=0 || bin3 !=1)); do { erg = ((var0 * 8 ) + (var1 *4) + (var2 * 2) + var3 ) printf ("Das Ergebniss = %i\n", erg); printf ("\n"); printf ("Wollen Sie noch eine Berechnung durchführen? (Ja...j eingeben oder Nein...n eingeben"); janein = getche(); janein = toupper(janein); if (janein != 'N' && janein != 'J') { printf ("Es wurde ein falschen Zeichen eingegeben!!!"); } }while (janein != 'J' && janein != 'N'); }while (janein == 'J'); // ende des programms system("PAUSE"); return 0; }
C ist zwar schon lange her, aber ich denke eine for-Schleife mag keinen boolschen Ausdruck. (for (bin0 != 0 && bin0 != 1))
Du solltest eine while-Schleife benützen..
der standard for-statement ausdruck schaut anders aus, wie du es es in deinem for-statement hast. kann mir sogar vorstellen (hab das jetzt in deinem text gelesen, hab vorher nur den code angeschaut), dass ein error geworfen wird, weil der syntax nicht passt.
entweder while oder if würden passen.
was ich auch nicht genau versteh ist, wieso hast du bin0, etc als char, wenn es nur 0 oder 1 sein soll, hab jetzt den code noch ein wenig überflogen, wenn ein chast kommt, dann passts.
müsste doch ein error dann ausgeben, wenn du nur 0 oder 1 eingegeben werden soll und dann kommt vllt ein 'a' oder 'b', dann passt es ja nicht mehr laut deinem Kommentar bei der Abfrage.
mit einem int und einem if kannst es so schreiben: if(bin0 < 0 && bin0 > 1) ... da hast bei int nur 0 oder 1. kannst zwar auch 0.5 eingeben, sollte aber auch vorher dann abgefangen werden mit try & catch, weil ja "int".
Das "for" sollte wohl ein "if" sein, wenn ich mir den Code so anschaue. Compilieren tut das ja so nicht...
Ich kenne das Windows-spezifische "getche" nicht, ich glaub aber nicht dass das tatsächlich die Integer-Werte 0 oder 1 zurückgibt, eher die ASCII-Chars dieser Zeichen.
Auch hast du die Variablen var0, var1 usw. nichtmal wo deklariert; bzw. vermute ich du meinst damit bin0, bin1, etc. (da fehlt in Zeile 51 auch der abschließende Strichpunkt).
Es ist klar dass die C-Kenntnisse noch nicht weit sieht, aber in der Form kompiliert das nicht mal, sprich "da geht goar nix".
Glaubst kriegst du eine Version hin, die wenigstens einmal kompiliert und du dann konkretere Frage noch stellen magst?
(Struktorgramme? Ist das wirklich heute noch Best-Practice? Ich hab das vor 15 Jahren in der HTL schon für idiotisch gefunden
)
Die fors in den Zeilen 21-42 sollten ifs sein
Code: Cif((bin0 != 0) && (bin0 != 1)) { //überprüfen ob wirklich nur 0 oder 1 eingegben wurde //fehlermeldung wenn eine andere zahle eigegeben wurde printf ("Nur Null oder Eins eingeben"); }

Zitat von -=Willi=-btw. Struktogramme werden imho gar nicht mehr verwendet. Flow Charts sind da zeitgemäßer.
... in OO sogar klassendiagramme :/Die 'for' in if's umwandeln ist nicht der Weisheits letzter Schluss, da man sich so eine erneute direkte Eingabe verbaut. Deshalb ist hier ein do-while einfacher. (While selbst geht nicht, da die variable überprüft wird, bevor was drinnen steht bzw. nicht mehr überprüft wird, wenn etwas falsches drinnen steht. Dsa muss man sich immer vor Augen halten)
Da du noch echt ein paar Defizite hast (gibst du ja selbst zu - vor allem wegen der Kontrollstrukturen), würde ich Vorschlagen du ackerst das mal etwas durch:
http://openbook.galileocomputing.de/c_von_a_bis_z/
Dein Code sollte viel mehr dem Struktogramm entsprechen, dann wird vieles einfacher. Jeden Block im Struktogramm kann man 1:1 in C umsetzen. Wenn du draufkommst, dass du denselben Code mehrmals wiederholen musst (bin0 bis bin3), dann läuft etwas falsch, und so kommt es ja auch in der Angabe nicht vor.
Wie du richtig bemerkt hast, wird
Code:+---+----------------+ | | irgendwas | | +----------------+ | Solange Bedingung | +--------------------+
Code: Cdo { irgendwas } while (Bedingung);
Code:+----------------------+ | Für ziffer = 1 bis 4 | | +------------------+ | | irgendwas | +---+------------------+
Code: Cfor (ziffer = 1; ziffer <= 4; ++ziffer) { irgendwas }


everything what that said + "geh leck ein struktogramm".
Erstmal danke für die schnellen Antworten
das die for-Schleife keine boolschen Ausdrücke mag wusste ich nicht
der Fehler mit den Variablen Var und bin muss mir beim umschreiben passiert sein
sorry sollte nicht vorkommen
hatte vorher nur var und dachte mir dann "ah nimm doch lieber bin"
ist aber mit Sicherheit zur zeit mein kleinstes Problem
werde versuchen die Tage eure Tips um zu setzen
Sprich
mich mehr an des Struktogramm halten
mal eine Version basteln die zumindest kompilierbar ist (sollten dann noch Fragen sein nochmal nachfragen nicht vorher)
Mir das open book reinziehen
Danke nochmal an alle
Wird schon werden 
Nebenbei Anekdote: Ich hab den Code zuerst mit GCC kompiliert und, bist du grauslich, da waren die Fehlermeldungen ... dürftig. Hab gehört das "clang" beim Fehlerreporten viel besser ist, also "apt-get install clang", das sind Welten unterschied O_O. Und dann auch glauch colored console output, w00t!
Sobald ich pers. irgendwo
lese, lauf ich einfach nur noch weit weg und schreie dabei lautCode:system("PAUSE");

Mir wäre auch Code Blocks @ Ubuntu lieber aber der Lehrer hat von meiner Idee nicht viel gehalten
Shit happens
Zitat von noirErstmal danke für die schnellen Antworten
das die for-Schleife keine boolschen Ausdrücke mag wusste ich nicht
da steht die abbruchbedingung.gcc -Wall -lm shit.c -o shit
http://pastebin.com/Gt5cNhGk
Funktioniert solange Integer eingegeben werden.
Ist ein Aufruf von main erlaubt? #120
Kann man gegen die Warnung etwas tun?
shit.c:27:7: warning: implicit declaration of function ‘__fpurge’ [-Wimplicit-function-declaration]
Ob es bei printf("\a"); wirklich piept konnte ich noch nicht testen. 
overclockers.at v4.thecommunity
© all rights reserved by overclockers.at 2000-2025