www

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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