Fakultät/Permutation

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
01110111
Beiträge: 7
Registriert: Sa Sep 30, 2017 9:45 pm

Fakultät/Permutation

Beitrag von 01110111 » Sa Sep 30, 2017 9:49 pm

Bildschirmfoto 2017-09-30 um 21.55.02.png
Hallo Zusammen,

Habe nun die Permutation mittels for-Schleife generiert. Nun habe ich noch ein anderes Problem. Ich habe drei Spalten von jeweils 0-2 und drei weitere Spalten. Diese können auch entsprechende Werte zwischen 0 und 2 annehmen. Nun möchte ich, dass die drei hinteren Spalten so oft mit diesen Werten aufgerufen werden, bis n! der vorderen Spalten erfüllt ist.
Hoffe ich konnte es einigermaßen erklären.



Das ist jetzt nur als Beispiel. Die Werte x bis z sollen, wenn n! durchgelaufen ist, mit 001 weiterlaufen und erneut n! ausgeführt werden.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Fakultät/Permutation

Beitrag von Xin » Sa Sep 30, 2017 10:42 pm

01110111 hat geschrieben:Hoffe ich konnte es einigermaßen erklären.
Für mich hat es jetzt nicht gereicht...?

Kann es sein, dass da die komplette Einleitung fehlt?
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.

01110111
Beiträge: 7
Registriert: Sa Sep 30, 2017 9:45 pm

Re: Fakultät/Permutation

Beitrag von 01110111 » Sa Sep 30, 2017 10:58 pm

Also folgendes:

ich möchte eine csv Datei erstellen. Diese Datei soll in der Ersten Spalte eine gewisse Anzahl an Zuständen haben. z.B. 4374. Die zweite, dritte und vierte Spalte soll die Werte der Fakultät N = 3 (3! = 6) haben. (d.h. 012, 102, 201, 210, 021, 120). Die restlichen sechs Spalten können jeweils Werte von 0-2 annehmen (N=3).
Das heißt die Erste Spalte besitzt nun z.B. die Zustände 1-6.
1 012 000000
2 102 000000
3 201 000000
4 210 000000
5 021 000000
6 120 000000
7 012 000001
8 102 000001
9 201 000001
10 210 000001
11 021 000001
12 120 000001
usw.

Habe die letzten 9 Spalten mittels for-Schleifen geschrieben und darum eine while-Schleife gesetzt, welche die Zustände angeben soll.

Code: Alles auswählen

#include <stdio.h>

int main() 
{
	
	int q = 1, x = 0, y = 0, z = 0;
	int a = 0, b = 0, c = 0;
	
	
	FILE *permutation=fopen("testn3.csv","w+");
	
	fprintf(permutation, "Zustand; N; a; b; c;\n");
	
		{ 
	
	
	while(q <= 4374){
		
	for(a=0; a<=3; a++)
	{ 
			for(b=0; b<=3; b++)
				{ 
					for(c=0; c<=3; c++)
						{ 
						
			
			for (x = 0; x <= 3; x++)
					{
						
						for (y = 0; y <= 3; y++)
							{
								
							for (z = 0; z <= 3; z++)
								{
							
																
				
					{
						
						
					fprintf(permutation, "%d %25d %d %d %30d %30d %30d\n", 
					q,a,b,c,x,y,z);
					
				    q++;
							
										}
				
						
								 	}
						
								}
							}
				
						 }
				
						}
						}
						}
						}
						}
						

01110111
Beiträge: 7
Registriert: Sa Sep 30, 2017 9:45 pm

Re: Fakultät/Permutation

Beitrag von 01110111 » So Okt 01, 2017 5:10 pm

Code: Alles auswählen

#include <stdio.h>

int main() 
{
	
	int q = 1, x = 0, y = 0, z = 0;
	int a = 0, b = 0, c = 0;
	
	
	FILE *permutation=fopen("testn3.csv","w+");
	
	fprintf(permutation, "Zustand; N; a; b; c;\n");
	
		{ 
	
	
	while(q <= 162){
		
	for(a=0; a<=2; a++)
	{ 
			for(b=0; b<=2; b++)
				{ 
					for(c=0; c<=2; c++)
						{ 
						
			
			for (x = 0; x <= 2; x++)
					{
						
						for (y = 0; y <= 2; y++)
							{
								
							for (z = 0; z <= 2; z++)
								{
							
																
				
					{
						
						
					fprintf(permutation, "%d %25d %d %d %30d %30d %30d\n", 
					q,a,b,c,x,y,z);
					
				    q++;
							
										}
				
						
								 	}
						
								}
							}
				
						 }
				
						}
						}
						}
						}
						}
						

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

Re: Fakultät/Permutation

Beitrag von Xin » So Okt 01, 2017 9:06 pm

Ich muss sagen, dass ich bisher weder das Problem verstanden habe, noch eine Frage gefunden habe. ^^

Deswegen ist das einzige, was ich derzeit sagen: Wenn Du Deinen Code strukturierter einrückst, wird er lesbarer. :)
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.

