Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Zahlenausgabe

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
07.04.2009, 17:13 Uhr
~aaaaa
Gast


Hallo

bei diesem Programmteil habe ich Probleme. Ich will 5 Zahlen zwischen 1 und 7 eingeben.
Das Problem ist dass das Programm durchgeht erst wenn ich Enter drücke.
Ich bräuchte aber dass das Programm nach jedem Tastendruck durchgeht ohne Enter.

Denn so erscheint das else 6 mal nachdem die Zahlen eingegeben sind.

Ebenso überspringt es immer die if Anweisung. Ich vermute dass hat damit zu tun dass die Eingabe als Char erkannt wird und nicht als int.





C++:
char eingabe[6]={0};


while(j<=4)
    {
        eingabe[j] = getc(stdin);
    

        if ( (eingabe[j]>=1) && (eingabe[j]<=7) )
        {
            printf(" ");
            j++;
        }
        else
        {
            printf("Zahl von 1 bis 7 eingeben.\n");
            j=0;
        }
    }



MFG
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.04.2009, 20:06 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst mal, ja, getc(stdin) bzw. getchar() gibt ein Zeichen zurück, also musst du auf >= '1' und <= '7' prüfen. Den Wert der Ziffer erhältst du als eingabe[i] - '0'.

Was die ungebufferte Eingabe angeht, das ist vom System abhängig. Das alte DOS-API, welches auch unter Windows-Systemen verfügbar ist, hat in der conio.h eine Funktion getch():

C++:
#include <stdio.h>
#include <conio.h>

int main(void) {
  printf("Beliebige Taste drücken...");
  fflush(stdout);
  getch();

  return 0;
}



Unter UNIX-Systemen (alles, was sich an POSIX hält) gibt es ein weitaus flexibleres, aber auch komplizierteres Konsolen-API. In diesem Fall willst du das Terminal in den nicht-kanonischen Eingabemodus versetzen und read jedes bisschen Daten sofort lesen lassen, also:

C++:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>

int main(void) {
  struct termius old_settings, new_settings;

  /* Terminal-Einstellungen holen */
  tcgetattr(STDIN_FILENO, &old_settings);

  new_settings = old_setting;
  /* kanonischen Modus ausschalten */
  new_settings.c_lflag &= ~ICANON;
  /* Parameter für read-Verhalten */
  new_settings.c_cc[VMIN] = new_settings.c_cc[VTIME] = 0;
  /* neue Einstellungen setzen */
  tcsetattr(STDIN_FILENO, TCSANOW, &new_settings);

  /* Jetzt verhält sich getchar() wie getch() */
  printf("Beliebige Taste drücken...");
  fflush(stdout);
  getchar();

  /* ursprüngliche Einstellungen zurückspielen */
  tcsetattr(STDIN_FILENO, TCSANOW, &old_settings);

  return 0;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.04.2009, 20:31 Uhr
~aaaaa
Gast


Hallo,

danke für die Antwort.

Mit conio habe ich es schon versucht aber Linux unterstützt nicht conio. Gibt es noch eine andere Möglichkeit.

Den zweiten Code kann ich nicht nachvollziehen. Wollte es möglichst mit Ansi C programmieren.

Ich gebe ein char ein aber vergleiche es beim if() mit einem Integer. Vielleicht ist das auch das Problem.

>='1'

ob die 1 als Integer oder Char dargestellt wird, spielt das eine Rolle. Denn ich will ja auf einen bestimmten Integer-Bereich prüfen.

Ziel war es von 7 Zahlen 5 einzugeben. Nach jeder Zahleneingabe soll es prüfen ob die Zahl zulässig ist. Nach 5 eingegebenen Zahlen wil ich auf Enter drücken damit es dann mit anderen Zahlen vergleicht
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.04.2009, 20:42 Uhr
0xdeadbeef
Gott
(Operator)


ANSI-C weiß nichts von Terminals, also nein. Du wirst dich schon an das POSIX-Terminal-API wenden müssen. Oder du machst es ganz stumpf im kanonischen Modus - ich würde wahrscheinlich 5 Zahlen auf einmal verlangen und mit scanf einlesen, etwa so:

C++:
int a[5], i;

printf("Geben sie 5 Zahlen ein: ");
fflush(stdout);
for(i = 0; i < 5; ++i) {
  scanf("%d", &a[i]);
}


...das Einlesen mit scanf dürfte auch gleich das andere Problem beheben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.04.2009, 20:52 Uhr
Pler
Einer von Vielen
(Operator)


Du liest aber nicht integer ein, sondern chars, die diese Zahlen darstellen. Und die chars stehen in den Code-Tabellen sozusagen verschoben weiter hinten. Wenn du '' benutzt, zeigst du, dass du char statt Zahl meinst.

Da die chars für die Zahlen hintereinander in der Code-Tabelle liegen, kannst du den Vergleich auch so machen, wie von Beefy vorgeschlagen.

http://de.wikipedia.org/wiki/ASCII-Tabelle#ASCII-Tabelle
Da sieht Du es. Das Zeichen 1 steht hier an Stelle 49. Du könntest also auch if(eingabe[j]>=49 ...) Schreiben.

Dieser Post wurde am 07.04.2009 um 20:52 Uhr von Pler editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.04.2009, 20:53 Uhr
~aaaaa
Gast


Mit scanf müßte ich 5 x Enter drücken.

Ich wollte 5 Zahlen eingeben zb. 1 5 4 3 8 dann Enter drücken und dann in eine Unterfunktion dass es die Zahlen mit anderen Zahlen vergleicht. Jedoch nach jeder Zahleneingabe soll es prüfen ob die Zahl zwischen 1 und 7 ist.

Das fflush leert den Buffer? Oder täusche ich mich da.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.04.2009, 23:25 Uhr
0xdeadbeef
Gott
(Operator)


Du musst nicht fünf mal Enter drücken, die Zahlen müssen nur hintereinander im Stream auftauchen. Es reicht dafür, zum Beispiel "1 2 3 4 5" einzugeben und dann einmal Enter zu drücken.

fflush "spült" den Buffer. Alles, was sich im Puffer befindet, erscheint so sofort dort, wo der Ausgabestream hinzeigt; in diesem Fall ist das die Konsole. Andernfalls hängt das Verhalten hier von den Konsoleneinstellungen ab.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.04.2009, 12:01 Uhr
~aaaaa
Gast


Wenn ich bei scanf nicht 5 mal Enter drücken muss woher erkennt es dann bei int Zahlen ob es sich um

1 2 3 4 5 oder 12.345,00.

handelt.

Mein Idee war auch wenn ich eine Taste drücke dass es automatisch ein Space macht.

Mir ist das noch mit dem fflush unklar. Wenn ich getchar() oder scanf verwende "spült" es auch immer gleich den Puffer. => Jede Taste die ich drücke sehe auf der Konsole.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.04.2009, 12:30 Uhr
~aaaaa
Gast


Wieso funktioniert das nicht:

a[i]= atoi ( eingabe [i] )
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.04.2009, 15:38 Uhr
~toxic
Gast



Zitat von ~aaaaa:
...woher erkennt es dann bei int Zahlen ob es sich um

1 2 3 4 5 oder 12.345,00.

handelt. ...

weil die zahlen durch leerzeichen getrennt sind
es könnte ja auch "1 23 4 7 99" drin stehen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: