Forum: PC-Programmierung csv Datei erstellen / Permutation (Sprache C )


von Esra-Maria A. (esramaria_a)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen,

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.

Leider erhalte ich nicht die gewünschte Ausgabe. Siehe Dateianhang.

Könnte mir hier jemand vielleicht weiterhelfen?
Wäre euch sehr dankbar!

[CODE]#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++;

}


}

}
}

}

}
}
}
}
}
/CODE]

von Kaj G. (Firma: RUB) (bloody)


Lesenswert?

1
#include <stdio.h>
2
3
int main()
4
{
5
    
6
    int q = 1, x = 0, y = 0, z = 0;
7
    int a = 0, b = 0, c = 0;
8
    
9
    FILE *permutation=fopen("testn3.csv","w+");
10
    
11
    fprintf(permutation, "Zustand; N; a; b; c;\n");
12
    
13
    {
14
        while(q <= 4374){
15
            for(a=0; a<=3; a++)
16
            {
17
                for(b=0; b<=3; b++)
18
                {
19
                    for(c=0; c<=3; c++)
20
                    {
21
                        for (x = 0; x <= 3; x++)
22
                        {
23
                            for (y = 0; y <= 3; y++)
24
                            {
25
                                for (z = 0; z <= 3; z++)
26
                                {
27
                                    {
28
                                        fprintf(permutation, "%d %25d %d %d %30d %30d %30d\n",
29
                                                q,a,b,c,x,y,z);
30
                                        
31
                                        q++;
32
                                    }
33
                                }
34
                            }
35
                        }
36
                    }
37
                }
38
            }
39
        }
40
    }
41
}

von Esra-Maria A. (esramaria_a)


Lesenswert?

1
C#include <stdio.h>
2
3
int main() 
4
{
5
  
6
  int q = 1, x = 0, y = 0, z = 0;
7
  int a = 0, b = 0, c = 0;
8
  
9
  
10
  FILE *permutation=fopen("testn3.csv","w+");
11
  
12
  fprintf(permutation, "Zustand; N; a; b; c;\n");
13
  
14
    { 
15
  
16
  
17
  while(q <= 162){
18
    
19
  for(a=0; a<=2; a++)
20
  { 
21
      for(b=0; b<=2; b++)
22
        { 
23
          for(c=0; c<=2; c++)
24
            { 
25
            
26
      
27
      for (x = 0; x <= 2; x++)
28
          {
29
            
30
            for (y = 0; y <= 2; y++)
31
              {
32
                
33
              for (z = 0; z <= 2; z++)
34
                {
35
              
36
                                
37
        
38
          {
39
            
40
            
41
          fprintf(permutation, "%d %25d %d %d %30d %30d %30d\n", 
42
          q,a,b,c,x,y,z);
43
          
44
            q++;
45
              
46
                    }
47
        
48
            
49
                   }
50
            
51
                }
52
              }
53
        
54
             }
55
        
56
            }
57
            }
58
            }
59
            }
60
            }
61
            Code

von nicht"Gast" (Gast)


Lesenswert?

Esra-Maria A. schrieb:
> 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

Hallo,

sorry wenn ich das so schreibe. Mir tut sich da ein großes Fragezeichen 
auf. Du willst 6 Spalten, zeigst aber nur 3. Du willst was mit der 3! 
aber das soll 012,102,201 u.s.w sein.

Les das mal selber mit den Augen eines Fremden und dann beschreibe dein 
Problem noch mal. So ist das erst mal rumrate, was du willst.

Grüße

von Esra-Maria A. (esramaria_a)


Angehängte Dateien:

Lesenswert?

Ja sorry du hast vollkommen Recht. N=3 und drei weitere Variablen. Habe 
den Code nochmal optimiert und es soll folgendes ausgegeben werden. 
(Siehe Dateianhang)


