Langage C : LES TABLEAUX  ET LES CHAINES DE CARACTERES (Cours et Exercices corrigés)
Monday, June 6, 2011     17:19
  • Mon @ IP: 54.224.102.26



retour

Poster un commentaire ou une réponse

LES TABLEAUX  ET LES CHAINES DE CARACTERES (Cours et Exercices corrigés)

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:24:23

-------------------------LES TABLEAUX DE NOMBRES (INT ou FLOAT)--------------------


Les tableaux correspondent aux matrices en mathématiques. Un tableau est caractérisé par sa taille et par ses éléments.

Les tableaux à une dimension:

Déclaration: type nom[dim];
Exemples:
int compteur[10];

float nombre[20];


Cette déclaration signifie que le compilateur réserve dim places en mémoire pour ranger les éléments du tableau.

Exemples:
int compteur[10]; le compilateur réserve des places pour 10 entiers, soit 20 octets en TURBOC et 40 octets en C standard.
float nombre[20]; le compilateur réserve des places pour 20 réels, soit 80 octets.

Remarque: dim est nécessairement une VALEUR NUMERIQUE. Ce ne peut être en aucun cas une combinaison des variables du programme.

Utilisation: Un élément du tableau est repéré par son indice. En langage C les tableaux commencent à l'indice 0. L'indice maximum est donc dim-1.

Appel: nom[indice]

Exemples:
compteur[2] = 5;
nombre[i] = 6.789;
printf("%d",compteur[i]);
scanf("%f",&nombre[i]);

Tous les éléments d'un tableau (correspondant au dimensionnement maximum) ne sont pas forcément définis.

D'une façon générale, les tableaux consomment beaucoup de place en mémoire. On a donc intérêt à les dimensionner au plus juste.

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:24:59

Exercice VI_1: Saisir 10 réels, les ranger dans un tableau. Calculer et afficher la moyenne et l'écart-type.

Les tableaux à plusieurs dimensions:

Tableaux à deux dimensions:

Déclaration:type nom[dim1][dim2];
Exemples:
int compteur[4][5];

float nombre[2][10];

Utilisation: Un élément du tableau est repéré par ses indices. En langage C les tableaux commencent aux indices 0. Les indices maximum sont donc dim1-1, dim2-1.

Appel: nom[indice1][indice2]

Exemples:
compteur[2][4] = 5;
nombre[i][j] = 6.789;
printf("%d",compteur[i][j]);
scanf("%f",&nombre[i][j]);

Tous les éléments d'un tableau (correspondant au dimensionnement maximum) ne sont pas forcément définis.

Exercice VI_2: Saisir une matrice d'entiers 2x2, calculer et afficher son déterminant.

Tableaux à plus de deux dimensions:

On procède de la même façon en ajoutant les éléments de dimensionnement ou les indices nécessaires.

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:25:11

--------------------------------INITIALISATION DES TABLEAUX------------------------


On peut initialiser les tableaux au moment de leur déclaration:

Exemples:

int liste[10] = {1,2,4,8,16,32,64,128,256,528};

float nombre[4] = {2.67,5.98,-8,0.09};

int x[2][3] = {{1,5,7},{8,4,3}}; /* 2 lignes et 3 colonnes */

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:28:29

TABLEAUX ET POINTEURS


