[DS]Sujet DS langage C - Novembre 2010
5 participants
Page 1 sur 1
[DS]Sujet DS langage C - Novembre 2010
Devoir Surveillé du Langage C
N.Emad, E.Cardot, L.Chardenal, M. Belaoucha, M. Boukhanoufa
Exercice 1 (barème : 8/20) Quel est le résultat d’exécution du programme ci-dessous? Justifiez le résultat de chacune des expressions.
Exercice 2 (barème : 6/20) Écrivez un programme qui affiche un tableau rectangulaire de nombres réels flottants, comme ceci:
1.0 2.0 3.0 4.0 | 10.0
5.0 6.0 7.0 8.0 | 26.0
9.0 10.0 11.0 12.0 | 42.0
La dernière colonne est faite des sommes des lignes. On demandera à l’utilisateur de saisir à l’avance le nombre de lignes et le nombre de colonnes du tableau. Attention: pour cela, vous n’avez pas besoin et vous ne devez pas utiliser un tableau!
Questions de cours (barème : 6/20)
1. Définir les étapes de la chaîne de compilation.
2. Quel est le rôle du préprocesseur dans la chaîne de compilation?
3. Citez 10 mots réservés du langage C.
4. Citez deux méthodes de définition d’une constante. Quelle est la différence entre de telles constantes ?
5. Quelle est la différence entre une déclaration statique et une déclaration dynamique ?
N.Emad, E.Cardot, L.Chardenal, M. Belaoucha, M. Boukhanoufa
Exercice 1 (barème : 8/20) Quel est le résultat d’exécution du programme ci-dessous? Justifiez le résultat de chacune des expressions.
- Code:
#include <stdio.h>
int main()
{
int I=1;
int i = 8;
int j = 5;
float x = 0.005f;
float y = -0.01f;
char c = 'c';
char d = 'd';
printf("Expression %1d=%1d\n",I++,(3*i - 2*j)%(2*d - c));
printf("Expression %1d=%1d\n",I++,2*((i/5) + (4*(j-3))%(i + j - 2)));
printf("Expression %1d=%1d\n",I++,i <= j);
printf("Expression %1d=%1d\n",I++,j != 6);
printf("Expression %1d=%1d\n",I++,c == 99);
printf("Expression %1d=%1d\n",I++,5*(i + j) > 'c');
printf("Expression %1d=%1d\n",I++,(i > 0) && (j < 5));
printf("Expression %1d=%1d\n",I++,(i > 0) || (j < 5));
printf("Expression %1d=%1d\n",I++,(x > y) && (i > 0) || (j < 5));
printf("Expression %1d=%1d\n",I++,(x > y) && (i > 0) && (j < 5));
printf("Expression %1d=%1d\n",I++, ((i&&j)||(!0&&I))&&!d);
printf("Expression %1d=%1d\n",I++,sizeof(I+i+j)==sizeof(int));
return 0;
}
Exercice 2 (barème : 6/20) Écrivez un programme qui affiche un tableau rectangulaire de nombres réels flottants, comme ceci:
1.0 2.0 3.0 4.0 | 10.0
5.0 6.0 7.0 8.0 | 26.0
9.0 10.0 11.0 12.0 | 42.0
La dernière colonne est faite des sommes des lignes. On demandera à l’utilisateur de saisir à l’avance le nombre de lignes et le nombre de colonnes du tableau. Attention: pour cela, vous n’avez pas besoin et vous ne devez pas utiliser un tableau!
Questions de cours (barème : 6/20)
1. Définir les étapes de la chaîne de compilation.
2. Quel est le rôle du préprocesseur dans la chaîne de compilation?
3. Citez 10 mots réservés du langage C.
4. Citez deux méthodes de définition d’une constante. Quelle est la différence entre de telles constantes ?
5. Quelle est la différence entre une déclaration statique et une déclaration dynamique ?
romain L.- Noob en Informatique
- Messages : 3
Date d'inscription : 12/11/2011
Re: [DS]Sujet DS langage C - Novembre 2010
*Déplacé dans la bonne section*
Merci pour le sujet !![Wink](https://2img.net/i/fa/i/smiles/icon_wink.gif)
Si tu avais aussi la correction histoire de vérifier les réponses, ca serait cool![Smile](https://2img.net/i/fa/i/smiles/icon_smile.gif)
PS: Je me suis permis de mettre le code entre balise pour une question de lisibilité
Merci pour le sujet !
![Wink](https://2img.net/i/fa/i/smiles/icon_wink.gif)
Si tu avais aussi la correction histoire de vérifier les réponses, ca serait cool
![Smile](https://2img.net/i/fa/i/smiles/icon_smile.gif)
PS: Je me suis permis de mettre le code entre balise pour une question de lisibilité
Correction DS langage C - Novembre 2010
Ah oui dsl j'avais pas vu qu'il y avait une section DS ^^ Voici la correction
:
![Wink](https://2img.net/i/fa/i/smiles/icon_wink.gif)
- Spoiler:
Exercice 1 :
#include
int main()
{
int I=1;
int i = 8;
int j = 5;
float x = 0.005f;
float y = -0.01f;
char c = 'c';
char d = 'd';
printf("Expression %1d=%1d\n",I++,(3*i - 2*j)%(2*d - c));
printf("Expression %1d=%1d\n",I++,2*((i/5) + (4*(j-3))%(i + j - 2)));
printf("Expression %1d=%1d\n",I++,i <= j);
printf("Expression %1d=%1d\n",I++,j != 6);
printf("Expression %1d=%1d\n",I++,c == 99);
printf("Expression %1d=%1d\n",I++,5*(i + j) > 'c');
printf("Expression %1d=%1d\n",I++,(i > 0) && (j < 5));
printf("Expression %1d=%1d\n",I++,(i > 0) || (j < 5));
printf("Expression %1d=%1d\n",I++,(x > y) && (i > 0) || (j < 5));
printf("Expression %1d=%1d\n",I++,(x > y) && (i > 0) && (j < 5));
printf("Expression %1d=%1d\n",I++, ((i&&j)||(!0&&I))&&!d);
printf("Expression %1d=%1d\n",I++,sizeof(I+i+j)==sizeof(int));
return 0;
}
/* un jeu de test
Expression 1=14
Expression 2=18
Expression 3=0
Expression 4=1
Expression 5=1
Expression 6=0
Expression 7=0
Expression 8=1
Expression 9=1
Expression 10=0
Expression 11=0
Expression 12=1
*/
Exercice 2 :
#include
int main()
{
int I=0, J=1, L=0, NL, NC;
float x=0.0, SommeLigne = 0.0, SommeColonne = 0.0;
printf("Entrer le nombre de lignes:\n");
scanf("%d",&NL);
printf("Entrer le nombre de colonnes:\n");
scanf("%d",&NC);
for(I=0;I{
for (J=1;J<=NC;J++)
{
x=(float)(J+L);
printf("%3.1f\t",x);
SommeColonne = SommeColonne+ x;
}
printf(" | %3.1f\n",SommeColonne);
SommeColonne=0; L=(int)x;
}
return 0;
}
romain L.- Noob en Informatique
- Messages : 3
Date d'inscription : 12/11/2011
Re: [DS]Sujet DS langage C - Novembre 2010
Perso l'exo 2, je l'ai fait comme ça ( mais sans dev C++ j'aurai un peu galéré ):
Sinon pour l'exercice 1, je comprend pas trop le raisonnement pour les deux dernieres et les 2 premieres expressions ( enfin si mais j'ai un doute )
edit: c'est bon j'ai ajouté somme=0.0 dans le premier for puis j'ai mis k-1 dans l'autre je montre
- Spoiler:
- Code:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int colonnes, lignes,i,j;
float somme=0.0;
float k=1.0;
printf(" Combien de colonnes voulez-vous dans votre tableau ?\n\n");
scanf("%d",&colonnes);
printf(" Maintenant saisissez le nombre de lignes que vous voulez\n\n");
scanf("%d",&lignes);
for(j=1; j<=lignes; j++)
{
for(i=1; i<=colonnes; i++)
{
printf("%.1f ",k++);
somme= somme + k;
}
printf("| %.1f\n", somme);
}
system("PAUSE");
return 0;
}
Sinon pour l'exercice 1, je comprend pas trop le raisonnement pour les deux dernieres et les 2 premieres expressions ( enfin si mais j'ai un doute )
edit: c'est bon j'ai ajouté somme=0.0 dans le premier for puis j'ai mis k-1 dans l'autre je montre
- Spoiler:
- Code:
for(j=1; j<=lignes; j++)
{
somme=0.0;
for(i=1; i<=colonnes; i++)
{
printf("%.1f ",k++);
somme= somme + (k-1);
}
DamienRD- Développeur
- Messages : 59
Date d'inscription : 28/09/2011
Re: [DS]Sujet DS langage C - Novembre 2010
Si c'est possible, il y a moyen de détailler les calculs du 1er exo ?
Rien que sur la première je bloque XD
Rien que sur la première je bloque XD
Re: [DS]Sujet DS langage C - Novembre 2010
De ce que j'ai compris, I=1 ( et apres seulement il est incrémenté) puis on a 14% (2d-c) et la ... wtf
DamienRD- Développeur
- Messages : 59
Date d'inscription : 28/09/2011
Re: [DS]Sujet DS langage C - Novembre 2010
Je vais tenter une explication des calculs de l'exo 1 :
Note : pour lesgens incultes ne comprenant pas les and again and again, voir ici.
Bonne soirée à vous.
- Expression 1=14
I est incrémenté après son affichage
(3*i - 2*j)%(2*d - c)= ((3*8)-(2*5)) mod (2*d - c)
= 14 mod (2*d -c)
Ici, il faut savoir que un char correspond en c à un entier int en décimal.
Sachant, d'après les cours d'archi, que a --> 0x61 (ici pour vous en convaincre), ce qui donne 616=01102 et 116=00012,
61 en base hexa nous donne 0110 0001 en binaire.
Soit 'a' qui correspond donc à 97 en décimal.
Donc c correspond à 99 et d à 100.
je passe par bcp de détours, mais sinon on peut apprendre par cœur que 'a' --> 9710)
Revenons au calcul :
14 mod (2*d -c)
= 14 mod (2*100 - 99)
= 14 mod (200 -99)
= 14 mod 101
= 14 (google le dit)
Donc, finalement, voici le résultat du premier printf :- Code:
Expression 1=14
- Expression 2=18
2*((i/5) + (4*(j-3))%(i + j - 2))
= 2*(8/5 + (4*(5-3) mod (8 + 5-2))
= 2*(8/5 + 8 mod 11)
= 2*(1+ 8) car 8/5, c'est un entier divisé par un autre entier, ce qui donne un entier (1) en C
= 2*9
= 18
Soit pour le printf :- Code:
Expression 2=18
- Expression 3=0
Pour le 0, il faut évaluer la proposition i <= j :
comme i n'est pas inférieur ou égal à j, cette proposition prends la valeur ... 0 ! - Expression 4=1
Idem que ci-dessus, sauf que la proposition est vraie - Expression 5=1
Again, - Expression 6=0
and again, - Expression 7=0
and again and again, - Expression 8=1
and again and again, - Expression 9=1
and again and again and again and again, - Expression 10=0
and again and again and again and again and again and again and again and again, - Expression 11=0
On va détailler ici :
(( i && j )||( !0 && I )) && !d
__________i && j , ça donne 1, parce qu'aucun ne vaut 0
__________!0 && I, équivaut à 1 && I, soit 1 parce que I ne vaut pas 0
__________!d, sachant d n'est pas égal à 0, d est vrai, et sa négation !d vaut donc 0
= (1 || 1) && 0
= 0
Donc :- Code:
Expression 11=0
- Expression 12=1
sizeof(I+i+j)==sizeof(int)
Ici, il faut calculer le nb d'octets qu'il faut pour stocker la somme de I, I et j d'une part, et d'autre part pour stocker un entier int
I+i+j
= 1 + 8 + 5
= 14
14 étant un int, il a besoin d'autant d'octets (4, voir ici) qu'un autre int quelconque pour être mis en mémoire.
Donc, dans la proposition à évaluer :
sizeof(I+i+j)==sizeof(int)4 == 4
1
Donc,- Code:
Expression 12=1
Note : pour les
Bonne soirée à vous.
Thibaut J- Mini Développeur
- Messages : 39
Date d'inscription : 28/09/2011
Age : 111
Re: [DS]Sujet DS langage C - Novembre 2010
Merci beaucoup, surtout pour les deux dernières, j'ai pas eu le réflexe de me dire que les caractères correspondaient aussi a un nombre.
DamienRD- Développeur
- Messages : 59
Date d'inscription : 28/09/2011
Re: [DS]Sujet DS langage C - Novembre 2010
Ça m'a pris deux bonnes heures : ça fera 20 € (prix d'ami), à payer par Damien. Cash. Maintenant.
J'édite d'ailleurs ce message pour te dire Damien, que c'est dès la première expression que l'on a besoin de savoir qu'un caractère est égal à un entier int de la table ascii... donc tu as peut-être trouvé qqch de bon pour cette expression, mais je vois pas comment alors !
J'édite d'ailleurs ce message pour te dire Damien, que c'est dès la première expression que l'on a besoin de savoir qu'un caractère est égal à un entier int de la table ascii... donc tu as peut-être trouvé qqch de bon pour cette expression, mais je vois pas comment alors !
Thibaut J- Mini Développeur
- Messages : 39
Date d'inscription : 28/09/2011
Age : 111
![-](https://2img.net/s/t/13/72/32/i_tabs_less.png)
» [LANGAGE C] Le GPS du champ !
» [LANGAGE C] Morpion
» [COURS] Langage C
» [LANGAGE C]Salaire Net[V1.1]
» [LANGAGE C] La Calculatrice basique
» [LANGAGE C] Morpion
» [COURS] Langage C
» [LANGAGE C]Salaire Net[V1.1]
» [LANGAGE C] La Calculatrice basique
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|