Seite 1 von 2

problem in C

Verfasst: Sa Nov 17, 2007 3:32 pm
von asi
Ich hab beim c programmieren ein Problem und da hier ja so viele Informatiker sind, kann mir vielleicht geholfen werden. ;)

(An dieser Stelle ein Danke an retroK der mir freundlicherweise bei meinem Letzten Problem schon sehr geholfen hat!)

also - die Aufgabenstellung ist folgende:
Der Benutzer darf irgendeinen String eingeben. Bitte schreiben Sie ein C-Programm, welche
überprüft, ob dieser String eine Zahl ist, deren Wert den Anforderungen des Typs „unsigne
int“ genügt. Bitte überlegen Sie sich, was der Benutzer alles falsch machen kann, fangen Si
es (mit möglichst wenigen Fallunterscheidungen) ab und teilen Sie es dem Benutzer mög
lichst einfach mit (z.B. „mindestens ein Zeichen ist keine Ziffer!“). Lesen Sie über verwend
te Funktionen ggf. in einer C-Referenz nach, so dass Sie wissen, was passiert. Bitte testen Si
Ihr Programm mit sinnvollen und unsinnigen Eingaben.

Dieses Programm soll die Grundlage einer Funktion zur Eingabeprüfung bilden. Es soll als
wieder verwendet werden.

Hinweise:
Bitte überlegen Sie, wie lang der String höchstens sein darf, damit er die Bedeutung eines
sinnvollen „unsigned int“-Wertes haben kann (wenn der Benutzer einen längeren String ein-
gibt, so muss dieser als falsch gewertet werden.)
--->Ihr Programm soll unabhängig von der Wortbreite der CPU funktionieren! <---
Ich habe leider keine ahnung wie man die unabhängigkeit von der Wortbreite hinkriegen könnte.

hab n bisschen in meinem skript rumgeblättert und da beim thema variablen etc. die Funktion "sizeof" gefunden
2. Die tatsächliche Anzahl von Bits variiert je nach Rechnersystem.
Vorsicht bei der Portierung von Programmen!
3. Mit der Funktion sizeof kann die tatsächliche Speicherplatzgröße eines Datentyps in
Byte ermittelt werden, z.B.:
int a,b;
a=sizeof(unsigned int)
b=sizeof(a);
allerdings weiß ich jetzt nicht ganz was ich mit der bytezahl die ich rauskriege (zb: b=4) anfangen kann - daraus müsste man ja irgendwie rauskriegen können was die größtmögliche unsigned int zahl ist oder?


mein programm soweit:

Code: Alles auswählen

int main()
{
   int probe, laenge, i, zahl=0, zahl1=1, a, b;
   char eingabe[100];
  
  a=sizeof(unsigned int);
  b=sizeof(a);
  printf("\na: %d  b: %d \n",a ,b);

   
  do
  { 
    probe=0;
    printf("\nEingabe: ");
    fgets(eingabe, 100, stdin); 
    laenge=strlen(eingabe); 
    if (laenge>11)
    {
      printf("\nEigabe zu lang\n");
      probe++;
    }
    
    printf("\nlaenge: %d\n",laenge);
    
    for (i=0; i<laenge-1; i++)
    {
       if (isdigit(eingabe[i]))    
       {
         continue;
       }
       else 
       {
        printf("\nNur Zahlen eingeben!\n");
        probe++;
        break;
       } 
     } 
  } while (probe!=0);
  puts(eingabe);
 
  zahl = atoi(eingabe);
  printf("\nzahl: %d\n", zahl);
  
  return 0;
}
wobei das if (laenge>11) auf 32bit bezogen war - das muss ich irgendwie unabhängig kriegen.
Ausserdem wärs nicht schlecht wenn man für das Feld dynamisch speicher reservieren könnte (hab da auch noch keine ahnung wie das gehen soll)

wär cool, wenn mir jemand helfen könnte.

Verfasst: Sa Nov 17, 2007 11:09 pm
von asi
update: das problem hat sich nach umfangreichen recherchen größtenteils erledigt - jetzt bin ich nur noch auf der suche nach ner methode, wie ich am elegantesten verhindern kann, dass der benutzer eine zahl eingibt, die größter als die größtmögliche unsigned int zahl ist.
Das beste was ich mir ausdenken konnte war einen zweiten char array zu machen und da die größtmögliche unsigned int zahl reinzupacken und dann stelle für stelle darauf abfragen ob das eingegebene größer (bzw kleiner) ist.
aber so toll ist das sicherling nicht - und die prüfer wollen gerne effizientere programme haben :|

Verfasst: Sa Nov 17, 2007 11:48 pm
von DRK
C? Was war nochmal C?
A ist küssen, B ist duweisstschonwas, aber was ist C? :D




Bild