1
C#include <stdio.h>
2
3
int main() 
4
{
5
  
6
  int q = 1, x = 0, y = 0, z = 0;
7
  int a = 0, b = 0, c = 0;
8
  
9
  
10
  FILE *permutation=fopen("testn3.csv","w+");
11
  
12
  fprintf(permutation, "Zustand; N; a; b; c;\n");
13
  
14
    { 
15
  
16
  
17
  while(q <= 162){
18
    
19
  for(a=0; a<=0; a++)
20
  { 
21
      for(b=0; b<=1; b++)
22
        { 
23
          for(c=0; c<=2; c++)
24
            { 
25
            
26
      
27
      for (x = 0; x <= 2; x++)
28
          {
29
            
30
            for (y = 0; y <= 2; y++)
31
              {
32
                
33
              for (z = 0; z <= 2; z++)
34
                {
35
              
36
                                
37
        
38
          {
39
            
40
            
41
          fprintf(permutation, "%d %25d %d %d %30d %30d %30d\n", 
42
          q,a,b,c,x,y,z);
43
          
44
            q++;
45
              
46
                    }
47
        
48
            
49
                   }
50
            
51
                }
52
              }
53
        
54
             }
55
        
56
            }
57
            }
58
            }
59
            }
60
            }
61
            
62
      
63
    
64
  
65
Code

von Christopher B. (chrimbo) Benutzerseite


Lesenswert?

Ich verstehe es trotzdem nicht, bei mir ist N! für N=3 immer 6

von Esra-Maria A. (esramaria_a)


Lesenswert?

ja genau. Und Insgesamt mit N!*N^3 ergibt das Zustände von 1 - 162.

(N! = 3! => 6 * N^3 = 3^3 => 27 -> 6 * 27 = 162 Zustände)
Die Tabelle soll entsprechend aufgebaut werden. Und das klappt mit 
meinem Code nicht.

von Nop (Gast)


Lesenswert?

Wird immer konfuser.. Fakultät und Permutation gehen munter 
durcheinander, jetzt ist da auch noch irgendwoher ein N^3 gekommen, und 
es sind immer noch nur drei Spalten, die erste Zeile der Tabelle gibt 5 
Spalten vor, mit Semikolon getrennt, im Schleifenbody werden dann 7 
Variablen ausgegeben, ohne Semikolon.

Ich würd mal sagen, wenn die Aufgabenstellung schon dermaßen unklar ist, 
dann wird der Code halt nicht funktionieren.

Kopier halt einfach die ersten 6 Zeilen immer hintereinander weg und 
zähl dabei die erste Spalte immer um 1 hoch. Die letzte Spalte wird 
offenbar alle 6 Zeilen um 1 erhöht. Irgendwie sowas soll der Code wohl 
machen, genau weiß man's nicht.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

1
#include <stdlib.h>
2
#include <stdio.h>
3
4
int main (void)
5
{
6
    static const char * const p[] = { "012", "102", "201", "210", "021", "120" };
7
    int n = 0;
8
9
    for (char c0 = '0'; c0 <= '2'; c0++)
10
        for (char c1 = '0'; c1 <= '2'; c1++)
11
            for (char c2 = '0'; c2 <= '2'; c2++)
12
                for (size_t i = 0; i < sizeof (p) / sizeof (*p); i++)
13
                    printf ("%4d: %s %c%c%c\n", ++n , p[i], c0, c1, c2);
14
15
    return EXIT_SUCCESS;
16
}

Ausgabe:
1
   1: 012 000
2
   2: 102 000
3
   3: 201 000
4
   4: 210 000
5
   5: 021 000
6
   6: 120 000
7
   7: 012 001
8
   8: 102 001
9
   9: 201 001
10
  10: 210 001
11
  11: 021 001
12
  12: 120 001
13
  13: 012 002
14
  14: 102 002
15
  15: 201 002
16
  16: 210 002
17
  17: 021 002
18
  18: 120 002
19
  19: 012 010
20
  20: 102 010
21
  21: 201 010
22
  22: 210 010
23
  23: 021 010
24
  24: 120 010
25
  25: 012 011
26
  26: 102 011
27
  27: 201 011
28
  28: 210 011
29
  29: 021 011
30
  30: 120 011
31
  31: 012 012
32
  32: 102 012
33
  33: 201 012
34
  34: 210 012
35
  35: 021 012
36
  36: 120 012
37
  37: 012 020
38
  38: 102 020
39
  39: 201 020
40
  40: 210 020
41
  41: 021 020
42
  42: 120 020
43
  43: 012 021
44
  44: 102 021
45
  45: 201 021
46
  46: 210 021
47
  47: 021 021
48
  48: 120 021
49
  49: 012 022
50
  50: 102 022
51
  51: 201 022
52
  52: 210 022
53
  53: 021 022
54
  54: 120 022
55
  55: 012 100