01110111
Beiträge: 7
Registriert: Sa Sep 30, 2017 9:45 pm

Re: Fakultät/Permutation

Beitrag von 01110111 » So Okt 01, 2017 9:39 pm

Ich versuche es noch einmal :-)

Mein Code ist folgender:

Code: Alles auswählen

#include <stdio.h>
 
int main() 
{
	
	int q = 1, x = 0, y = 0, z = 0;
	int a = 0, b = 0, c = 0;
	
	
	FILE *permutation=fopen("testn3.csv","w+");
	
	fprintf(permutation, "Zustand; N; a; b; c;\n");
	
		{ 
	
	
	while(q <= 162){
		
	for(a=0; a<=2; a++)
	{ 
			for(b=0; b<=2; b++)
				{ 
					for(c=0; c<=2; c++)
						{ 
						
			
			for (x = 0; x <= 2; x++)
					{
						
						for (y = 0; y <= 2; y++)
							{
								
							for (z = 0; z <= 2; z++)
								{
							
																
				
					{
						
						
					fprintf(permutation, "%d %25d %d %d %30d %30d %30d\n", 
					q,a,b,c,x,y,z);
					
				    q++;
							
										}
				
						
								 	}
						
								}
							}
				
						 }
				
					}
				}
			
			}
		}

Ich möchte aber folgende Ausgabe in einer csv Datei haben:

Ausgabe:

Code: Alles auswählen

  1: 012 000
   2: 102 000
   3: 201 000
   4: 210 000
   5: 021 000
   6: 120 000
   7: 012 001
   8: 102 001
   9: 201 001
  10: 210 001
  11: 021 001
  12: 120 001
  13: 012 002
  14: 102 002
  15: 201 002
  16: 210 002
  17: 021 002
  18: 120 002
  19: 012 010
  20: 102 010
  21: 201 010
  22: 210 010
  23: 021 010
  24: 120 010
  25: 012 011
  26: 102 011
  27: 201 011
  28: 210 011
  29: 021 011
  30: 120 011
  31: 012 012
  32: 102 012
  33: 201 012
  34: 210 012
  35: 021 012
  36: 120 012
  37: 012 020
  38: 102 020
  39: 201 020
  40: 210 020
  41: 021 020
  42: 120 020
  43: 012 021
  44: 102 021
  45: 201 021
  46: 210 021
  47: 021 021
  48: 120 021
  49: 012 022
  50: 102 022
  51: 201 022
  52: 210 022
  53: 021 022
  54: 120 022
  55: 012 100
  56: 102 100
  57: 201 100
  58: 210 100
  59: 021 100
  60: 120 100
  61: 012 101
  62: 102 101
  63: 201 101
  64: 210 101
  65: 021 101
  66: 120 101
  67: 012 102
  68: 102 102
  69: 201 102
  70: 210 102
  71: 021 102
  72: 120 102
  73: 012 110
  74: 102 110
  75: 201 110
  76: 210 110
  77: 021 110
  78: 120 110
  79: 012 111
  80: 102 111
  81: 201 111
  82: 210 111
  83: 021 111
  84: 120 111
  85: 012 112
  86: 102 112
  87: 201 112
  88: 210 112
  89: 021 112
  90: 120 112
  91: 012 120
  92: 102 120
  93: 201 120
  94: 210 120
  95: 021 120
  96: 120 120
  97: 012 121
  98: 102 121
  99: 201 121
 100: 210 121
 101: 021 121
 102: 120 121
 103: 012 122
 104: 102 122
 105: 201 122
 106: 210 122
 107: 021 122
 108: 120 122
 109: 012 200
 110: 102 200
 111: 201 200
 112: 210 200
 113: 021 200
 114: 120 200
 115: 012 201
 116: 102 201
 117: 201 201
 118: 210 201
 119: 021 201
 120: 120 201
 121: 012 202
 122: 102 202
 123: 201 202
 124: 210 202
 125: 021 202
 126: 120 202
 127: 012 210
 128: 102 210
 129: 201 210
 130: 210 210
 131: 021 210
 132: 120 210
 133: 012 211
 134: 102 211
 135: 201 211
 136: 210 211
 137: 021 211
 138: 120 211
 139: 012 212
 140: 102 212
 141: 201 212
 142: 210 212
 143: 021 212
 144: 120 212
 145: 012 220
 146: 102 220
 147: 201 220
 148: 210 220
 149: 021 220
 150: 120 220
 151: 012 221
 152: 102 221
 153: 201 221
 154: 210 221
 155: 021 221
 156: 120 221
 157: 012 222
 158: 102 222
 159: 201 222
 160: 210 222
 161: 021 222
 162: 120 222
Mein Code gibt mir leider ne ganz andere Ausgabe. Ich vermute, dass die for-Schleifen nicht passen, aber weiß auch nicht wie ich es umschreiben muss. :?:
In meinem Code möchte ich zudem,dass N variabel ist. (für einen übersichtlichen Test habe ich N=3 genommen)

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

Re: Fakultät/Permutation

Beitrag von cloidnerux » Mo Okt 02, 2017 1:12 pm

Ich möchte aber folgende Ausgabe in einer csv Datei haben:
Rein logisch:
Deine Permutation ist eine feste Menge M, du möchtest eine Ausgabe haben, die jede Permutaion der Elemente aus M mit sich selber darstellt. Besitzt M nun n elemente, ist deine Ausgabe eine Datei mit n*n Zeilen.

Dein Problem lässt sich also in zwei Teile teilen(Teile und Herrsche Verfahren): Die Menge aller Permutationen erstellen und daraus dann die Menge aller Kombinationen erstellen.
Den Ansatz über die Schleifen kann man machen, ist aber sehr ineffektiv und enthält viele wiederholungen, zudem ist der Ansatz O(n^n).
Ein anderer Ansatz ist der "Johnson-Trotter" Algorithmus, der mit vertauschen arbeitet:
https://rosettacode.org/wiki/Permutations_by_swapping
https://www.cut-the-knot.org/Curriculum ... tter.shtml

Das erstellen aller Kombinationen aus einer Menge ist dann relativ einfach.
Redundanz macht wiederholen unnötig.
quod erat expectandum

01110111
Beiträge: 7
Registriert: Sa Sep 30, 2017 9:45 pm

Re: Fakultät/Permutation

Beitrag von 01110111 » Mo Okt 02, 2017 1:42 pm

Hallo,

vielen Dank. Habe mal drüber geschaut.

Habe heute mein Programm nochmal versucht dementsprechend umzuschreiben. Erhalte jetzt aber nicht die passende Ausgabe. Habe hier irgendwo einen Fehler.

Code: Alles auswählen

#include <stdio.h>

void swap(int *x1,int *x2)
{
	int x=*x1;
	*x1=*x2;
	*x2=x;
}
void per(int *arr,int st,int ls)
{
	int i=0;
	if(st==ls)
	{
		int k;
		for(k=0;k<ls;k++)
		{
			//printf("%d ",arr[k]);
		}
	//printf("\n");
	}
	else
	{
		for(i=st;i<ls;i++)
		{
			swap(arr+st,arr+i);
			per(arr,st+1,ls);
			swap(arr+st,arr+i);
		}
	}
}

int main()
{
	//FILE *permutation=fopen("testpermutation.csv","w+");
	//fprintf(permutation, "Zustand; N; a; b; c;\n");
			
	int arr[3]={0,1,2};
	int st=0;
	int ls=3;
    per(arr,st,ls);
	int c0, c1, c2, c3;
	int n = 0;
	
	for (char c0 = '0'; c0 <= '2'; c0++)
			for (char c1 = '0'; c1 <= '2'; c1++)
				for (char c2 = '0'; c2 <= '2'; c2++)
				  //for (char c3 = '0'; c3 <= '3'; c3++)
	for (size_t i = 0; i < sizeof (arr) / sizeof (*arr); i++)	
		printf ("%4d: %d %c%c%c\n", ++n ,arr[i], c0, c1, c2);
	//fprintf(permutation, "%d %d %d %d %d\n");
}
Ausgabe:

Code: Alles auswählen

 1: 0 000
   2: 1 000
   3: 2 000
   4: 0 001
   5: 1 001
   6: 2 001
   7: 0 002
   8: 1 002
   9: 2 002
  10: 0 010
  11: 1 010
  12: 2 010
  13: 0 011
  14: 1 011
  15: 2 011
  16: 0 012
  17: 1 012
  18: 2 012
  19: 0 020
  20: 1 020
  21: 2 020
  22: 0 021
  23: 1 021
  24: 2 021
  25: 0 022
  26: 1 022
  27: 2 022
  28: 0 100
  29: 1 100
  30: 2 100
  31: 0 101
  32: 1 101
  33: 2 101
  34: 0 102
  35: 1 102
  36: 2 102
  37: 0 110
  38: 1 110
  39: 2 110
  40: 0 111
  41: 1 111
  42: 2 111
  43: 0 112
  44: 1 112
  45: 2 112
  46: 0 120
  47: 1 120
  48: 2 120
  49: 0 121
  50: 1 121
  51: 2 121
  52: 0 122
  53: 1 122
  54: 2 122
  55: 0 200
  56: 1 200
  57: 2 200
  58: 0 201
  59: 1 201
  60: 2 201
  61: 0 202
  62: 1 202
  63: 2 202
  64: 0 210
  65: 1 210
  66: 2 210
  67: 0 211
  68: 1 211
  69: 2 211
  70: 0 212
  71: 1 212
  72: 2 212
  73: 0 220
  74: 1 220
  75: 2 220
  76: 0 221
  77: 1 221
  78: 2 221
  79: 0 222
  80: 1 222
  81: 2 222
Habe jetzt zwei Funktionen genommen für die Ausgabe von n und für die letzten drei Ziffern for-Schleifen. Siehst du eventuell auf Anhieb den Fehler?

Edit by cloidnerux: Code-Tags und Formatierung

Antworten