Programme débutant

Programme débutant - C - Programmation

Marsh Posté le 16-03-2013 à 23:34:48    

Bonsoir,
 
Je suis toute débutante en C, et je dois programmer un petit programme en C en exercice.
Le but consiste à compresser et décompresser un tableau d'entiers ne comportant que des bits, dont la dernières cases remplies vaudra -1.
Le tableau brut de départ aura une taille maximale définie par l'entier MAX, et la taille de la séquence de bits entrés sera définie de manière aléatoire (elle sera comprise entre 2 et MAX, si j'ai bien compris la consigne...).
On parcoure le tableau, en comptant les groupes de bits identiques successifs. S'ils n'apparaissent qu'une fois de suite, il sera conservé tel quel, sinon, il se ra stocké sous la forme "n" suivit de l'élément répété.
 
ex
0 0 1 1 1 0 1 -1
sera compressé en
2 0 3 1 0 1 -1
 
J'ai donc écrit un programme qui compressait les valeurs du tableau "brut" dans le tableau "compress". Je suis censée utiliser la fonction CINI_random, mais je n'arrive pas à la faire fonctionner (visiblement, bien que la bibliothèque cini.h soit incluse en début de programme, la fonction n'est pas déclarée...). On m'a donc recommandé d'utiliser la fonction rand(), que je ne comprends pas très bien...
 
La dernière partie du programme est censée parcourir le tableau compress et afficher les données brutes du tableau brut...
 
Je sais que ma syntaxe est mauvaise, que j'ai trop de variables de boucles et que le tout est beaucoup trop désordonné (par ailleurs, le programme ne marche pas, lorsque je l'exécute, il tourne à l'infini...).J'ai inclus un peu trop de bibliothèques aussi, étant censée n'utiliser que cini.h ... C'est pour quoi je vous demande de l'aide.
 

Code :
  1. #include <cini.h>
  2. #include <cini_graphic.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <stdio.h>
  6. #define MAX 7
  7. #define MIN 2
  8. int rand_a_b(int a, int b){
  9.     return rand()%(b-a) +a;
  10. }
  11. int main(){
  12. int brut[MAX+1];
  13. int compress[MAX+1];
  14. int i;
  15. int j;
  16. int k;
  17. int h;
  18. int compteur;
  19. int taille;
  20. taille=rand_a_b(MIN, MAX+1);
  21. for(i=0; i<taille; i++){
  22.  brut[i]=rand_a_b(0,2);
  23. }
  24. brut[taille]=-1;
  25.  for(k=0; k<=taille; k++){
  26.            
  27.  compteur=0;
  28.        
  29.         while ((brut[k]==brut[k+1])&&(brut[k]!=-1)){
  30. compteur++;
  31. }
  32.  if(compteur!=0){
  33.   compress[k]=compteur;
  34.   compress[k+1]=brut[k];
  35.  }
  36.  else{
  37.   compress[k]=brut[k];
  38.  }
  39.         k++;
  40.        
  41.     }
  42.        
  43. for(h=0; h<taille+1; h++){
  44.  if(compress[h]<2){
  45.   printf("brut[%d]=%d\n", h, compress[h]);
  46.  }
  47.  else{
  48.   if(compress[h+1]==1){
  49.    for(j=0; j<compress[h]; j++){
  50.     printf("brut[%d]=%d\n", h+j, 1);
  51.    }
  52.   }
  53.   else{
  54.    for(j=0; j<compress[h]; j++){
  55.     printf("brut[%d]=%d\n", h+j, 0);
  56.    }
  57.   }
  58.  }
  59. }
  60. return 0;
  61. }


 
En vous remerciant de m'avoir lue.

Reply

Marsh Posté le 16-03-2013 à 23:34:48   

Reply

Marsh Posté le 17-03-2013 à 02:30:17    

Bonsoir !
 
Dans votre boucle while, ligne 37 vous n'incrémentez pas votre variable, ce qui fait que vous restez indéfiniment dans la boucle si la condition est vraie pour la valeur courante de k.
 
Vu l'heure, je n'ai pas le courage d'analyser plus que ça votre code :)
 
Bonne continuation !

Reply

Marsh Posté le 17-03-2013 à 12:36:12    

Bonjour,
 
Merci de votre réponse.
J'ai incrémenté la variable k dans ma boucle while: la boucle tourne à l'infini.
J'ai donc enlevé l'incrémentation dans le while (elle est déjà présente dans le for): le programme compile mais rien n'apparaît après éxecution.
 
Bonne journée!

Reply

Marsh Posté le 17-03-2013 à 14:37:06    

Il faut que tu réfléchisse à ton algorithme, actuellement ça ne peut pas marcher, et Farian a raison sur la boucle infinie ligne 37.
 
Deuxième conseil, utiliser des noms de variables plus explicite pour les index de tableau, surtout quand on a deux index qui tournent en parallèle (enfin là tu ne les as pas mais tu les aura ;) )


