Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
721 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programme débutant

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programme débutant

n°2180932
snowflakes
Posté le 16-03-2013 à 23:34:48  profilanswer
 

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.

mood
Publicité
Posté le 16-03-2013 à 23:34:48  profilanswer
 

n°2180939
Farian
Posté le 17-03-2013 à 02:30:17  profilanswer
 

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 !

n°2180970
snowflakes
Posté le 17-03-2013 à 12:36:12  profilanswer
 

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!

n°2180986
h3bus
Troll Inside
Posté le 17-03-2013 à 14:37:06  profilanswer
 

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++
n°2180991
snowflakes
Posté le 17-03-2013 à 15:47:45  profilanswer
 

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!

n°2180995
h3bus
Troll Inside
Posté le 17-03-2013 à 16:19:02  profilanswer
 

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++
n°2180997
snowflakes
Posté le 17-03-2013 à 17:04:34  profilanswer
 

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.

n°2181003
h3bus
Troll Inside
Posté le 17-03-2013 à 18:25:20  profilanswer
 

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++
n°2181400
salah_sami​r_75
Posté le 20-03-2013 à 13:23:47  profilanswer
 

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.

n°2181409
Modération
Posté le 20-03-2013 à 14:00:18  answer
 

Citation :

je commence par quoi ?

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programme débutant

 

Sujets relatifs
[Python] Programme débutant[Python] Aide pour un programme de débutant
programme débutant sur les chaînes.[vba excel debutant] creer 1 programme en boucle
[RESOLU]Debutant en C++, petite question a propos d'un programme[MAPLE] Programme de musique generation dune partition (débutant)
Programme pour calculer une moyenne (débutant)Débutant ==> Problème avec un programme
Débutant- Conseils pour développer un programme d'incubationHELP please, pb debutant de raccord entre bdd sql et programme java
Plus de sujets relatifs à : Programme débutant


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR