"Christmas - the time to fix the computers of your loved ones" « Lord Wyrm

C Anfänger kommt nicht weiter

noir 25.11.2012 - 22:47 6344 32
Posts

noir

Overclocking Team Member
Avatar
Registered: Dec 2007
Location: Salzburg/OÖ
Posts: 2301
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;
}

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
click to enlarge


Gruß
noir

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
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
Avatar
Registered: Jan 2004
Location: /root/home
Posts: 1884
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
Registered: Dec 2002
Location: Inside
Posts: 4422
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
Avatar
Registered: Aug 2003
Location: ~
Posts: 1624
Die fors in den Zeilen 21-42 sollten ifs sein
Code: C
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 :D

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
Avatar
Registered: Jan 2004
Location: /root/home
Posts: 1884
Zitat von -=Willi=-
btw. Struktogramme werden imho gar nicht mehr verwendet. Flow Charts sind da zeitgemäßer.

full ack :D ... in OO sogar klassendiagramme :/

Burschi1620

24/7 Santa Claus
Avatar
Registered: Apr 2004
Location: Drüber da Donau
Posts: 6792
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

Moderator
Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11326
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  |
+--------------------+

zu:
Code: C
do
{
    irgendwas
} while (Bedingung);

Ebenso wird
Code:
+----------------------+
| Für ziffer = 1 bis 4 |
|   +------------------+
|   | irgendwas        |
+---+------------------+

zu:
Code: C
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

Risen from the banned
Avatar
Registered: Oct 2002
Location: Pre
Posts: 14361
everything what that said + "geh leck ein struktogramm".

noir

Overclocking Team Member
Avatar
Registered: Dec 2007
Location: Salzburg/OÖ
Posts: 2301
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
Registered: Dec 2002
Location: Inside
Posts: 4422
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

Administrator
Frickler
Avatar
Registered: Dec 2000
Location: ~
Posts: 11920
Sobald ich pers. irgendwo
Code:
system("PAUSE");
lese, lauf ich einfach nur noch weit weg und schreie dabei laut :p

noir

Overclocking Team Member
Avatar
Registered: Dec 2007
Location: Salzburg/OÖ
Posts: 2301
Mir wäre auch Code Blocks @ Ubuntu lieber aber der Lehrer hat von meiner Idee nicht viel gehalten
Shit happens

Blair

Big d00d
Avatar
Registered: Dec 2004
Location: Graz
Posts: 177
Zitat von noir
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
Registered: Dec 2002
Location: :-)
Posts: 689
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. :p
Bearbeitet von icy am 27.11.2012, 06:21
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz