Débutant et étourdi ; ca ne fait pas bon ménage mais avec un peu d'aide et de persévérance...

Le
bpascal123
Bonjour,

Voici le script qui me fait tourner la tête car ca fonctionne pour un
nombre qui fait partie de la première partie du tableau mais pas de la
seconde ???



#include <stdio.h>

main()
{
int Tab[100] ;
int N ;

int VAL ;
int POS ;
int midPOS ;
int op ;
int i, j ;
int cnt = 1 ;
int permut1 ;

printf("=
") ;

printf("Ce prg lit, affiche un tableau et y recherche une
valeur et
sa position.") ;

printf("") ;

printf("Entrez le nbr de valeurs : ") ;
scanf("%d", &N);

for ( i = 0 ; i < N ; i++ )
{
Tab[i] = op * 10 / 8 + 3 * 2 ;
op = Tab[i] ;
printf("%4d", Tab[i]) ;
}

printf("") ;

for ( i = 0 ; i < N ; i++ )
{
if ( Tab[i] > Tab[i+1] )
{
permut1 = Tab[i] ;
Tab[i] = Tab[i+1] ;
Tab[i+1] = permut1 ;
}
}

printf("Tableau trie : ") ;

for ( i = 0 ; i < N ; i++ )
printf("%4d", Tab[i]) ;

printf("") ;

printf("Entrez une valeur a rechercher : ") ;
scanf("%d", &VAL ) ;

printf("") ;

midPOS = N/2 ;

if ( VAL < Tab[midPOS] )
{
for ( i = 0, POS=0 ; i < midPOS ; i+
+ )
if ( Tab[i] = VAL )
POS = i ;
printf("(tri 1ere moitie) t La valeur se trouve en
position %d", POS
+1);
}

else if ( VAL >= Tab[midPOS] )
{
for ( i = midPOS ; i < N ; i+
+ )
{
if ( Tab[i] = VAL )
{
POS = i;
}
}
printf("(tri 2nde moitie) t La valeur se trouve en
position %d", POS
+1) ;
}

else
printf("No match!") ;

printf("=
") ;

return 0 ;
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mickaël Wolff
Le #19643701
a écrit :

Voici le script


Je suis le seul à être choqué ? Ou je suis trop tatillon ?

qui me fait tourner la tête car ca fonctionne pour un
nombre qui fait partie de la première partie du tableau mais pas de la
seconde ???



Désolé mais ce n'est pas clair. On ne sait pas ce que devrait faire
le programme. De ton source, on ne peut qu'en déduire son fonctionnement
(et éventuellement deviner ce que tu cherches à faire). Donc :

1 - qu'est censé faire ton programme ?
2 - quel est le comportement observé ?

Et pourquoi as-tu posté plusieurs fois ?
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
bpascal123
Le #19643951
C'est le protocole de Sarkozy ?
Mickaël Wolff
Le #19644161
a écrit :
C'est le protocole de Sarkozy ?



Ce n'est pas sympathique de m'insulter ainsi, alors que j'essaye de
te donner des clés pour qu'on puisse t'aider.

Les éléments que je t'ai demandé sont indispensable à ta démarche. Si
tu crois pouvoir t'en passer, alors paye quelqu'un qui accepte de faire
le larbin pour toi. Je ne suis pas de cette espèce.

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

Seeking for a position
Alexandre Bacquart
Le #19644351
wrote:
C'est le protocole de Sarkozy ?



C'est drôle que tu dises ça... ton triple post ressemble presque à un
sketch récent sur le travail dominical !

D'abord, en C, on ne parle pas de script mais... de programme. Mais
enfin, passons sur la terminologie.

Tu arrives comme si on était déjà dans le bain de ton problème. Tu
n'expose absolument rien, même pas le but de la manoeuvre, et tu
réclames de l'aide sans aider le lecteur. Ne viens pas te plaindre de ne
pas avoir de réponse pertinente.

Et d'abord, juste en copiant-collant ton code, voilà ce que ça donne :

----------------------------------------------------------------
make
gcc -W -Wall -pedantic -stdÉ9 main.c -o main
main.c:4: warning: return type defaults to ‘int’
main.c:18:16: warning: missing terminating " character
main.c: In function ‘main’:
main.c:18: error: missing terminating " character
main.c:19: error: ‘valeur’ undeclared (first use in this function)
main.c:19: error: (Each undeclared identifier is reported only once
main.c:19: error: for each function it appears in.)
main.c:19: error: expected ‘)’ before ‘et’
main.c:20:13: warning: missing terminating " character
main.c:20: error: missing terminating " character
main.c:66:24: warning: missing terminating " character
main.c:66: error: missing terminating " character
main.c:67:12: warning: missing terminating " character
main.c:67: error: missing terminating " character
main.c:81:24: warning: missing terminating " character
main.c:81: error: missing terminating " character
main.c:82:12: warning: missing terminating " character
main.c:82: error: missing terminating " character
main.c:91: error: expected declaration or statement at end of input
main.c:14: warning: unused variable ‘permut1’
main.c:13: warning: unused variable ‘cnt’
main.c:12: warning: unused variable ‘j’
main.c:12: warning: unused variable ‘i’
main.c:11: warning: unused variable ‘op’
main.c:10: warning: unused variable ‘midPOS’
main.c:9: warning: unused variable ‘POS’
main.c:8: warning: unused variable ‘VAL’
main.c:6: warning: unused variable ‘N’
main.c:5: warning: unused variable ‘Tab’
make: *** [all] Error 1

Compilation exited abnormally with code 2 at Fri Jun 26 18:18:57
----------------------------------------------------------------

Alors, Monsieur Sarkozy, revoyez la copie svp. J'ose croire que vous
êtes assez intelligent pour comprendre les raisons de ce fiasco.


--
Alex
candide
Le #19645881
a écrit :

Voici le script qui me fait tourner la tête car ca fonctionne pour un
nombre qui fait partie de la première partie du tableau mais pas de la
seconde ???




Un compilateur bien réglé dont on lit et corrige les avertissements permet de
coder en étant très étourdi. Essaye et tu verras que le compilateur te montrera
une "erreur" qui n'est peut-être pas étrangère aux résultats inattendus que tu
obtiens. Si tu ne sais pas ce que c'est que "les avertissements du compilateur",
regarde par exemple ICI :

http://www.siteduzero.com/forum-83-204912-les-options-de-compilation.html


Les "avertissements du compilateurs" ne sont pas une panacée et quand on a le
cerveau momentanément ou durablement en panne (je parle d'expérience ;) ), il
existe un autre outil qui permet de réparer du code correct au sens du
compilateur et qui ne donne pas les résultats attendus : un débogueur.

Par ailleurs, on t'a posé une question tout-à-fait pertinente ("qu'est censé
faire ton programme ?" et j'ajouterais : qu'est-ce que TOI tu veux faire en
ayant programmé ce que tu nous a montré ?) et j'ai trouvé ta réponse fort
cavalière ce qui ne me donne pas l'envie de t'aider davantage.
zwim
Le #19646281
Le Fri, 26 Jun 2009 03:23:17 -0700 (PDT)
a écrit
Bonjour,



bonjour,

Voici le script qui me fait tourner la tête car ca fonctionne pour un
nombre qui fait partie de la première partie du tableau mais pas de la
seconde ???



Sont pas tendres avec les newbies, au moins tu as dit bonjour, et
c'est pas écrit en language sms, un bon début.

== >
#include
main()



int main(void)

{
int Tab[100] ;
int N ;

int VAL ;
int POS ;
int midPOS ;
int op ;
int i, j ;
int cnt = 1 ;
int permut1 ;

printf("nn==============================nn") ;

printf("Ce prg lit, affiche un tableau et y recherche une
valeur et
sa position.") ;

printf("nn===============nn") ;



mets plutôt le n au bout de la phrase précédente (cette remarque vaut
pour la suite)

printf("Entrez le nbr de valeurs : ") ;
scanf("%d", &N);



il faudrait vérifier que N < 100

for ( i = 0 ; i < N ; i++ )
{
Tab[i] = op * 10 / 8 + 3 * 2 ;



op non initialisé lors de sa première utilisation --> U.B.

et tu fais l'opération ((op*10)/8) + 6 est-ce bien ce que tu veux ?
sinon, mets des ( )

utilise plutôt la valeur de i, plutôt que op pour remplir ton tableau
T[i] = fonction(i)

e.g. T[i] = (i * 8743657847) % 341

op = Tab[i] ;
printf("%4d", Tab[i]) ;



"%4d " avec au moins un espace après, c'est mieux. rien de faux, mais
compter sur le fait que le %4d va mettre un espace à ta place, c'est
pas terrible.

}

printf("nn===============nn") ;

for ( i = 0 ; i < N ; i++ )
{
if ( Tab[i] > Tab[i+1] )



T[i+1] sort du tableau pour i=N-1, car T[N] n'a pas été rempli par la
boucle précédente.

{
permut1 = Tab[i] ;
Tab[i] = Tab[i+1] ;
Tab[i+1] = permut1 ;
}
}

printf("Tableau trie : n") ;



Que tu crois... Le bubble sort nécessite au moins 2 boucles
imbriquées...

void bubbleSort(int numbers[], int array_size)
{
int i, j, temp;

for (i = (array_size - 1); i >= 0; i--)
{
for (j = 1; j <= i; j++)
{
if (numbers[j-1] > numbers[j])
{
temp = numbers[j-1];
numbers[j-1] = numbers[j];
numbers[j] = temp;
}
}
}
}

for ( i = 0 ; i < N ; i++ )
printf("%4d", Tab[i]) ;

printf("n===============nn") ;

printf("Entrez une valeur a rechercher : nn") ;
scanf("%d", &VAL ) ;

printf("nn") ;

midPOS = N/2 ;

if ( VAL < Tab[midPOS] )
{
for ( i = 0, POS=0 ; i < midPOS ; i+
+ )
if ( Tab[i] = VAL )



Attention, l'opérateur de comparaison c'est == et pas
POS = i ;
printf("(tri 1ere moitie) t La valeur se trouve en
position %d", POS
+1);
}

else if ( VAL >= Tab[midPOS] )
{
for ( i = midPOS ; i < N ; i+
+ )
{
if ( Tab[i] = VAL )
{
POS = i;
}
}
printf("(tri 2nde moitie) t La valeur se trouve en
position %d", POS
+1) ;
}



Pouquoi séparer la recherche dans 2 moitiées de tableau ?!
La tableau est trié donc

for i = 0 to N-1
if T[i] >= VAL
break

et pas besoin de POS, i suffit.

else
printf("No match!") ;

printf("nn==============================nn") ;

return 0 ;



Y'a encore du boulot...
Si tu peux reposter ton code après l'avoir corrigé, ce serait bien.


--
zwim.
Rien n'est impossible que la mesure de la volonté humaine...
espie
Le #19646271
In article zwim
Le Fri, 26 Jun 2009 03:23:17 -0700 (PDT)
a écrit
Bonjour,



bonjour,

Voici le script qui me fait tourner la tête car ca fonctionne pour un
nombre qui fait partie de la première partie du tableau mais pas de la
seconde ???



Sont pas tendres avec les newbies, au moins tu as dit bonjour, et
c'est pas écrit en language sms, un bon début.



Attend, faut pas pousser memes dans les orties non plus. On lui a demande
des precisions legitimes, il nous a envoye balader. C'est pas la hotline AOL
non plus...
bpascal123
Le #19648591
Bonjour,

Mes excuses aux uns et aux autres. J'ai en premier eu le sentiment que
bien qu'en l'absence d'un modérateur dans ce groupe qui peut ralentir
la publication de message ou filtrer les messages hors sujet, il y a
avait "un protocole" tel que s'annoncer à une personne importante,
annoncer pourquoi on veut la voir etc...attendre avant l'entretien -je
me suis un peu laissé emporter car exécuter ce script me semble simple
à comprendre ou peut-être c'est parce que je ne suis pas rapide et
j'ai passé la journée à essayer de faire marcher ce programme.

Je commence à apprendre le C avec 2 ouvrages et l'un des ouvrage
n'approfondit pas beaucoup. Je pensais avec cet ouvrage avoir comprit
les tableaux (auparavant, j'ai étudié seul pendant 6-8 mois les
algorithmes pour non-matheux du Site d'un prof de Jussieu et passé
également du temps sur les tableaux...)
Arrivé au chapitre des pointeurs de l'ouvrage qui n'approfondit pas
beaucoup, je pensais avoir compris les tableaux mais ce n'était pas le
cas. Alors je dois revenir quelques pages en arrière, car je pense
avoir été trop sûre de moi et laisser les tableaux trop vite d'où c e
post (et puis j'ai posté 3 fois car j'avais oublié de rendre le
programme plus lisible que celui qui est sur la machine...)
apparemment ça n'était pas assez lisible, je ne sais même pas comment
vous avez fait pour voir les posts qu'il m'avait semblé supprimer??? .

Encore mes excuses pour la réponse précédente, je reconnais que ce
n'est pas une façon d'attendre une réponse.

Pascal
bpascal123
Le #19648651
Bonjour,

Pour reprendre la discussion, ce script doit chercher une valeur par
tri "binaire". Il commence à la moitié du tableau et compare la valeur
avec celle de la position de la moitié du tableau : ---ligne 55-60---
midPOS = N/2 ; Cette valeur est automatiquement convertie en valeur
entière si N/2 est décimale.

Après quoi, le programme cherche une valeur et renvoie sa position
dans le tableau. Etrangement, ça ne marche pour la 2ième partie du
tableau.

...
if ( VAL < Tab[midPOS] )
{ for ( i = 0, POS=0 ; i < midPOS ; i++ )
if ( Tab[i] = VAL )
POS = i ;
printf("(tri 1ere moitie) t La valeur se trouve en position %d", POS
+1);
}

else if ( VAL >= Tab[midPOS] )
{
for ( i = midPOS ; i < N ; i++ )
{
if ( Tab[i] = VAL )
{
POS = i;
}
}
printf("(tri 2nde moitie) t La valeur se trouve en position %d", POS
+1) ;
}

...


Les boucles "while" sont équivalentes aux boucles "For", "While" ne
conviendrait pas mieux?

Et je me demande si l'usage des pointeurs pour quelque chose d'aussi
simple ne produirait pas l'effet que j'attends? Je suis paresseux,
c'est pourquoi je pose la question au lieu de tester.

Merci Zwim pour tes précieuses précisions, je suis passé à un autre
exercice sur lequel je suis proche du résultat - je cherche à
comprendre encore pourquoi avec "for" tel que je l'emploie ça ne
marche pas et la solution avec "while" donnée par l'auteur fonctionne.
C'est vrai dans le futur mes programmes risquent de ne pas être
lisibles car je me concentre essentiellement sur un résultat qui
s'affiche.

Mais je vais revenir sur ce programme et le faire fonctionner avec tes
modifications.

Pascal
espie
Le #19649041
In article
Bonjour,

Pour reprendre la discussion, ce script doit chercher une valeur par
tri "binaire". Il commence à la moitié du tableau et compare la valeur
avec celle de la position de la moitié du tableau : ---ligne 55-60---
midPOS = N/2 ; Cette valeur est automatiquement convertie en valeur
entière si N/2 est décimale.



Un peu de vocabulaire.

Ca s'appelle une recherche dichotomique. C'est utile de connaitre le terme,
ca peut te donner de la biblio.

Ensuite, meme si tu persistes, ca ne s'appelle toujours pas un script.
C'est un programme. Code source en C, executable en autre chose.

Le terme de script est reserve aux langages interpretes tels que le shell,
ou perl.

Après quoi, le programme cherche une valeur et renvoie sa position
dans le tableau. Etrangement, ça ne marche pour la 2ième partie du
tableau.

...
if ( VAL < Tab[midPOS] )
{ for ( i = 0, POS=0 ; i < midPOS ; i++ )
if ( Tab[i] = VAL )
POS = i ;
printf("(tri 1ere moitie) t La valeur se trouve en position %d", POS
+1);
}

else if ( VAL >= Tab[midPOS] )
{
for ( i = midPOS ; i < N ; i++ )
{
if ( Tab[i] = VAL )
{
POS = i;
}
}
printf("(tri 2nde moitie) t La valeur se trouve en position %d", POS
+1) ;
}

...



Comme souvent en C, l'erreur est plus haut: tu ne tries pas ton tableau,
tu fais juste une passe d'echange de valeurs, ca va juste diminuer le
nombre d'echanges a faire pour finir de trier...

Tu as commence d'implementer l'algo de tri le plus simple existant, le
tri a bulles. Il te manque une condition d'arret, normalement, on continue
a reparcourir le tableau du debut tant qu'on echange des elements...

Affiche le contenu de ton tableau, il n'est pas dans l'ordre...


Les boucles "while" sont équivalentes aux boucles "For", "While" ne
conviendrait pas mieux?



Question purement stylistique. C'est effectivement equivalent, c'est toi
qui voies ce qui te semble le plus simple.

Et je me demande si l'usage des pointeurs pour quelque chose d'aussi
simple ne produirait pas l'effet que j'attends? Je suis paresseux,
c'est pourquoi je pose la question au lieu de tester.



Non. Je ne vois meme pas ce qui peut te faire penser ca, dans ce cas
precis de figure. Il n'y a aucun avantage a utiliser des pointeurs....



Merci Zwim pour tes précieuses précisions, je suis passé à un autre
exercice sur lequel je suis proche du résultat - je cherche à
comprendre encore pourquoi avec "for" tel que je l'emploie ça ne
marche pas et la solution avec "while" donnée par l'auteur fonctionne.
C'est vrai dans le futur mes programmes risquent de ne pas être
lisibles car je me concentre essentiellement sur un résultat qui
s'affiche.



for et while sont equivalents. Plus precisement,
for(init; cond; incr) {
code;
}

est equivalent a:

init;
while (cond) {
code;
incr;
}

si ca ne marche pas pour toi, c'est que tu n'ecris pas des choses equivalentes!
Publicité
Poster une réponse
Anonyme