- Matrices et pointeurs
/* ce programme permet de passer une matrice en argument de procedure */
#include <stdio.h>
#include <stdlib.h>
#define NBC 5
void afficher(double (*M)[NBC], int nbl, int nbc)
{
/* dans ce contexte *(*(M+i)+j) désigne le même élément que M[i][j] */
int ligne, colonne;
for (ligne = 0; ligne < nbl; ligne++)
for (colonne = 0; colonne < nbc; colonne++)
printf("%4.1f%c", M[ligne][colonne],
(colonne == nbc - 1) ? '\n' : '\t');
}
int main(void)
{
/* matrice à trois lignes et cinq colonnes définie statiquement : */
double Matrice[][NBC] =
{ {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} };
double (*pMatrice)[NBC] = Matrice;
afficher(pMatrice, 3, NBC);
return EXIT_SUCCESS;
}
- Itoa et atoi
/* ce programme permet de convertir le premier argument de la ligne de
* commande en entier d'abord ("man 3c atoi"), puis de convertir cet entier en
* une chaîne de caractères ("man 3 sprintf"). Prenez garde cependant à ce que
* cet entier ne sorte pas de l'intervalle {INT_MIN, ..., INT_MAX}. Ces deux
* bornes sont définies dans le fichier /usr/include/limits.h et valent
* respectivement (-2147483647-1) et 2147483647 sur bacchus.
*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int unEntier;
char *uneChaine;
unEntier = atoi(argv[1]);
uneChaine = (char *) calloc(8, sizeof(char));
if (uneChaine != NULL)
sprintf(uneChaine, "%d", unEntier);
printf("atoi : %d\nitoa : %s\n", unEntier, uneChaine);
return EXIT_SUCCESS;
}
- Génération d'un nombre entier pseudo-aléatoire
/*
* Ce programme permet de generer aleatoire un entier naturel compris entre 0
* et le nombre passe en argument de la ligne de commande.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>
int alea(int N)
{
/* d'apres :
* http://www.eskimo.com/~scs/C-faq/q13.16.html
* http://www.ulib.org/webRoot/Books/Numerical_Recipes/bookcpdf.html
* RAND_MAX est definie dans /usr/include/stdlib.h et vaut (2^15)-1
*/
return (int) (N * (double) rand() / ((double) RAND_MAX + 1));
}
int main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "Usage: %s UnEntierNaturel\n", argv[0]);
return EXIT_FAILURE;
}
/* initialisation du generateur aleatoire */
srand((unsigned int) time(NULL) + getpid());
printf("%d\n", alea(atoi(argv[1])));
return EXIT_SUCCESS;
}
- Copie du contenu d'un tableau dans un autre
/*
* Cet exemple presente une solution de copie du contenu d'un tableau de
* flottants dans un autre, differente de celle qui consiste a dupliquer les
* elements terme a terme. L'emploi du memcpy est "rentable" du point de vue
* de l'efficacite surtout si l'on n'active pas les options d'optimisation a
* la compilation.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* necessaire au memcpy */
int main(int argc, char *argv[])
{
double *src, *dst;
int i, n;
n = atoi(argv[1]);
src = (double *) calloc(n, sizeof(double));
dst = (double *) calloc(n, sizeof(double));
/* initialisation du tableau src */
for (i = 0; i < n; i++)
src[i] = (double) rand() / ((double) RAND_MAX + 1);
/* copie du contenu du tableau src dans le tableau dst */
memcpy(dst, src, n * sizeof(double));
free(src);
free(dst);
return EXIT_SUCCESS;
}