56
  56: 102 100
57
  57: 201 100
58
  58: 210 100
59
  59: 021 100
60
  60: 120 100
61
  61: 012 101
62
  62: 102 101
63
  63: 201 101
64
  64: 210 101
65
  65: 021 101
66
  66: 120 101
67
  67: 012 102
68
  68: 102 102
69
  69: 201 102
70
  70: 210 102
71
  71: 021 102
72
  72: 120 102
73
  73: 012 110
74
  74: 102 110
75
  75: 201 110
76
  76: 210 110
77
  77: 021 110
78
  78: 120 110
79
  79: 012 111
80
  80: 102 111
81
  81: 201 111
82
  82: 210 111
83
  83: 021 111
84
  84: 120 111
85
  85: 012 112
86
  86: 102 112
87
  87: 201 112
88
  88: 210 112
89
  89: 021 112
90
  90: 120 112
91
  91: 012 120
92
  92: 102 120
93
  93: 201 120
94
  94: 210 120
95
  95: 021 120
96
  96: 120 120
97
  97: 012 121
98
  98: 102 121
99
  99: 201 121
100
 100: 210 121
101
 101: 021 121
102
 102: 120 121
103
 103: 012 122
104
 104: 102 122
105
 105: 201 122
106
 106: 210 122
107
 107: 021 122
108
 108: 120 122
109
 109: 012 200
110
 110: 102 200
111
 111: 201 200
112
 112: 210 200
113
 113: 021 200
114
 114: 120 200
115
 115: 012 201
116
 116: 102 201
117
 117: 201 201
118
 118: 210 201
119
 119: 021 201
120
 120: 120 201
121
 121: 012 202
122
 122: 102 202
123
 123: 201 202
124
 124: 210 202
125
 125: 021 202
126
 126: 120 202
127
 127: 012 210
128
 128: 102 210
129
 129: 201 210
130
 130: 210 210
131
 131: 021 210
132
 132: 120 210
133
 133: 012 211
134
 134: 102 211
135
 135: 201 211
136
 136: 210 211
137
 137: 021 211
138
 138: 120 211
139
 139: 012 212
140
 140: 102 212
141
 141: 201 212
142
 142: 210 212
143
 143: 021 212
144
 144: 120 212
145
 145: 012 220
146
 146: 102 220
147
 147: 201 220
148
 148: 210 220
149
 149: 021 220
150
 150: 120 220
151
 151: 012 221
152
 152: 102 221
153
 153: 201 221
154
 154: 210 221
155
 155: 021 221
156
 156: 120 221
157
 157: 012 222
158
 158: 102 222
159
 159: 201 222
160
 160: 210 222
161
 161: 021 222
162
 162: 120 222

Mit den Permutationen hab ich geschummelt, da einfach hingeschrieben. 
Falls N variablel sein soll, ist das Mittel der Wahl faktorielle 
Darstellung (dito für Iteration über alle Teilmengen wie "6 aus 49"):

https://de.wikipedia.org/wiki/Fakultätsbasiertes_Zahlensystem

Falls die Kombinationen variabel sein sollen, denn geht das besser mit 
Darstellung einer N-stelligen Zahl zu Basis B (hier mit B = N) anstatt 
einer N-fachen Schleife.  Und schleifen wird man über die Stellen (z.B. 
als int) und nicht direkt über das auszugebende Zeichen (hier als char).

Schließlich ist die Zählung der Permutationen recht ungewöhnlich; eine 
kanonische Zählung wäre

012
021
102
120
201
210

d.h. monoton wachsend wie man sie z.B. mit Faktoriellen erhält.

: Bearbeitet durch User
von Esra-Maria A. (esramaria_a)


Lesenswert?

Vielen Dank für deine Antwort.

Ich habe jetzt N=3 genommen um es erst einmal übersichtlich zu testen. 
Normalerweise muss ich folgende Werte nehmen:

N=4, N=6 und N=8. Und das ist dann dementsprechend hoch. Da würde ich n 
lieber variabel lassen. Habe deinen Code getestet und funktioniert 
wunderbar. Aber würde die Werte gerne in einer csv Datei ausgeben 
lassen.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Die Ausgabe kann direkt im C-File gemacht werden, oder indem man die 
Ausgabe von stdout in die gewünschte Datei piped wie in

$ ./programm > datei.txt

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.