C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Schnelle objektorientierte, kompilierende Programmiersprache.
Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Mo Sep 30, 2013 10:49 pm

Lone hat geschrieben:Hat mich nicht weitergebracht, Nimms mir nicht übel aber ich sitz da jetzt so lange dran das ich mit Sicherheit sagen kann, das ich da nicht mehr drauf kommen werde.
Ich habe 1986 angefangen zu programmieren. Etwa 1994 habe ich mit C angefangen. 1996 habe ich sechs Wochen lang einen einzigen Fehler gesucht. 2003 konnte ich das mal mit 8 Wochen überbieten. 2003 habe ich nichts anderes macht. Gar nichts. Morgens aufstehen, Fehler suchen, abends ins Bett. Das war im Studium. Einmal pro Woche hielt ich ein Tutorium, sonst habe ich diesen Fehler gesucht.
Ich habe beide Fehler gefunden. Und ich habe in beiden Fällen sehr viel dabei gelernt.
Lone hat geschrieben:Ich schreibd en vermüllten Code dann mal trotzdem hier rein.
Schreib niemals Code hier rein, wenn Du schon selbst weißt, dass er vermüllt ist. Ich kann Deinen Code problemlos lesen, weil er noch sehr kurz ist, aber Du möchtest Hilfe erhalten, also hilf uns zu helfen. Bitte sorg also dafür, dass Du den Code sauber formatiert hast, damit wir den Code gut lesen können. Und häufig wirst Du auch Fehler finden, wenn Du den Code selbst sauber formatierst.

Ich möchte von Dir, dass Dir überlegst, was Du da programmierst. Und ich möchte, dass Du Deinen Code kommentierst und reinschreibst, was Du Dir an den einzelnen Stellen denkst. So mache ich das auch, wenn ich Schwierigkeiten habe, ein Programm einfach runter zu programmieren.

Und ich möchte, dass Du erstmal die Abfrage vergisst, ob Du die Zahl bereits vorher eingegeben hast, sondern nur darauf achtest, dass die Zahl zwischen 1 und 49 ist.

Ich kann Dir das flott runterprogrammieren, aber Du möchtest programmieren lernen und das bedeutet weniger etwas sofort runterschreiben zu können, als Methoden zu lernen, Neues zu entwickeln, das man noch nicht einfach so runterschreiben kann.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Mo Sep 30, 2013 11:22 pm

Ich hab nicht vor bei C zu bleiben. Ich mache nur ein paar Übungsaufgaben bei denen ich die Aufgabenstellung etwas abändere, bis ich zufrieden bin. Danach gehts dann rüber zu C#. Ich mache auch kein Studium oder eine Ausbildung, sondern bringe mir das alles selber bei. Ich hab auch nicht die Vorstellung das alles in ein paar Tagen zu können aber ich treibs trotzdem so schnell voran wie möglich.

Weiter bin ich jetzt nicht gekommen und ich werde jetzt auch ins Bett gehen.

int holeposi(int *M,int n) {
int i;

for(i=0;i<20;i++) { //Schleife läuft 20 mal
if(M == n) { //wenn M[0 etc] genau gleich n dann
printf("\n%i. Stelle",i);
return M;
}
else //ansonsten -1
return -1;
}
}

int main() {
int a[20]= {12,23,45,39,15,3,5,3,44,1,6,77,88,23,23,34,45,65,76,87};

holeposi(&a[0],15);

printf("\n\nBeliebe Taste druecken...");
getch();
return 0;
}

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Mo Sep 30, 2013 11:56 pm

Lone hat geschrieben:Ich hab nicht vor bei C zu bleiben. Ich mache nur ein paar Übungsaufgaben bei denen ich die Aufgabenstellung etwas abändere, bis ich zufrieden bin. Danach gehts dann rüber zu C#.
Der Vorteil einer Uservorstellung ist, dass man abschätzen kann, was der User vorhat und wie man ihm das erklären kann.

C# ist näher an Java als an C. Es ist gewissermaßen das Java von Microsoft.
Lone hat geschrieben:Ich mache auch kein Studium oder eine Ausbildung, sondern bringe mir das alles selber bei. Ich hab auch nicht die Vorstellung das alles in ein paar Tagen zu können aber ich treibs trotzdem so schnell voran wie möglich.
Das wird nicht funktionieren. Um C zu programmieren, muss man die echte Maschine verstehen - der gravierendste Unterschied zu Java und C#, die eine virtuelle Maschine installieren.

Was ich Dir abverlange ist jedoch etwas anderes: Du sollst Programmieren lernen. Das passiert nicht, wenn ich Dir die Sachen einfach vorkaue. Wenn ich Dir Lösungen in C vorkaue, hast Du wenig davon, kannst aber immernoch nicht algorithmisch denken. Das wäre für uns beide Zeitverschwendung.