En déclarant un tableau, on définit automatiquement un pointeur (on définit en fait l'adresse du premier élément du tableau).

Les tableaux à une dimension:

Les écritures suivantes sont équivalentes:

int *tableau;-----------------------------int tableau[10];---------déclaration
tableau = (int*)malloc(sizeof(int)*10);

*tableau---------------------------------tableau[0]----------------le 1er élément

*(tableau+i)-----------------------------tableau[i]---------------- un autre élément

tableau---------------------------------&tableau[0]--------------adresse du 1er élément

(tableau + i)---------------------------&(tableau[i])-------------adresse d'un autre élément

Il en va de même avec un tableau de réels (float).

Remarque: La déclaration d'un tableau entraine automatiquement la réservation de places en mémoire. Ce n'est pas le cas lorsque l'on déclare un pointeur. Il faut alors utiliser une fonction d'allocation dynamique comme malloc.


Les tableaux à plusieurs dimensions:

Un tableau à plusieurs dimensions est un pointeur de pointeur.

Exemple: int t[3][4];t est un pointeur de 3 tableaux de 4 éléments ou bien de 3 lignes à 4 éléments.

Les écritures suivantes sont équivalentes:

t[0]-----------&t[0][0]adresse du 1er élément

t[1]-----------&t[1][0]adresse du 1er élément de la 2e ligne

t[i]-----------&t[i][0] adresse du 1er élément de la ième ligne

t[i]+1---------&(t[i][0])+1adresse du 1er élément de la ième +1 ligne


Publicité

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:29:20

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:29:42

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:30:45

-------------------------------LES CHAINES DE CARACTERES--------------------



En langage C, les chaînes de caractères sont des tableaux de caractères. Leur manipulation est donc analogue à celle d'un tableau à une dimension:

Déclaration:char nom[dim]; ou bienchar *nom;
nom = (char*)malloc(dim);

Exemple:char texte[dim]; ou bienchar *texte;
texte = (char*)malloc(10);

Le compilateur réserve (dim-1) places en mémoire pour la chaîne de caractères: En effet, il ajoute toujours le caractère NUL ('\0') à la fin de la chaîne en mémoire.

Affichage à l'écran:

On peut utiliser la fonction printf et le format %s:
char texte[10] = « BONJOUR »;
printf("VOICI LE TEXTE: %s\n",texte);

On utilisera si possible la fonction puts non formatée:
puts(texte);est équivalent à printf("%s\n",texte);


Saisie: On peut utiliser la fonction scanf et le format %s. Une chaîne étant un pointeur, on n'écrit pas le symbole &. On utilisera de préférence la fonction gets non formatée.

char texte[10];
printf("ENTRER UN TEXTE: ");
scanf("%s",texte);est équivalent à gets(texte);

Remarque: scanf ne permet pas la saisie d'une chaîne comportant des espaces: les caractères saisis à partir de l'espace ne sont pas pris en compte (l'espace est un délimiteur au même titre que LF) mais rangés dans le tampon d'entrée. Pour saisir une chaîne de type "il fait beau", il faut utiliser gets.
A l'issue de la saisie d'une chaîne de caractères, le compilateur ajoute '\0' en mémoire après le dernier caractère.

Comme expliqué au chapitre 2, gets et scanf utilisent le flux d'entrée.

Exercice VI_5:

Saisir une chaîne de caractères, afficher les éléments de la chaîne et leur adresse (y compris le dernier caractère '\0').

Exercice VI_6:

Saisir une chaîne de caractères. Afficher le nombre de e et d'espaces de cette chaîne.

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:31:24

Fonctions permettant la manipulation des chaînes:

Les bibliothèques fournies avec les compilateurs contiennent de nombreuses fonctions de traitement des chaînes de caractères. En BORLAND C++, elles appartiennent aux bibliothèques string.h ou stdlib.h. En voici quelques exemples:

Générales (string.h):

void *strcat(char *chaine1,char *chaine2)
concatène les 2 chaînes, résultat dans chaine1,

renvoie l'adresse de chaine1.

int strlen(char *chaine)
renvoie la longueur de la chaine ('\0' non comptabilisé).

void *strrev(char *chaine)inverse la chaîne et, renvoie l'adresse de la chaine inversée.

Comparaison (string.h):

int strcmp(char *chaine1,char *chaine2)renvoie un nombre:
- positif si la chaîne1 est supérieure à la chaine2 (au sens de l'ordre alphabétique)
- négatif si la chaîne1 est inférieure à la chaîne2
- nul si les chaînes sont identiques.

Copie (string.h):

void *strcpy(char *chaine1,char *chaine2)
recopie chaine2 dans chaine1 et renvoie l'adresse de chaîne1.

Recopie (string.h):

Ces fonctions renvoient l'adresse de l'information recherchée en cas de succès, sinon le pointeur NULL (c'est à dire le pointeur de valeur 0 ou encore le pointeur faux).

void *strchr(chaine,caractère) recherche le caractère dans la chaîne.
void *strrchr(chaine,caractère)idem en commençant par la fin.
void *strstr(chaîne,sous-chaîne)recherche la sous-chaine dans la chaîne.

Conversions (stdlib.h):

int atoi(char *chaîne)convertit la chaîne en entier
float atof(char *chaine)convertit la chaîne en réel

exemple:
printf("ENTRER UN TEXTE: ");
gets(texte);
n = atoi(texte) ;
printf("%d",n);/* affiche 123 si texte vaut "123" */
/* affiche 0 si texte vaut "bonjour" */

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:31:39

void *itoa(int n,char *chaîne,int base)convertit un entier en chaîne:
base: base dans laquelle est exprimé le nombre,
cette fonction renvoie l'adresse de la chaîne.

exemple: itoa(12,texte,10);texte vaut "12"

Pour tous ces exemples, la notation void* signifie que la fonction renvoie un pointeur (l'adresse de l'information recherchée), mais que ce pointeur n'est pas typé. On peut ensuite le typer à l'aide de l'opérateur cast .

Exemple:
int *adr;
char texte[10] = "BONJOUR";
adr = (int*)strchr(texte,'O');

Exercice VI_7:

L'utilisateur saisit le nom d'un fichier. Le programme vérifie que celui-ci possède l'extension .PAS

Exercice VI_8:

Un oscilloscope à mémoire programmable connecté à un PC renvoie l'information suivante sous forme d'une chaîne de caractères terminée par '\0'au PC:
"CHANNELA 0 10 20 30 40 30 20 10 0 -10 -20 -30 -40 -30 -20 -10 -0"
Afficher sur l'écran la valeur des points vus comme des entiers. On simulera la présence de l'oscilloscope en initialisant une chaîne de caractères char mesures[100].

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:32:05

------------------CORRIGE DES EXERCICES------------------



Exercice VI_1:

#include <stdio.h>
#include <math.h>
#include <conio.h>
void main()
{
float nombre[10],moyenne = 0,ecart_type = 0;
int i;

/* saisie des nombres */
printf("SAISIR 10 NOMBRES SEPARES PAR RETURN: \n");
for(i=0;i<10;i++)
{
printf("nombre[] = ",i);
scanf("%f",&nombre[i]);
}


Publicité

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:32:18

/* calculs */
for(i=0;i<10;i++)
{
moyenne = moyenne + nombre[i];
ecart_type = ecart_type + nombre[i]*nombre[i];
}
moyenne = moyenne/10;
ecart_type = ecart_type/10;
ecart_type = ecart_type - moyenne*moyenne;
ecart_type = sqrt(ecart_type);/* racine */
printf("MOYENNE = %f ECART_TYPE = %f\n",moyenne,ecart_type);
printf("POUR CONTINUER FRAPPER UNE TOUCHE: ");
getch();
}

Exercice VI_2:

#include <stdio.h>
#include <conio.h>
void main()
{
int mat[2][2],det;
/* saisie */
printf("ENTRER SUCCESSIVEMENT LES VALEURS DEMANDEES: \n");
printf("mat[0][0] = ");
scanf("%d",&mat[0][0]);
printf("mat[1][0] = ");
scanf("%d",&mat[1][0]);
printf("mat[0][1] = ");
scanf("%d",&mat[0][1]);
printf("mat[1][1] = ");
scanf("%d",&mat[1][1]);

/* calcul */
det = mat[0][0]*mat[1][1]-mat[1][0]*mat[0][1];

/* affichage */
printf("DETERMINANT = %d\n",det);
printf("POUR CONTINUER FRAPPER UNE TOUCHE: ");
getch();
}

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:32:34

Exercice VI_3:

#include <stdio.h>
#include <conio.h>
void main()
{
int i,tab[10]={4,12,53,19,11,60,24,12,89,19};
printf("VOICI LES ELEMENTS DU TABLEAU ET LEURS ADRESSES:\n");
for(i=0;i<10;i++)
printf("ELEMENT N¯: - ADRESSE: %p\n",i,tab[i],tab+i);
printf("POUR SORTIR FRAPPER UNE TOUCHE: ");
getch();
}

Exercice VI_4:

#include <stdio.h>
#include <conio.h>
void main()
{
int i,tab[20] = {4,-2,-23,4,34,-67,8,9,-10,11, 4,12,-53,19,11,-60,24,12,89,19};
printf("VOICI LE TABLEAU:\n\n");
for(i=0;i<20;i++)
if (((i+1)%5)==0) printf("\t%d \n",tab[i]);
else printf("\t%d ",tab[i]);
printf("\nPOUR SORTIR FRAPPER UNE TOUCHE: ");
getch();
}

Exercice VI_5:

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
char i=0,*phrase;
phrase = (char*)malloc(20);/* reserve 20 places */

printf("ENTRER UNE PHRASE: ");
gets(phrase);/* saisie */

printf("VOICI LES ELEMENTS DE LA CHAINE ET LEUR ADRESSE\n");
do
{
printf("LETTRE: %c CODE ASCII: %x ADRESSE: %p\n",phrase[i],phrase[i],phrase+i);
i++;
}

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:32:57

while(phrase[i-1]!='\0');
free(phrase);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE: ");
getch();
}

Exercice VI_6:

#include <stdio.h>
#include <conio.h>
#include <alloc.h>
void main()
{
char *phrase,compt_espace = 0,compt_e = 0,i;
phrase=(char*)malloc(20);/* reserve 20 places */
printf("ENTRER UNE PHRASE:");
gets(phrase); /* saisie */

for(i=0;phrase[i]!='\0';i++)
{
if(phrase[i]=='e')compt_e++;
if(phrase[i]==' ')compt_espace++;
}
printf("NOMBRE DE e: %d\n",compt_e);
printf("NOMBRE D'ESPACES : %d\n",compt_espace);
free(phrase);
printf("POUR SORTIR FRAPPER UNE TOUCHE ");
getch();
}

Exercice VI_7:

#include <conio.h>
#include <alloc.h>
#include <string.h>
void main()
{
char *nom,*copie;
int n;
nom = (char*)malloc(30);
copie = (char*)malloc(30);
printf("\nNOM DU FICHIER (.PAS):");
gets(nom);
strcpy(copie,nom);
strrev(copie);/* chaine inversee */
n = strnicmp("SAP.",copie,4);/* n vaut 0 si ‚galite */
if(n!=0)printf("\nLE FICHIER N'EST PAS DE TYPE .PAS\n");
else printf("\nBRAVO CA MARCHE\n");
free(nom);
free(copie);
printf("\nPOUR CONTINUER FRAPPER UNE TOUCHE ");
getch();
}

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:33:09

Exercice VI_8:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main()
{
char mesures[100] =
"CHANNELA 0 10 20 30 40 30 20 10 0 -10 -20 -30 -40 -30 -20 -10 0";
int i,j,val[20],nombre_val=0;
char temp[4]; /* chaine temporaire */

/* recherche des nombres */
for(i=9;mesures[i]!='\0';i++)
{
for(j=0;(mesures[i]!=' ')&&(mesures[i]!='\0');j++)
{
temp[j]=mesures[i];
i++;
}
temp[j] = '\0'; /* On borne la chaine */
val[nombre_val] = atoi(temp); /* Conversion de la chaine temporaire en nombre */
nombre_val++;
}

/* Affichage du resultat */
clrscr();
for(i=0;i<nombre_val;i++)printf("val[%d] = %d\n",i,val[i]);
printf("POUR SORTIR FRAPPER UNE TOUCHE:");
getch();
}

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:33:55

Les exécutables des exercices

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:33:57

EXVI_1.CPP


Publicité

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:34:09

EXVI_2.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:34:21

EXVI_3.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:34:32

EXVI_4.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:34:46

EXVI_5.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:34:56

EXVI_6.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:35:09

EXVI_7.CPP

  abdou1987 :
nb posts:722
nb discussions:131
inscrit le :02-12-2014
le 27-01-2015 à 14:35:20

EXVI_8.CPP

Poster un commentaire ou une réponse :
Poster
     Ajouter un document à la discussion:
       

Actualité informatique et High-Tech

16-10-2015               lire

Dropbox propose aussi un outil d'écriture collaborative à son service

16-10-2015               lire

Bientôt des DRM dans des JPEG

17-04-2015               lire

Google propose une requête pour retrouver son téléphone

17-04-2015               lire

Youtube prépare une offre payante sans publicité

17-04-2015               lire

Sony Pictures : Des milliers de mails et documents confidentiels dévoilés

07-04-2015               lire

T411 bloqué par les FAI français

07-04-2015               lire

NVIDIA publie un pilote correctif et met à jour SHIELD Hub ainsi que GeForce Experience

07-04-2015               lire

Linkedin acquiert la start-up Refresh

03-04-2015               lire

Chromebit, la clé USB Google et Asus qui transforme n’importe quel écran en ordinateur

03-04-2015               lire

Une personne aurait pu supprimer toutes les vidéos d’une chaine Youtube en quelques secondes

03-04-2015               lire

Firefox 37 apporte un cryptage complémentaire à HTTPS

03-04-2015               lire

Windows XP, ce système qui ne veut pas mourir

02-04-2015               lire

Piratage de Labio.fr : le laboratoire répond à nos questions et ne payera pas la rançon

02-04-2015               lire

AWS lance des instances géantes avec 48 To de stockage

02-04-2015               lire

WhatsApp ajoute les appels gratuits et illimités à son application

31-03-2015               lire

Nadim Kobeissi : de Cryptocat à Peerio, du piratage au doctorat

31-03-2015               lire

L'Université de Nantes inaugure son datacenter modulaire taillé pour le HPC

31-03-2015               lire

GitHub victime d’une attaque DDoS majeure

27-03-2015               lire

Googlinette : les recherches de Google en devinettes

27-03-2015               lire

F8 : Facebook ouvre Messenger au e-commerce

27-03-2015               lire

À la SNCF, une fuite de données simple comme une touche F5

23-03-2015               lire

Des satellites GPS de Boeing affectés par une erreur technique

23-03-2015               lire

Plus de 700 000 routeurs ADSL vulnérables au piratage

23-03-2015               lire

Twitter sous le coup d’une action collective pour discrimination

22-03-2015               lire

Les montres connectées étaient déjà présentes dans les films, séries et dessins animés

22-03-2015               lire

Une Audi autonome va traverser les USA de SF à New York

20-03-2015               lire

Éclipse du Soleil : comment la suivre en direct sur Internet

20-03-2015               lire

Projet Leap : des bus 2.0 à San Francisco

20-03-2015               lire

Nvidia dévoile Drive PX, un système de conduite autonome

17-03-2015               lire

Embarquez pour Apollo 11, expérience virtuelle hors du commun

16-03-2015               lire

Ce jour où Google a exposé les données de 282 867 domaines

16-03-2015               lire

Yahoo publie le code de son plug-in de chiffrement mail

16-03-2015               lire

Après un an sans mise à jour, HAWKEN revient à la vie

12-03-2015               lire

Le big data au service du séquençage ADN pour accélérer les diagnostics

12-03-2015               lire

Clap de fin pour PlayStation Mobile

12-03-2015               lire

Apple : retour à la normale après une panne de plus de 11 heures

12-03-2015               lire

Ericsson va supprimer 2 200 postes en Suède

12-03-2015               lire

Le plan de Fleur Pellerin contre le piratage sur Internet

10-03-2015               lire

Apple Watch, Watch Edition et Watch Sport : de 399 à 18.000 euros !

10-03-2015               lire

Apple présente le “nouveau MacBook” qui remplace le MacBook Air

09-03-2015               lire

Google développe une version d'Android pour la réalité virtuelle

09-03-2015               lire

Quand la MPAA demande à Google de déréférencer son propre site

09-03-2015               lire

Heroes of the Dorm : un tournoi HotS avec 450 000 $ de bourses d'études à gagner

09-03-2015               lire

1 milliard d'adresses mails volées, 2 pirates inculpés

09-03-2015               lire

VMware accusé de violation de code Linux

09-03-2015               lire

Les drones civils bientôt immatriculés ?

05-03-2015               lire

7 sites qui permettent d’envoyer des fichiers de + ou – 2 Go

04-03-2015               lire

Smartphones : Apple passe en tête devant Samsung56% des consommateurs inquiets pour leurs données en Europe

04-03-2015               lire

Smartphones : Apple passe en tête devant Samsung

04-03-2015               lire

MWC 2015 : Onevisage pésente un scan facial 3D pour smartphones

04-03-2015               lire

Caméras sportives : Xiaomi s'attaque au monopole GoPro

04-03-2015               lire

Yi Camera, la caméra embarquée de Xiaomi à moins de 60€

04-03-2015               lire

Faille FREAK : quand des connexions SSL/TLS se contentent d'un chiffrement RSA sur... 512 bits

04-03-2015               lire

Bientôt des pubs sur Google Play (Android)

28-02-2015               lire

En partenariat avec "Positive Technologies", Esprit a l'honneur d'inviter ses étudiants à la 1ère édition de l’événement ESPRIT HACK DAYS dans les locaux d'ESPRIT Chotrana 2 et ce le 03 et le 04 Mars 2015.

28-02-2015               lire

La direction des stages d’ESPRIT et Ernst & Young ont le plaisir d'inviter ses étudiants à la journée de l’entreprise du mercredi 4 mars 2015 dans la salle E5 d’ESPRIT Factory.

25-02-2015               lire

Adobe fête les 25 ans de son logiciel Photoshop

25-02-2015               lire

Linux 4.0 : gros numéro et petite version

Haut de page.