---------------
sheep++
Reply

Marsh Posté le 17-03-2013 à 15:47:45    

Bonjour,
 
Je viens de réecrire tout ça, mais ça ne marche toujours pas . Je vais tenter de renommer les variables de manières correcte, merci du conseil (et pourtant, pas sûre de faire un truc plus clair, je risque de devenir encore plus fouillie...).
 

Code :
  1. #include <cini.h>
  2. #include <cini_graphic.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <stdio.h>
  6. #define MAX 7
  7. #define MIN 2
  8. int rand_a_b(int a, int b){
  9.     return rand()%((b-a)) +a;
  10. }
  11. int main(){
  12. int brut[MAX+1];
  13. int compress[MAX+1];
  14. int i;
  15. int j=0;
  16. int k;
  17. int h;
  18. int l;
  19. int compteur;
  20. int taille;
  21. srand( time(NULL));
  22. taille=rand_a_b(MIN,MAX+1);
  23. printf("taille=%d\n", taille);
  24. for(i=0; i<taille; i++){
  25.  brut[i]=rand_a_b(0,2);
  26. printf("brut[%d]=%d\n", i, brut[i]);
  27. }
  28. brut[taille]=-1;
  29. printf("brut[%d]=%d\n", taille, brut[taille]);
  30. for(k=0; k<taille; k++){
  31.  compteur=1;
  32.  while ((brut[k]==brut[k+1])&&(brut[k]!=-1)){
  33.   compteur++;
  34.  }
  35.  if(compteur!=1){j=k;
  36.   compress[j]=compteur;
  37.   compress[j+1]=brut[j];
  38.   j++;
  39.  }
  40.  else{
  41.   compress[j]=brut[j];
  42.   j++;
  43.  }
  44.  printf("compress[%d]=%d\n", j, compress[j]);
  45.        
  46.        
  47.     }
  48.        
  49. for(h=0; h<MAX; h++){
  50.  if(compress[h]==0){
  51.   printf("brut[%d]=%d\n", h, compress[h]);
  52.  }
  53.  else{
  54.   if (compress[h]==1){
  55.    printf("brut[%d]=%d\n",h, compress[h]);
  56.   }
  57.   else{
  58.   if(compress[h+1]==1){
  59.    for(l=0; l<compress[h]; l++){
  60.     printf("brut[%d]=%d\n", l, 1);
  61.    }
  62.   }
  63.   else{
  64.    for(l=0; l<compress[h]; l++){
  65.     printf("brut[%d]=%d\n", l, 0);
  66.    }
  67.   }
  68.  }
  69.  }
  70. }
  71. return 0;
  72. }


 
Merci encore!

Reply

Marsh Posté le 17-03-2013 à 16:19:02    

Tu n'incrémentes toujours pas k après la ligne 41...
 