Verfasst: So Nov 18, 2007 4:20 am
von Enlil
Wenn du weisst, dass dein unsigned int n Byte hat, weisst du dass zur Darstellung m= n*8 Bit zur verfuegung stehen. Es faellt nix fuer das vorzeichen oder ein Kommastelle oder weiss der Teufel was weg. Also musst du nurnoch rausfinden, was die groesste Zahl ist, die du mit m Bits darstelen kannst. Dazu waeren alle Stellen mit einer 1 in der Binaerdarstellung belegt. Diese Zahl ist also 2^m + 2^(m-1)+.....+2^0 =x. Weil das so doof auszurechenen ist und die naechst groessere Binaerzahl nur eien einzige 1, naemlich an der Stelle mit dem Wert 2^(m+1) hat nehmen wir doch einfach 2^(m+1)-1. Das muesste dann die groesste Zahl sein, die in den unsigned int reinpasst.
Da ich auf Arbeit zwar immerhin C++ programmiert hab, aber nur in Verbindung mit Qt, hab ich damit nie wirklich was zu tun gehbat, weshalb das natuerlich alles ohne Garantie kommt.

Verfasst: So Nov 18, 2007 12:51 pm
von asi
danke - damit hast du mich in die richtige richtung gestoßen - an der rechnung stimmt zwar etwas nicht da 2^(m+1)das doppelte der höhstmöglichen zahl ergibt - der höhste unsigned integer müsste 2^(m)-1 sein - im falle von 4byte - m=32bit also 2^32 -1 = 4294967295. - aber es hat mir die augen geöffnet bezüglich wie man von der bitzahl eines int zur wortbreite der cpu kommt :)

Verfasst: Fr Nov 23, 2007 8:06 am
von Katana
Für Java könnte ich folgendes anbieten:

Code: Alles auswählen

public boolean isNumber(String str) {
  try {
    Long.parseLong(str);
    return true;
  } catch (NumberFormatException e) {
  }
  return false;
}
;)

Verfasst: Fr Nov 23, 2007 8:39 am
von asi
ich hab ne simple lösung gefunden bei der man einfach die headerdatei
limits.h einbindet und dann damit die maximalen werte einfach per definiertem begrif abrufen kann.
Habs aber dann doch so gemacht wie enlil mich drauf gebracht hat
mit:
sizeof(unsigned int) und dann das ergebnis davon mal 8 um die wortbreite der CPU zu bekommen - dann (2^wortbreite)-1 gerechnet um die höhste unsigned integer zahl zu bekommen -hat geklappt und Prof war zufrieden.

Verfasst: Sa Nov 24, 2007 10:06 am
von Katana
Ich weiß schon, warum ich kein C mache.
In der heutigen Zeit möchte ich mich nicht mehr damit rumplagen müssen, wie viele Zahlen ich denn nun in meine Variable kriege.

Oder das sizeof() von Arrays (wenn ich's noch richtig in Erinnerung habe), das man nutzen muss damit man beim Array nicht raus läuft, sonst greift man halt eben mal auf anderen Speicher zu...

Furchtbar!

Verfasst: Sa Nov 24, 2007 1:16 pm
von asi
jo c kann schon nervig sein - die Profs meinten C sei aber gut um programmieren zu lernen da es einem solche sachen nicht abnimmt muss man genau wissen was man macht usw - ausserdem hat einer der Prüfer auf meine nachfrage gesagt, es soll für Technische Informatik wichtig sein, da es schneller ist als andere bequemere sprachen was vor allem für embedded systems von Vorteil ist.
Naja das ist jetzt im Rahmen der "Grundlagen der Programmierung"- ich hab keine Ahnung mit was für ner sprache es im 2. Semester bei "objektorientiertes programmieren" weitergehen wird.

Verfasst: Sa Nov 24, 2007 5:37 pm
von DarkZero
asi hat geschrieben:was vor allem für embedded systems von Vorteil ist
Ich mach Embedded Systems in Ada...

Und bei objektorientierten kommt dann bestimmt C++ ;)

Verfasst: Sa Nov 24, 2007 6:26 pm
von asi
kann gut sein.

Verfasst: Sa Nov 24, 2007 7:07 pm
von Enlil
Wenn du ein anspruchsvolles Spiel programmieren moechtest, kommt dafuer Java oder aehnliches nicht in Frage. Am besten wird der Kram in C oder C++ geschriben und die wirkliche Kernarbeit in der Gameloop im Idalfall in Assmenler. Wenn man allerdings nicht gut programmieren kann, dann ist der C-Code vermutlihc langsamer als Java-Coder. Man muss halt wissen wie.

Verfasst: Sa Nov 24, 2007 7:23 pm
von XTale
asi hat geschrieben:ich hab ne simple lösung gefunden bei der man einfach die headerdatei
limits.h einbindet und dann damit die maximalen werte einfach per definiertem begrif abrufen kann.
der maximale Wert wird dann aber doch zum compilezeit ermittelt. dh wenn du das ding auf nem 32bit system compiliert und auf ner 64bit kiste ausführst, sind diese max-werte wohl nicht korrekt

Verfasst: Sa Nov 24, 2007 7:45 pm
von asi
ja aber der selbe effekt tritt bei dem "sizeof" operator auf.
Die größe wird da nämlich auch beim Kompilieren festgestellt (auch wenn viele leute denken der machts in echtzeit).
Mehr war auch nicht verlangt von uns - aber wenn du ne bessere lösung hast bei der die größe in echtzeit errechnet wird immer her damit.

Verfasst: Sa Nov 24, 2007 8:33 pm
von XTale
Ok, dann ist es egal ;)