struct
Le but de cette série d'exercices est de pratiquer les bases des tableaux et structures (de données). en C.
Avez-vous pris connaissance des conseils relatifs à ces séries d'exercices ?
Écrivez un programme scalaire.c qui calcule
le produit scalaire de deux vecteurs (implémentés au moyen de
tableaux de taille fixe).
Votre programme devra utiliser (entre autres) les éléments suivants :
Rappel : pour lire un entier, utiliser "%d"
(et pour lire un size_t
, "%zu"
).
Rappel : pour lire un double
, utiliser "%lf"
, "%zu"
).
Rappel :
Le produit scalaire de a par b est: a.b =
a1*b1 + a2*b2 + ... +
an*bn
Exemple : a = (5, 3, -1) b = (2, 1, 2) a.b = 11
On cherche ici à écrire un programme mulmat.c qui calcule la multiplication de deux matrices (rappel de l'algorithme ci-dessous).
la fonction de prototype
Matrice lire_matrice(void);
qui lit depuis le clavier les éléments d'une matrice (après avoir demandé ses tailles de lignes et colonnes et vérifié que celles-ci sont plus petites que N) et retourne la matrice résultante.
la fonction de prototype
Matrice multiplication(const Matrice a, const Matrice b);
qui multiplie deux matrices de tailles compatibles et affecte le résultat.
la fonction de prototype
void affiche_matrice(const Matrice m);
qui affiche le contenu d'une matrice ligne par ligne.
l'élément Mi,j est défini par
Saisie d'une matrice : Nombre de lignes : 2 Nombre de colonnes : 3 M[1,1]=1 M[1,2]=2 M[1,3]=3 M[2,1]=4 M[2,2]=5 M[2,3]=6 Saisie d'une matrice : Nombre de lignes : 3 Nombre de colonnes : 4 M[1,1]=1 M[1,2]=2 M[1,3]=3 M[1,4]=4 M[2,1]=5 M[2,2]=6 M[2,3]=7 M[2,4]=8 M[3,1]=9 M[3,2]=0 M[3,3]=1 M[3,4]=2 Résultat : 38 14 20 26 83 38 53 68
Le but de cet exercice est de placer sans recouvrement des objets rectilignes sur une grille carrée. Cela pourrait être par exemple une partie d'un programme de bataille navale.
Dans le fichier recouvrement.c :
Prototypez et écrivez une fonction :
int remplitGrille( Grille grille, size_t ligne, size_t colonne, char direction, size_t longueur );dont le rôle est de vérifier si le placement dans une
grille (voir ci-dessous) d'un objet de dimension longueur est possible, en partant de la coordonnée (ligne,colonne) et dans la direction définie par direction (Nord, Sud, Est ou Ouest).
Si le placement est possible, la fonction devra de plus effectuer ce placement (voir ci-dessous la description de la grille).
La fonction devra indiquer (par la valeur de retour) si le placement a pu être réalisé ou non.
Remarques :
scanf("%d");
sur le clavier, est en fait le retour à la ligne que vous avez tapé ; pour le supprimer avant de lire votre « vrai » caractère (direction), utilisez un getchar();
. Exemple de fonctionnement (version facile : coordonées de 0 à 9 et lettres pour les directions) :
Entrez coord. x: 2 Entrez coord. y: 8 Entrez direction (N,S,E,O): E Entrez taille: 2 Placement en (2,8) direction E longueur 2 -> succès Entrez coord. x: 0 Entrez coord. y: 8 Entrez direction (N,S,E,O): S Entrez taille: 5 Placement en (0,8) direction S longueur 5 -> ECHEC Entrez coord. x: 0 Entrez coord. y: 9 Entrez direction (N,S,E,O): O Entrez taille: 5 Placement en (0,9) direction O longueur 5 -> succès Entrez coord. x: -1
Résultat des placements :
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
---|---|---|---|---|---|---|---|---|---|---|
0 | ||||||||||
1 | ||||||||||
2 | ||||||||||
3 | ||||||||||
4 | ||||||||||
5 | ||||||||||
6 | ||||||||||
7 | ||||||||||
8 | ||||||||||
9 |
Le but de ce programme est d'effectuer les manipulations élémentaires sur les nombres complexes : addition, soustraction, multiplication et division.
Dans le fichier complexes.c, définissez une structure Complexe représentant un nombre complexe comme deux double (forme cartésienne).
Ensuite, prototypez puis définissez une procédure affiche qui prend un nombre complexe en argument et l'affiche.
Dans le main(), déclarez et initialisez un nombre complexe. Affichez-le. Compilez et executez votre programme pour vérifier que tout fonctionne comme prévu jusqu'ici.
Prototypez puis définissez une fonction addition qui prend deux nombres complexes en argument et retourne leur somme.
Ecrivez également les fonctions soustration, multiplication et division.
Testez toutes vos fonctions avec les calculs suivants:
(1,0) + (0,1) = (1,1) (0,1) * (0,1) = (-1,0) (1,1) * (1,1) = (0,2) (0,2) / (0,1) = (2,0) (2,-3) / (1,1) = (-0.5,-2.5)
la multiplication de z=(x,y) par z'=(x',y')
est le nombre complexe z*z'=(x*x'-y*y', x*y'+y*x').
la division de z=(x,y) par z'=(x',y')
est le nombre complexe z/z'=((x*x'+y*y')/(x'*x'+y'*y'),
(y*x'-x*y')/(x'*x'+y'*y')).
Si vous en avez besoin, voici un rappel plus complet sur les nombres complexes.
On s'intéresse ici à la résolution d'équations du second degré sur le corps des complexes.
Copiez le programme complexes.c dans le programme complexes2.c et éditez ce dernier.
Écrivez la fonction Complexe racine(Complexe); qui calcule la racine carrée de partie réelle positive d'un nombre complexe.
On peut montrer que la racine carrée z'=(x',y') de partie réelle positive d'un nombre complexe z=(x,y) est donnée par :
Testez avant de continuer. Calculez par exemple la racine carrée de -1.
Déclarez le type Solutions comme une structure à 2 champs Complexes : z1 et z2.
Pour finir prototypez puis définissez la fonction
resoudre_second_degre qui prend deux arguments
Complexe b et c et retourne, sous forme de
Solutions, les solutions de l'équation:
z*z + b*z + c= 0
Note : utilisez la même formule que pour résoudre une équation du second degré avec des nombres réels (dans le cas à 2 solutions), mais exploitez vos propres opérateurs (multiplication, division, etc) sur les Complexe pour trouver les Solutions de l'équation.
Avec b=0 et c=1 on a :
z1=-i z2=i
Avec b=3-2i et c=-5+i on a :
z1=-4.11442+1.76499i z2=1.11442+0.235013i