« Exercices en langage C/Tableaux statiques » : différence entre les versions
Contenu supprimé Contenu ajouté
Ajout Exercice parcours de tableau. |
→position d'un élément dans un tableau : Modification exercice position. |
||
Ligne 66 : | Ligne 66 : | ||
}}</div> |
}}</div> |
||
== |
== Position d'un élément dans un tableau == |
||
Ecrire une fonction |
Ecrire un programme ''position.c'' contenant une fonction principale ''main'' déterminant si un entier est contenu dans un tableau statique par l'appel à une fonction ''position''. |
||
La fonction main : |
|||
Le tableau contiendra des éléments de type <tt>int</tt>, la fonction retournera une valeur de type <tt>int</tt>. |
|||
* définira et initialisera le tableau d'entier |
|||
* récupèrera dans son tableau d'argument argv le nombre à chercher. |
|||
* appellera la fonction ''position''. |
|||
* affichera l'indice de l'élément dans le tableau ou un message indiquant que le nombre n'a pas été trouvé. |
|||
La fonction ''position'' : |
|||
* aura pour prototype : <code>static int position(int t[], int taille, int x)</code>. |
|||
* donnera l'indice d'un élément x dans le tableau t, ou -1 si x n'est pas trouvé. |
|||
<div style="width:70%">{{Boîte déroulante|titre=Solution|contenu = |
<div style="width:70%">{{Boîte déroulante|titre=Solution|contenu = |
||
Le fichier source |
Le fichier source en C99 : |
||
<source lang="c"> |
<source lang="c"> |
||
/* |
|||
Nom : position.c |
|||
Role : Affiche le nom de lancement du programme |
|||
le nombre et les valeurs des paramètres passés passés à ce programme. |
|||
Paramètres : |
|||
- argc : nombre de paramètres |
|||
- argv : tableau de chaine de caractere contenant les parametres |
|||
Code retour : 0 (EXIT_SUCCESS) |
|||
Pour produire un exécutable avec le compilateur libre GCC : |
|||
gcc -Wall -std=c99 -o position.exe position.c |
|||
Pour exécuter, tapez : ./position.exe |
|||
Version : 1.0 du 16/1/2008 |
|||
Licence : GNU GPL |
|||
*/ |
|||
#include <stdio.h> |
#include <stdio.h> |
||
#include <stdlib.h> |
|||
int position |
static int position(int t[], int taille, int x); |
||
int main(int argc, char *argv[]) |
|||
{ |
{ |
||
int tableau[] = { 2, 5, 45, 3, 9 }; |
|||
while (taille > 0) |
|||
int taille; |
|||
{ |
|||
int x = 0; |
|||
--taille; |
|||
int cr = 0; |
|||
if (t[taille] == x) |
|||
int resultat; |
|||
return taille; |
|||
} |
|||
return -1; |
|||
} |
|||
// Determination de la taille du tableau |
|||
int main(void) |
|||
taille = (int)(sizeof(tableau)/sizeof(tableau[0])); |
|||
{ |
|||
int tableau[] = { 2, 5, 45, 3, 9 }; |
|||
// Controle nombre de parametre et affiche usage |
|||
int x; |
|||
if (argc != 2) |
|||
{ |
|||
(void)fprintf(stderr, |
|||
"%s : Cherche un entier x passe en parametre\n" |
|||
"usage : %s x\n", |
|||
argv[0], argv[0]); |
|||
(void)fputs("Valeurs contenues dans le tableau : ", stderr); |
|||
for (int i=0; i<taille; i++) |
|||
{ |
|||
(void)fprintf(stderr, "%d ", tableau[i]); |
|||
} |
|||
(void)fputs("\n",stderr); |
|||
exit(EXIT_FAILURE); |
|||
} // if (argc != 2) |
|||
// Recupere le nombre passe en parametre et le convertit |
|||
printf("x ? "); |
|||
cr = sscanf(argv[1], "%d", &x); |
|||
if (cr != 1) |
|||
{ |
|||
(void)fprintf(stderr, |
|||
"Erreur : parametre \"%s\" invalide : doit etre un entier.\n", |
|||
argv[1]); |
|||
exit(EXIT_FAILURE); |
|||
} // if (cr != 1) |
|||
// Appel de la fonction position et affichage du resultat. |
|||
resultat = position(tableau, taille, x); |
|||
return 0; |
|||
if (resultat != -1) |
|||
{ |
|||
(void)printf("La position de %d est : %d\n", x, resultat); |
|||
} |
|||
else |
|||
{ |
|||
(void)printf("%d non trouve !\n", x); |
|||
} |
|||
return EXIT_SUCCESS; |
|||
} |
} |
||
/* |
|||
Fonction ...... : position |
|||
Role .......... : Retourne la position de l'entier x dans la tableau t |
|||
Parametres .... : |
|||
- t : tableau d'entiers passé en entier. |
|||
- taille : nombre d'elements du tableau |
|||
- x : valeur a rechercher. |
|||
Retour : L'indice dans le tableau de l'élément x ou -1 si non trouve. |
|||
*/ |
|||
static int position(int t[], int taille, int x) |
|||
{ |
|||
// On commence la recherche à partir de la fin du tableau |
|||
int indice = taille - 1; |
|||
while ((indice >= 0) && (t[indice] != x)) |
|||
{ |
|||
indice--; |
|||
} |
|||
return indice; |
|||
} // static int position(... |
|||
</source> |
</source> |
||
<pre> |
|||
MacMini-TM:~/c thierry$ gcc -Wall -std=c99 -o position.exe position.c |
|||
MacMini-TM:~/c thierry$ ./position.exe |
|||
./position.exe : Cherche un entier x passe en parametre |
|||
usage : ./position.exe x |
|||
Valeurs contenues dans le tableau : 2 5 45 3 9 |
|||
MacMini-TM:~/c thierry$ ./position.exe a |
|||
Erreur : parametre "a" invalide : doit etre un entier. |
|||
MacMini-TM:~/c thierry$ ./position.exe 5 |
|||
La position de 5 est : 1 |
|||
MacMini-TM:~/c thierry$ ./position.exe 99 |
|||
99 non trouve ! |
|||
</pre> |
|||
}}</div> |
}}</div> |
||
Version du 16 janvier 2008 à 16:04
Parcours d'un tableau
Écrire un programme nommé argv.c qui affiche :
- son nom de lancement (argv[0]);
- le nombre des ces arguments;
- la valeur de chaque argument reçu.
Rappels : La fonction main d'un programme C reçoit en argument :
- un entier argc indiquant le nombre d'élément du tableau argv;
- un tableau de chaines de caractère argv avec :
- argv[0] : Nom d'appel du programme.
- argv[i] : Valeur de l'argument de rang i.
Solution
Le fichier source en c99 :
/*
Nom : argv.c
Auteur : Thierry46
Role : Affiche le nom de lancement du programme
le nombre et les valeurs des paramètres passés passés à ce programme.
Paramètres :
- argc : nombre de paramètres
- argv : tableau de chaine de caractere contenant les parametre
Code retour : 0 (EXIT_SUCCESS)
Pour produire un exécutable avec le compilateur libre GCC :
gcc -Wall -std=c99 -o argv.exe argv.c
Pour exécuter, tapez : ./argv.exe
Version : 1.0 du 16/1/2008
Licence : GNU GPL
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// Affiche le nom de lancement du programme
(void)printf("Nom d'appel du programme (argv[0]) : %s\n", argv[0]);
// Affiche le nombre de parametre passe au programme
(void)printf("Nombre de parametre passe au programme : %d\n", argc-1);
// Affiche la valeur des parametres
for (int i=1; i<argc; i++)
{
(void)printf("Parametre %d : %s\n", i, argv[i]);
}
return EXIT_SUCCESS;
} // int main(...
MacMini-TM:~/Documents/developpement/c thierry$ gcc -Wall -std=c99 -o argv.exe argv.c MacMini-TM:~/Documents/developpement/c thierry$ ./argv.exe dudule 1 Nom d'appel du programme (argv[0]) : ./argv.exe Nombre de parametre passe au programme : 2 Parametre 1 : dudule Parametre 2 : 1
Position d'un élément dans un tableau
Ecrire un programme position.c contenant une fonction principale main déterminant si un entier est contenu dans un tableau statique par l'appel à une fonction position.
La fonction main :
- définira et initialisera le tableau d'entier
- récupèrera dans son tableau d'argument argv le nombre à chercher.
- appellera la fonction position.
- affichera l'indice de l'élément dans le tableau ou un message indiquant que le nombre n'a pas été trouvé.
La fonction position :
- aura pour prototype :
static int position(int t[], int taille, int x)
. - donnera l'indice d'un élément x dans le tableau t, ou -1 si x n'est pas trouvé.
Solution
Le fichier source en C99 :
/*
Nom : position.c
Role : Affiche le nom de lancement du programme
le nombre et les valeurs des paramètres passés passés à ce programme.
Paramètres :
- argc : nombre de paramètres
- argv : tableau de chaine de caractere contenant les parametres
Code retour : 0 (EXIT_SUCCESS)
Pour produire un exécutable avec le compilateur libre GCC :
gcc -Wall -std=c99 -o position.exe position.c
Pour exécuter, tapez : ./position.exe
Version : 1.0 du 16/1/2008
Licence : GNU GPL
*/
#include <stdio.h>
#include <stdlib.h>
static int position(int t[], int taille, int x);
int main(int argc, char *argv[])
{
int tableau[] = { 2, 5, 45, 3, 9 };
int taille;
int x = 0;
int cr = 0;
int resultat;
// Determination de la taille du tableau
taille = (int)(sizeof(tableau)/sizeof(tableau[0]));
// Controle nombre de parametre et affiche usage
if (argc != 2)
{
(void)fprintf(stderr,
"%s : Cherche un entier x passe en parametre\n"
"usage : %s x\n",
argv[0], argv[0]);
(void)fputs("Valeurs contenues dans le tableau : ", stderr);
for (int i=0; i<taille; i++)
{
(void)fprintf(stderr, "%d ", tableau[i]);
}
(void)fputs("\n",stderr);
exit(EXIT_FAILURE);
} // if (argc != 2)
// Recupere le nombre passe en parametre et le convertit
cr = sscanf(argv[1], "%d", &x);
if (cr != 1)
{
(void)fprintf(stderr,
"Erreur : parametre \"%s\" invalide : doit etre un entier.\n",
argv[1]);
exit(EXIT_FAILURE);
} // if (cr != 1)
// Appel de la fonction position et affichage du resultat.
resultat = position(tableau, taille, x);
if (resultat != -1)
{
(void)printf("La position de %d est : %d\n", x, resultat);
}
else
{
(void)printf("%d non trouve !\n", x);
}
return EXIT_SUCCESS;
}
/*
Fonction ...... : position
Role .......... : Retourne la position de l'entier x dans la tableau t
Parametres .... :
- t : tableau d'entiers passé en entier.
- taille : nombre d'elements du tableau
- x : valeur a rechercher.
Retour : L'indice dans le tableau de l'élément x ou -1 si non trouve.
*/
static int position(int t[], int taille, int x)
{
// On commence la recherche à partir de la fin du tableau
int indice = taille - 1;
while ((indice >= 0) && (t[indice] != x))
{
indice--;
}
return indice;
} // static int position(...
MacMini-TM:~/c thierry$ gcc -Wall -std=c99 -o position.exe position.c MacMini-TM:~/c thierry$ ./position.exe ./position.exe : Cherche un entier x passe en parametre usage : ./position.exe x Valeurs contenues dans le tableau : 2 5 45 3 9 MacMini-TM:~/c thierry$ ./position.exe a Erreur : parametre "a" invalide : doit etre un entier. MacMini-TM:~/c thierry$ ./position.exe 5 La position de 5 est : 1 MacMini-TM:~/c thierry$ ./position.exe 99 99 non trouve !