couples-old.c (5017B)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 5 int pair(int x){ 6 return (!(x % 2)); 7 } 8 9 /* 10 int code_couples_very_slow(int _x, int _y){ 11 int x, y; 12 x = y = 0; 13 int code = 0; 14 char direction = 'r'; // 'l' pour "left-down", 'r' pour "right-up" 15 printf("In the 'couples' function\n"); 16 sleep(1); 17 while(((x != _x) || (y != _y))){ 18 if((y == 0) && (pair(x))){ 19 printf("IF1:\n"); 20 sleep(1); 21 x++; 22 code++; 23 direction = 'l'; 24 printf("IF N° 1, x = %d, y = %d, code = %d\n", x, y, code); 25 sleep(1); 26 } 27 else if((x == 0) && (!pair(y))){ 28 printf("IF2:\n"); 29 sleep(1); 30 y++; 31 code++; 32 direction = 'r'; 33 printf("IF N° 2, x = %d, y = %d, code = %d\n", x, y, code); 34 sleep(1); 35 } 36 else if((y == 0) && (direction == 'l')){ 37 printf("IF3:\n"); 38 sleep(1); 39 while((x != 0) && ((x != _x) || (y != _y))){ 40 printf("WHILE3:\n"); 41 sleep(1); 42 x--; 43 y++; 44 code++; 45 printf("IF N° 3, x = %d, y = %d, code = %d\n", x, y, code); 46 sleep(1); 47 } 48 } 49 else if((x == 0) && (direction == 'r')){ 50 printf("IF4:\n"); 51 sleep(1); 52 while((y != 0) && ((x != _x) || (y != _y))){ 53 printf("WHILE4:\n"); 54 sleep(1); 55 x++; 56 y--; 57 code++; 58 printf("IF N° 4, x = %d, y = %d, code = %d\n", x, y, code); 59 sleep(1); 60 } 61 } 62 } 63 return code; 64 } 65 66 int code_couples_slow(int _x, int _y){ 67 int x, y; 68 x = y = 0; 69 int code = 0; 70 char direction = 'r'; // 'l' pour "left-down", 'r' pour "right-up" 71 while(((x != _x) || (y != _y))){ 72 if((y == 0) && (pair(x))){ 73 x++; 74 code++; 75 direction = 'l'; 76 } 77 else if((x == 0) && (!pair(y))){ 78 y++; 79 code++; 80 direction = 'r'; 81 } 82 else if((y == 0) && (direction == 'l')){ 83 while((x != 0) && ((x != _x) || (y != _y))){ 84 x--; 85 y++; 86 code++; 87 } 88 } 89 else if((x == 0) && (direction == 'r')){ 90 while((y != 0) && ((x != _x) || (y != _y))){ 91 x++; 92 y--; 93 code++; 94 } 95 } 96 } 97 return code; 98 } 99 */ 100 101 int orderedPairToCode(int x, int y){ 102 int sumxy, code; 103 sumxy = x + y; 104 code = ((sumxy)*(sumxy + 1))/2; 105 106 if(pair(sumxy)){ 107 code = code + x; 108 } 109 else{ 110 code = code + y; 111 } 112 return code; 113 } 114 115 116 int* codeToOrderedPair(int code){ 117 int *couple = malloc(2*sizeof(int)); 118 int n = sqrt(code * 2); 119 int axis = (n * (n + 1))/2; 120 int diff = 0; 121 if(axis > code){ 122 while(axis > code){ 123 n = n - 1; 124 axis = (n * (n + 1))/2; 125 } 126 } 127 else if(axis < code){ 128 while(axis < code){ 129 n = n + 1; 130 axis = (n * (n + 1))/2; 131 } 132 if(axis > code){ 133 n = n - 1; 134 axis = (n * (n + 1))/2; 135 } 136 } 137 138 if(axis == code){ // je pense que je peux me dispenser de cet "if", ça revient au même car diff serait = 0 139 if(pair(n)){ 140 couple[0] = 0; 141 couple[1] = n; 142 } 143 else{ 144 couple[0] = n; 145 couple[1] = 0; 146 } 147 } 148 if(axis != code){ // idem 149 diff = code - axis; 150 if(pair(n)){ 151 couple[0] = diff; 152 couple[1] = n - diff; 153 } 154 else{ 155 couple[0] = n - diff; 156 couple[1] = diff; 157 } 158 } 159 return couple; 160 } 161 162 int* codeToOrderedPair2(int code){ 163 int *couple = malloc(2*sizeof(int)); 164 int n = sqrt(code * 2); 165 int axis = (n * (n + 1))/2; 166 int diff = 0; 167 if(axis > code){ 168 n = n - 1; 169 axis = (n * (n + 1))/2; 170 } 171 diff = code - axis; 172 if(pair(n)){ 173 couple[0] = diff; 174 couple[1] = n - diff; 175 } 176 else{ 177 couple[0] = n - diff; 178 couple[1] = diff; 179 } 180 return couple; 181 } 182 183 184 int orderedMultipleToCode(int *arr, int size){ 185 int code; 186 if(size > 1){ 187 code = orderedPairToCode(arr[size - 2], arr[size - 1]); 188 arr[size - 2] = code; 189 arr = realloc(arr, (size - 1)); 190 if(size > 2){ 191 code = orderedMultipleToCode(&arr[0], (size - 1)); 192 } 193 } 194 return code; 195 } 196 197 int* codeToOrderedMultiple(int code, int size){ 198 int *multiple = malloc(size*sizeof(int)); 199 int *pair; 200 int i = 0; 201 for(i = 0; i < (size - 1); i++){ 202 pair = codeToOrderedPair(code); 203 code = pair[1]; 204 multiple[i] = pair[0]; 205 multiple[i + 1] = pair[1]; 206 } 207 return multiple; 208 } 209 210 211 int main(int argc, char **argv, char **envp){ 212 213 int x = 0; 214 int y = 0; 215 int code = 0; 216 int *p; 217 int size = 0; 218 219 do{ 220 /* 221 printf ("\nx = "); 222 scanf("%d",&x); 223 printf ("y = "); 224 scanf("%d",&y); 225 code = orderedPairToCode(x, y); 226 printf("Le code du couple (%d, %d) est %d\n", x, y, code); 227 228 printf ("\ncode = "); 229 scanf("%d",&code); 230 p = codeToOrderedPair(code); 231 printf("The ordered pair identified by code %d is (%d, %d)", code, p[0], p[1]); 232 233 */ 234 printf("\nEnter a size of a multidimensional array representing a 'ordered multiple': "); 235 scanf("%d",&size); 236 p = malloc(size * sizeof(int)); 237 int i; 238 for(i = 0; i < size; i++){ 239 printf("Enter value number %d: ", i); 240 scanf("%d", &p[i]); 241 } 242 243 code = orderedMultipleToCode(p, size); 244 printf("\n... The code is %d", code); 245 246 247 248 printf ("\ncode = "); 249 scanf("%d",&code); 250 printf ("\nnumber of ordered elements = "); 251 scanf("%d",&size); 252 p = codeToOrderedMultiple(code, size); 253 printf("The ordered multiple identified by code %d contains the following elements: ", code); 254 printf("("); 255 for(i = 0; i < (size - 1); i++){ 256 printf("%d, ", p[i]); 257 } 258 printf("%d)", p[size-1]); 259 260 261 } 262 while(code != -1); 263 } 264