Ensuite ligne 45: "j=k" pourquoi?
Tu as deux index, n'accède à brut qu'avec k et à compress qu'avec j
Les deux index n'ont aucune raison d'être égaux et ils doivent être gérés indépendamment.
 
Dernier conseil: fait une fonction pour l'affichage de ton tableau. Le le code est illisible (et difficile à maintenir).


---------------
sheep++
Reply

Marsh Posté le 17-03-2013 à 17:04:34    

Bonsoir,
 
Quelque chose dans ce genre l?

Code :
  1. #include <cini.h>
  2. #include <cini_graphic.h>
  3. #include <stdlib.h>
  4. #include <time.h>
  5. #include <stdio.h>
  6. #define MAX 7
  7. #define MIN 2
  8. int rand_a_b(int a, int b){
  9.     return rand()%((b-a)) +a;
  10. }
  11. int main(){
  12. int brut[MAX+1];
  13. int compress[MAX+1];
  14. int i;
  15. int j=0;
  16. int k=0;
  17. /*int h;
  18. int l;*/
  19. int compteur;
  20. int taille;
  21. srand( time(NULL));
  22. taille=rand_a_b(MIN,MAX+1);
  23. printf("taille=%d\n", taille);
  24. for(i=0; i<taille; i++){
  25.  brut[i]=rand_a_b(0,2);
  26. printf("brut[%d]=%d\n", i, brut[i]);
  27. }
  28. brut[taille]=-1;
  29. printf("brut[%d]=%d\n", taille, brut[taille]);
  30. for(k=0; k<taille; k++){
  31.  compteur=1;
  32. while (brut[k]==brut[k+1]){
  33.  compteur++;
  34. }
  35. for(j=0; j<taille; j=j+2){
  36.  if(compteur==1){
  37.   compress[j]=brut[j];
  38.  }
  39.  else{
  40.   compress[j]=compteur;
  41.   compress[j+1]=brut[j];
  42.  }
  43.  printf("compress[%d]=%d\n", j, compress[j]);
  44. }
  45. }
  46.        
  47.        
  48.    
  49.        
  50. /*
  51. for(h=0; h<MAX; h++){
  52.  if(compress[h]==0){
  53.   printf("brut[%d]=%d\n", h, compress[h]);
  54.  }
  55.  else{
  56.   if (compress[h]==1){
  57.    printf("brut[%d]=%d\n",h, compress[h]);
  58.   }
  59.   else{
  60.   if(compress[h+1]==1){
  61.    for(l=0; l<compress[h]; l++){
  62.     printf("brut[%d]=%d\n", l, 1);
  63.    }
  64.   }
  65.   else{
  66.    for(l=0; l<compress[h]; l++){
  67.     printf("brut[%d]=%d\n", l, 0);
  68.    }
  69.   }
  70.  }
  71.  }
  72. }
  73. */
  74. return 0;
  75. }


 
Je suis désolée, je sais que le programme est illisible, en 18 ans de vie je n'ai jamais codé, et on me balance de la programmation en pleine figure: je tente de comprendre, mais la route est longue et dure...
 
Merci.

Reply

Marsh Posté le 17-03-2013 à 18:25:20    

Non...
 
Le code est un point, mais ce qui semble te déranger là c'est l'algorithme.
Réfléchi à ton algo et seulement ensuite à comment le coder.
 
Là j'ai l'impression que tu paniques et que tu écris n'importe quoi...


---------------
sheep++
Reply

Marsh Posté le 20-03-2013 à 13:23:47    

salutations, j'ai une question si possible quand on ecrit ce programme avec le language C, est ce que c'est pareil dans mfile de matlab?
si oui , je cherche à ecrire un programme pour modeliser un machine electrique, je commence par quoi ? merci.

Reply

Marsh Posté le 20-03-2013 à 14:00:18    

Citation :

je commence par quoi ?

Par créer votre propre sujet au lieu de venir polluer celui d'un autre.
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed