Ein Rätsel (das man rekursiv lösen kann?)

Er spuckt bei mir Folgenden Error aus wenn ich den Code so wie er dort steht in einem neuen Projekt ausführe:

c:\...\Visual Studio Projects\test\main.cpp(18) : error C3861: 'strlen': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

Wieso findet er die Funktion nicht?
Und wie soll ich es dann machen?
 
Er spuckt bei mir Folgenden Error aus wenn ich den Code so wie er dort steht in einem neuen Projekt ausführe:

c:\...\Visual Studio Projects\test\main.cpp(18) : error C3861: 'strlen': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden

Wieso findet er die Funktion nicht?
Weil die Funktion in string.h deklariert ist und du in C++ deshalb cstring include'n müßtest.
Und wie soll ich es dann machen?
Du willst ja keine Strings (bzw. char Arrays) verarbeiten sondern ein int-Array. Deswegen brauchst du strlen nicht, da du ja weißt wie groß dein Array ist.

Da wo println in der permut Funktion steht müßtest du deine Prüfung einbauen.

Gruß
 
C:
/*
 * File:   Main.c
 * Author: Tom
 *
 */
 
#include <stdio.h>
#include <stdlib.h>
 
void swap(int c, int firstIndex, int secondIndex);
void permut(int c, int endIndex);
 
int main(int argc, int argv) {
    int c[10];
    printf("Chars: ");
    scanf("%i",&c);
    fflush(stdin);
    permut(c,9);
    return (EXIT_SUCCESS);
}
 
void swap(int c, int firstIndex, int secondIndex){
    int tmp = c[firstIndex];
    c[firstIndex] = c[secondIndex];
    c[secondIndex] = tmp;
}
 
void permut(int c, int endIndex){
    if(endIndex == 0){
       printf("%i\n",c);
    }else{
       permut(c,endIndex-1);
       int i;
       for(i = 0; i<endIndex;i++){
           swap(c,i,endIndex);
           permut(c,endIndex-1);
           swap(c,i,endIndex);
       }
    }
}

Das kommt mir alles vor wie Müll..
Also entweder ich habe wieder alles falsch gemacht oder ich hab alles falsch gemacht ^^
 
Also ein bißchen mitdenken solltest du schon. Wozu liest du denn da jetzt irgendwas mit scanf ein? Das brauchst du doch alles gar nicht. :confused:

C++:
int main(int argc, char** argv) {
  int num[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  permut(num, 9);
}


void permut(int *c, int endIndex){
    if(endIndex == 0){
      if (pruefe(c)) {
        for (int i = 0; i < 10; ++i) {
          printf("%d = %d\n", i, c[i]);
        }
        puts("");
      }
    }else{
       permut(c,endIndex-1);
       int i;
       for(i = 0; i<endIndex;i++){
           swap(c,i,endIndex);
           permut(c,endIndex-1);
           swap(c,i,endIndex);
       }
    }
}
Gruß
 
Er spuckt mir die gnaze zeit folgende Fehler aus:

Code:
c:\...\Visual Studio Projects\test\main.cpp(15) : error C2664: 'permut': Konvertierung des Parameters 1 von 'int [10]' in 'int' nicht möglich
        Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\...\Visual Studio Projects\test\main.cpp(20) : error C3861: 'pruefe': Bezeichner wurde auch mit einer argumentbezogenen Suche nicht gefunden
c:\...\Visual Studio Projects\test\main.cpp(30) : error C2664: 'swap': Konvertierung des Parameters 1 von 'int *' in 'int' nicht möglich
        Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\...\Visual Studio Projects\test\main.cpp(32) : error C2664: 'swap': Konvertierung des Parameters 1 von 'int *' in 'int' nicht möglich
        Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
c:\...\Visual Studio Projects\test\main.cpp(38) : error C2109: Index erfordert ein Array oder einen Zeigertyp
c:\...\Visual Studio Projects\test\main.cpp(39) : error C2109: Index erfordert ein Array oder einen Zeigertyp
c:\...\Visual Studio Projects\test\main.cpp(39) : error C2109: Index erfordert ein Array oder einen Zeigertyp
c:\...\Visual Studio Projects\test\main.cpp(40) : error C2109: Index erfordert ein Array oder einen Zeigertyp
c:\...\Visual Studio Projects\test\main.cpp(44) : error C2365: 'pruefe': Erneute Definition; vorherige Definition war 'Ehemals unbekannter Bezeichner'

Das ist mein Code
C:
/*
 * File:   Main.c
 * Author: Tom
 *
 */
 
#include <stdio.h>
#include <stdlib.h>
 
void swap(int c, int firstIndex, int secondIndex);
void permut(int c, int endIndex);

int main(int argc, char** argv) {
  int num[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
  permut(num, 9);
}

void permut(int *c, int endIndex){
    if(endIndex == 0){
      if (pruefe(c)) {
        for (int i = 0; i < 10; ++i) {
          printf("%d = %d\n", i, c[i]);
        }
        puts("");
      }
    }else{
       permut(c,endIndex-1);
       int i;
       for(i = 0; i<endIndex;i++){
           swap(c,i,endIndex);
           permut(c,endIndex-1);
           swap(c,i,endIndex);
       }
    }
}

void swap(int c, int firstIndex, int secondIndex){
    int tmp = c[firstIndex];
    c[firstIndex] = c[secondIndex];
    c[secondIndex] = tmp;
}

bool pruefe(int x[10])
{
	// Rechnungen pruefen
	if( (x[0]*1000+x[1]*100+x[2]*10+x[3]) /
		(x[4]*10+x[5]) ==
		(x[4]*100+x[6]*10+x[3])
		&&
		(x[7]*1000+x[8]*100+x[9]*10+x[4]) -
		(x[7]*1000+x[8]*100+x[1]*10+x[6])==
		(x[5]*10+x[4])
		&&
		(x[9]*1000+x[8]*100+x[3]*10+x[1]) -
		(x[7]*1000+x[8]*100+x[3]*10+x[5]) ==
		(x[2]*1000+x[6]*100+x[6]*10+x[2])
		&&
		(x[0]*1000+x[1]*100+x[2]*10+x[3]) -
		(x[7]*1000+x[8]*100+x[9]*10+x[4]) ==
		(x[9]*1000+x[8]*100+x[3]*10+x[1])
		&&
		(x[4]*10+x[5]) +
		(x[7]*1000+x[8]*100+x[1]*10+x[6]) ==
		(x[7]*1000+x[8]*100+x[3]*10+x[5])
		&&
		(x[4]*100+x[6]*10+x[3]) *
		(x[5]*10+x[4]) == 
		(x[2]*1000+x[6]*100+x[6]*10+x[2])
	)
	{
		return true;
	}
	else
		return false;
}
 
Fehler 1: Die Signatur und Die Funktion permut selber passen nicht zusammen
Fehler 2, 9: pruefe hat keine Signatur
Fehler 3-8: swap-Param 1 sollte eigentlich ein Pointer sein
 
Ich habe hier mal ein auf die Schnelle zusammengehacktes Programm, das die fehleranfällige Permutations-Implementierung vermeidet. Es arbeitet rekursiv und verwendet deine pruefe-Funktion; an ihr wurde lediglich die Deklaration verändert, alles andere wurde unbesehen übernommen. Ich habe es zwar nicht getestet, aber es müsste so funktionieren wie gewünscht. Ich hoffe, die Anzahl der Syntaxfehler hält sich in erträglichen Grenzen und wünsche dir viel Erfolg.

C:
#define ZIFFERN 10

int pool[ZIFFERN];
int loesung[ZIFFERN];

void main()
{
  init();
  if ( solve(0) )
  { output(); }
  else
  { printf("Keine Lösung gefunden\n"); }
}

void output()
{
  for ( int i = 0; i < ZIFFERN; i++ )
  { printf("%d",solution[i]); }
  printf("\n");
}

void init()
{
  for ( int i = 0; i < ZIFFERN; i++ ) 
  { pool[i] = i; }
}

bool solve ( int tiefe )
{
  // das limit gibt an, wie viele Ziffern zum Ausprobieren verfuegbar sind
  int limit = ZIFFERN - tiefe;

  // Wenn alle Ziffern feststehen, dann pruefen und Ergebnis zurueckliefern
  if ( tiefe == ZIFFERN )
  { return pruefe(loesung); }

  // alle verfuegbaren Ziffern ausprobieren
  for ( int i = 0; i < limit; i++ )
  {
    // die aktuelle Versuchs-Ziffer aus dem pool entnehmen
    loesung[tiefe] = pool[i];
    // letzte verfügbare Ziffer an die Stelle der alten kopieren
    // damit sie beim naechsten Verringern des limits nicht verloren geht
    pool[i] = pool[limit-1];
    // Rekursion: bei Erfolg zurückkehren
    if ( solve(tiefe+1) )
    { loesung[tiefe] = n; return true; }
    // keine loesung gefunden, also alten Zustand wieder herstellen
    pool[limit-1] = pool[i];
    pool[i] = loesung[tiefe];
  }
  return false;
}

bool pruefe(int *x)
{
    // Rechnungen pruefen
    if( (x[0]*1000+x[1]*100+x[2]*10+x[3]) /
        (x[4]*10+x[5]) ==
        (x[4]*100+x[6]*10+x[3])
        &&
        (x[7]*1000+x[8]*100+x[9]*10+x[4]) -
        (x[7]*1000+x[8]*100+x[1]*10+x[6])==
        (x[5]*10+x[4])
        &&
        (x[9]*1000+x[8]*100+x[3]*10+x[1]) -
        (x[7]*1000+x[8]*100+x[3]*10+x[5]) ==
        (x[2]*1000+x[6]*100+x[6]*10+x[2])
        &&
        (x[0]*1000+x[1]*100+x[2]*10+x[3]) -
        (x[7]*1000+x[8]*100+x[9]*10+x[4]) ==
        (x[9]*1000+x[8]*100+x[3]*10+x[1])
        &&
        (x[4]*10+x[5]) +
        (x[7]*1000+x[8]*100+x[1]*10+x[6]) ==
        (x[7]*1000+x[8]*100+x[3]*10+x[5])
        &&
        (x[4]*100+x[6]*10+x[3]) *
        (x[5]*10+x[4]) ==
        (x[2]*1000+x[6]*100+x[6]*10+x[2])
    )
    {
        return true;
    }
    else
        return false;
}
 
Zurück