Aktuell bist Du in einer Try-and-Error-Phase. Das ist normal, aber nicht zielführend: Du programmierst irgendwas und wenn es die erwarteten Ergebnisse liefert, bist Du zufrieden. Programmieren lernen heißt richtige Programme zu schreiben und richtige Programme von Programmen, die richtige Ergebnisse liefern, zu unterscheiden.
Lone hat geschrieben: Weiter bin ich jetzt nicht gekommen und ich werde jetzt auch ins Bett gehen.

Code: Alles auswählen

int holeposi(int *M,int n) {
	int i;

		for(i=0;i<20;i++) {    //Schleife läuft 20 mal
			if(M[i] == n) { //wenn M[0 etc] genau gleich n dann
				printf("\n%i. Stelle",i);
				return M[i];
			}
			else                //ansonsten -1
				return -1;
		}	
}
Ich vermute zu wissen, was Du hier vorhast, aber erstens hat die Funktion einen irreführenden Namen, bzw. Du tust etwas, was funktioniert, aber nicht das, was Du tuen wolltest.

Programmieren hat sehr viel mit Disziplin zu tun - in C, wie auch in C#. Und es dauert seine Zeit, das zu verstehen. Statt "so schnell wie möglich", rate ich Dir auf "so effizient wie möglich" umzusatteln. :-)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Di Okt 01, 2013 2:37 pm

Code: Alles auswählen

int sucheinFeld(int* M,int n,int i) {
	int j;
	   
	for (j = 0; j < i; j++)
			if (M[j] == n)
				return j;
		return -1;
	}
So und jetzt ?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Di Okt 01, 2013 2:57 pm

Lone hat geschrieben:

Code: Alles auswählen

int sucheinFeld(int* M,int n,int i) {
	int j;
	   
	for (j = 0; j < i; j++)
			if (M[j] == n)
				return j;
		return -1;
	}
So und jetzt ?
Und jetzt ist es immernoch katastrophal eingerückt, ergibt aber wenigstens Sinn. :-)

Ein paar sprechendere Variablennamen dazu, üblicherweise programmiert man in Englisch...

Code: Alles auswählen

int getIndexOfValue(int * array, int value, unsigned int maxIndex ) 
{
    for (unsigned int i = 0; i < maxIndex; i++)
        if (array[i] == value)
            return i;

    return -1;
}
Wunderschön ;-)

unsigned int ist immer größer 0. Du greifst ja nicht negativ auf ein Array zu... jedenfalls nicht hier.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Di Okt 01, 2013 3:13 pm

Was heißt katastrophal eingerückt? Ich kenn das nicht anders als so.

Kann ich das nicht in meine if-Anweisung einfügen? Wenn also x == value dann statt i , falsch zurückgeben?

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Di Okt 01, 2013 3:26 pm

Lone hat geschrieben:Was heißt katastrophal eingerückt? Ich kenn das nicht anders als so.
Der Part ist unvollständig, aber was da steht, kannst Du Dir ruhig schonmal ansehen: Programmierstil
Lone hat geschrieben:Kann ich das nicht in meine if-Anweisung einfügen? Wenn also x == value dann statt i , falsch zurückgeben?

Du kannst den Funktionsaufruf einfügen:

Code: Alles auswählen

if( getIndexOfValue( array, value, max ) != -1 ) 
    printf( "Value wurde noch nicht eingegeben" );
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Lone
Beiträge: 26
Registriert: Do Sep 19, 2013 2:38 pm

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Lone » Di Okt 01, 2013 4:24 pm

Code: Alles auswählen

void printArray(int *x,
				int clms) 
{
   int j;

   printf("\n\n");
      for(j=0; j<clms; j++)
         printf("  %d",x[j]);
      printf("\n");
   }

int getIndexOfValue(int *x, 
					int value, 
					unsigned int maxIndex) 
{
	unsigned int i;

    for (i = 0; i < maxIndex; i++)
        if (x[i] == value)
            return -1;

    return i;
}

int getyournumbers(int *x)
{
    char buffer[20];
    char *ep;
	int i,value;
    
	for(i=0;i<6;i++) {
      
      while (1) {
         printf("\n %d. Zahl: ",i+1);
         scanf( "%s", buffer );             
            errno = 0;
            value = strtol( buffer, &ep, 10);
			if(getIndexOfValue(x,value,7) != -1) {
				if ((errno == 0) && (*ep == '\0' ))  {
					if (value > 0 && value <= 49) {
				   
							x[i] = value;
							break;
					}
					else
						printf( "Input has to be a value between 1 and 49!\n");
				}
				else
					printf( "Input was not a number!\n" );
			}
			else
				printf( "Value allready exists! Please enter a different value." );
	  }
   }
}

