noir
Overclocking Team Member
|
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 #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;
}
Ich bitte um kleine richtungsweisende Tips nicht um die Komplettlösung Wenn ich total falsch bin könnt ihr das gerne sagen in dem Struktogramm ist zwar eine case switch verzeichnet ich weis aber nicht wirklich was ich damit anfangen sollte in diesem fall Hier noch das Struktogramm Gruß noir
|
Obermotz
Fünfzylindernazi
|
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..
|
cr0ssSyntaX
der quotenchinese
|
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".
Bearbeitet von cr0ssSyntaX am 25.11.2012, 23:18
|
Rektal
Here to stay
|
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 )
|
-=Willi=-
The Emperor protects
|
Die fors in den Zeilen 21-42 sollten ifs sein if((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");
}
...double pwnd...war klar btw. Struktogramme werden imho gar nicht mehr verwendet. Flow Charts sind da zeitgemäßer.
Bearbeitet von -=Willi=- am 25.11.2012, 23:18
|
cr0ssSyntaX
der quotenchinese
|
btw. Struktogramme werden imho gar nicht mehr verwendet. Flow Charts sind da zeitgemäßer. full ack ... in OO sogar klassendiagramme :/
|
Burschi1620
24/7 Santa Claus
|
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/
|
that
Hoffnungsloser Optimist
|
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 +---+----------------+
| | irgendwas |
| +----------------+
| Solange Bedingung |
+--------------------+
zu: do
{
irgendwas
} while (Bedingung);
Ebenso wird +----------------------+
| Für ziffer = 1 bis 4 |
| +------------------+
| | irgendwas |
+---+------------------+
zu: for (ziffer = 1; ziffer <= 4; ++ziffer)
{
irgendwas
}
Was du mit dem switch-case anfangen sollst, ist einfach: Nachschauen wie die Syntax in C aussieht und umsetzen. Generell solltest du auf saubere und einheitliche Einrückungen achten (ob du für jede Stufe 2, 3 oder 4 Leerzeichen oder Tabs benutzt, ist Geschmackssache, aber einheitlich sollte es sein), das macht die Struktur übersichtlicher und den Vergleich mit dem Struktogramm einfacher. Und beim nächsten Syntaxfehler poste die genaue Fehlermeldung des Compilers und den genauen Grund, warum du ihn nicht selbst beheben kannst.
|
semteX
begehrt die rostschaufel
|
everything what that said + "geh leck ein struktogramm".
|
noir
Overclocking Team Member
|
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
|
Rektal
Here to stay
|
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!
|
COLOSSUS
AdministratorGNUltra
|
Sobald ich pers. irgendwo system("PAUSE");
lese, lauf ich einfach nur noch weit weg und schreie dabei laut
|
noir
Overclocking Team Member
|
Mir wäre auch Code Blocks @ Ubuntu lieber aber der Lehrer hat von meiner Idee nicht viel gehalten Shit happens
|
Blair
Big d00d
|
Erstmal danke für die schnellen Antworten
das die for-Schleife keine boolschen Ausdrücke mag wusste ich nicht ein for-statement mag boolsche ausdrücke sogar sehr gerne, aber nur zwischen den 2 strichpunkten. da steht die abbruchbedingung.
|
icy
OC Addicted
|
gcc -Wall -lm shit.c -o shit http://pastebin.com/Gt5cNhGkFunktioniert 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.
Bearbeitet von icy am 27.11.2012, 06:21
|