problem in C

Hardware, Software, Webdesign & Coding.

Moderator: Katana

Benutzeravatar
asi
Sergeant Hentai
Beiträge: 6004
Registriert: Mo Aug 06, 2001 12:01 am

problem in C

Beitrag 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.
Benutzeravatar
asi
Sergeant Hentai
Beiträge: 6004
Registriert: Mo Aug 06, 2001 12:01 am

Beitrag 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 :|
Benutzeravatar
DRK
Beiträge: 3812
Registriert: So Jul 08, 2001 12:01 am

Beitrag von DRK »

C? Was war nochmal C?
A ist küssen, B ist duweisstschonwas, aber was ist C? :D




Bild
Bild
Benutzeravatar
Enlil
Beiträge: 4279
Registriert: Sa Jan 20, 2001 1:01 am

Beitrag 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.
Benutzeravatar
asi
Sergeant Hentai
Beiträge: 6004
Registriert: Mo Aug 06, 2001 12:01 am

Beitrag 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 :)
Benutzeravatar
Katana
Beiträge: 5337
Registriert: So Jan 02, 2000 1:01 am

Beitrag 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;
}
;)
Benutzeravatar
asi
Sergeant Hentai
Beiträge: 6004
Registriert: Mo Aug 06, 2001 12:01 am

Beitrag 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.
Benutzeravatar
Katana
Beiträge: 5337
Registriert: So Jan 02, 2000 1:01 am

Beitrag 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!
Benutzeravatar
asi
Sergeant Hentai
Beiträge: 6004
Registriert: Mo Aug 06, 2001 12:01 am

Beitrag 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.
Benutzeravatar
DarkZero
Beiträge: 2342
Registriert: So Jul 15, 2001 12:01 am

Beitrag 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++ ;)
満足したら終でしょう!
Homepage: DarkZero's Translations
Bild Renault Fahrer
Benutzeravatar
asi
Sergeant Hentai
Beiträge: 6004
Registriert: Mo Aug 06, 2001 12:01 am

Beitrag von asi »

kann gut sein.
Benutzeravatar
Enlil
Beiträge: 4279
Registriert: Sa Jan 20, 2001 1:01 am

Beitrag 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.
Benutzeravatar
XTale
Zweiter Admin im Bunde
Beiträge: 4736
Registriert: Fr Mai 12, 2000 12:01 am

Beitrag 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
Bild
Benutzeravatar
asi
Sergeant Hentai
Beiträge: 6004
Registriert: Mo Aug 06, 2001 12:01 am

Beitrag 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.
Benutzeravatar
XTale
Zweiter Admin im Bunde
Beiträge: 4736
Registriert: Fr Mai 12, 2000 12:01 am

Beitrag von XTale »

Ok, dann ist es egal ;)
Bild
Antworten