int main (void) {
	int yournumbers[7], winningnumbers[7];


	printf("\n\t\t\t Lotto");

	getyournumbers(&yournumbers[0]);
	printf("\nYour Numbers are:");
	printArray(&yournumbers[0],6);

	printf("\n\nPress any key...");
	getch();
	return 0;
}
Ich habe noch eine andere Möglichkeit getstet die aber nicht funktionierte. Also lass ich das jetzt so. Mich würde schon interessieren wie das von euch geschrieben aussehen würde.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von cloidnerux » Di Okt 01, 2013 4:45 pm

Wieso verschachtelst du deinen Code so kompliziert?
Es gibt da ein Konzept der Wächter: http://www.proggen.org/doku.php?id=start:style:guard, das hilft!

Code: Alles auswählen

 if(getIndexOfValue(x,value,7) != -1) {
            if ((errno == 0) && (*ep == '\0' ))  {
               if (value > 0 && value <= 49) {
               
                     x[i] = value;
                     break;
               }
               else
                  printf( "Input has to be a value between 1 and 49!\n");
            }
            else
               printf( "Input was not a number!\n" );
         }
         else
            printf( "Value allready exists! Please enter a different value." );
     }
Ich habe noch eine andere Möglichkeit getstet die aber nicht funktionierte. Also lass ich das jetzt so. Mich würde schon interessieren wie das von euch geschrieben aussehen würde.
Ich würde es so versuchen:

Code: Alles auswählen

void getUserInput(int * numbers)
{
	char buffer[20];
	char * ep;
	for(int i = 0; i < 7; i++)		//The User has to type in 3 numbers
	{
		while(1)
		{
			printf("Bitte geben sie die %ite Zahl ein: \n", i+1);
			scanf("%s", buffer);
			numbers[i] = strtol( buffer, &ep, 10);
			if(errno > 0)		//Not a correct number
			{
				printf("Keine korrekte Zahl! Nochmal!\n");
				continue;
			}
			if(numbers[i] < 0 || numbers[i] > 49)
			{
				printf("Nicht gültige Zahl! Bitte eine Zahl zwischen 0 und 49 eingeben!");
				continue;
			}
			buffer[19] = 0;			//We reuse a variable here to indicate the result of the loop
			for(int j = 0; j < i; j++)
			{
				if(numbers[j] == numbers[i])
				{
					buffer[19] = 1;
					break;		//Abort the loop
				}
			}
			if(buffer[19] > 0)
			{
				printf("Zahl wurde schoneinmal eingegeben!");
				continue;
			}
			break;
		}
	}
}
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: C: Zahlen einlesen, wenn Zeichen oder doppelt zurück

Beitrag von Xin » Di Okt 01, 2013 5:14 pm

Lone hat geschrieben:Ich habe noch eine andere Möglichkeit getstet die aber nicht funktionierte. Also lass ich das jetzt so. Mich würde schon interessieren wie das von euch geschrieben aussehen würde.

Code: Alles auswählen

#include <stdio.h>
#include <stdlib.h>

#define TRUE 1
#define FALSE 0

void printArray( unsigned int * array, unsigned int size)
{
  printf("\n\n");

  for( unsigned int i=0; i<size; i++)
    printf("%s%d" , i?", ":"", array[i]);

  printf("\n");
}

char valueAlreadyEntered( int *array,
                          int value,
                          unsigned int maxIndex)
{
  for( unsigned int i = 0; i < maxIndex; i++)
    if( array[i] == value )
      return TRUE;

  return FALSE;
}

int getNumbers( unsigned int * numbers )
{
  char buffer[20];

  for(unsigned int i=0; i<6 ; i++)
  {
    while (1)
    {
      unsigned int value;
      printf("\n %d. Zahl: ",i+1);
      scanf( "%u", &value );

      if( value <= 0 || value > 49 )
      {
          printf( "Input has to be a value between 1 and 49!\n");
          continue;
      }

      if( valueAlreadyEntered( numbers, value, i ))
      {
          printf( "Value allready exists! Please enter a different value." );
          continue;
      }

      numbers[i] = value;
      break;
    }
  }
}

int main( void )
{
   int yournumbers[6], winningnumbers[6];

   printf("\n\t\t\t Lotto");

   getNumbers(yournumbers);

   printf("\nYour Numbers are:");
   printArray( yournumbers, 6 );

   return EXIT_SUCCESS;
}
Du hast in Deinem Programm den Fehler, dass Du als maxIndex 7 angibst. Tatsächlich hast Du die hinteren Indizes nie belegt, da steht also was zufälliges drin - wenn Du Pech hast auch eine Nummer, die du noch gar nicht eingegeben hast, die aber gültig wäre.

Deine Arrays waren 7 Zahlen groß, dabei gibst du nur 6 ein.
Die Guards habe ich auch verwendet, Deine Version mit der Verschachtelung war aber nicht falsch oder schlechter. scanf würde ich eigentlich nie verwenden, das geht immer in die Hose, aber wenn man das Risiko eingeht, kann man auch %u nehmen.

Ansonsten gibt's noch ein paar kleine Änderungen, die aber nicht so wichtig sind.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten