Exercices,langage C

Modérateur : Michel Quercia

Marvin45
Messages : 19
Enregistré le : ven. déc. 05, 2014 4:52 pm

Exercices,langage C

Message par Marvin45 » sam. déc. 06, 2014 5:46 pm

Bonjour,j'ai fais des exercices en C et je voulais savoir si ce que j'ai fait est bon .
Les voici :
1)Ecrire un programme qui saisit 6 entiers et les stocke dans un tableau, puis affiche le contenu de
ce tableau une fois qu’il est rempli.
b)Reprendre la partie saisie du programme précédent pour écrire un nouveau programme qui recherche
et affiche le plus grand élément du tableau.
2)
Ecrire un programme qui saisit un tableau de 6 entiers puis calcule la moyenne de ces six entiers.
Attention, la moyenne des entiers n’est pas un entier

Et voici ce que j'ai écris :
1)
#include<stdio.h>
main()
{
int tab[6],i
for(i=0,i<6,i++);
{
printf("Entrer un nombre ");
scanf("%d",tab[i]);
for(i=0,i<6,i++)
printf("voici le tableau :"%d\n",tab[i]);

b)
On appellera le maximum max.
#include<stdio.h>
main()
{
int tab[6],i,max
max=tab[0];
for(i=0,i<6,i++);
{
printf("Entrer un nombre ");
scanf("%d",tab[i]);

for (int i =1; i<6; i++){
if (table[i] > max){
max = table[i];
printf(" le maximum est :"%d\n",max);

2)
#include<stdio.h>
main()
{
int tab[6],i,M,S
M=tab[0]
S=tab[0]
for(i=0,i<6,i++);
{
printf("Entrer un nombre ");
scanf("%d",tab[i]);
for (int i = 0; i<6; i++)
{
S=S+tab[i];
M=S/6;
printf(" la somme est :"%d\n",S);
printf(" la moyenne est :"%d\n",M);

Avatar du membre
Taupelvl
Messages : 155
Enregistré le : ven. mai 16, 2014 3:37 am
Localisation : Paris

Re: Exercices,langage C

Message par Taupelvl » sam. déc. 06, 2014 5:55 pm

a) il te manque les & dans les fonctions scanf il me semble et n'oublie pas de fermer toutes tes boucles sinon ton programme plante.(valable aussi pour les autres programmes)
b)il faudra fermer ta boucle for, ensuite afficher le max.
2/Même chose que ce qui précède en plus du fait que M doit être défini en tant que long ( pas forcément entier comme indiqué)

ps: le C n'est pas au programme des prépas au cas où tu ne saurais pas.
Bonne chance!
Take a look at your friends. If you don’t think you could pull off a decent white-collar crime together, it’s time to make some replacements..

Marvin45
Messages : 19
Enregistré le : ven. déc. 05, 2014 4:52 pm

Re: Exercices,langage C

Message par Marvin45 » sam. déc. 06, 2014 8:22 pm

Ah oui merci,j'ai oublié les & mince,mais je suivrais tes conseils.
Ah bon,mon profs ne nous a pas expliqué ce que c'est qu'un long,un short ou...
Je ne vois jamais ça dans les programmes qu'on fais en cours ,mais souvent sur le net.

Pour le b) je pensais que le max s'affichait avec : printf(" le maximum est :"%d\n",max); c'est bizarre.
Ce forum est uniquement réservé aux prépas?

Avatar du membre
Taupelvl
Messages : 155
Enregistré le : ven. mai 16, 2014 3:37 am
Localisation : Paris

Re: Exercices,langage C

Message par Taupelvl » sam. déc. 06, 2014 8:32 pm

Marvin45 a écrit :Ah bon,mon profs ne nous a pas expliqué ce que c'est qu'un long,un short ou...

http://www.commentcamarche.net/contents/121-langage-c-les-types-de-donnees
Tu peux utiliser un "long" ou "float" pour définir ta variable M puisqu'elle ne contiendra pas toujours un entier .

Pour le b) je pensais que le max s'affichait avec : printf(" le maximum est :"%d\n",max); c'est bizarre.

en effet, tu n'as pas tort; je précisais juste qu'il fallait d'abord fermer la boucle for, ensuite mettre le printf ( on cherche le max et à la fin on l'affiche mais seulement à la fin).

Ce forum est uniquement réservé aux prépas?

Non,pas du tout, mais je fais la remarque au cas où tu serais en prépa ( ce qui ne semble pas être le cas à priori) ou qu'un taupin passe par ici. ( sisi ça arrive)

Voilà, bonne chance.
Take a look at your friends. If you don’t think you could pull off a decent white-collar crime together, it’s time to make some replacements..

marredeminorer
Messages : 15
Enregistré le : mer. juil. 23, 2014 5:52 am
Classe : MP*

Re: Exercices,langage C

Message par marredeminorer » sam. déc. 06, 2014 10:40 pm

Je pense qu'il y'a aussi une petite erreur dans 1.b :) il faut écrire max=tab[0] après la saisie du tableau :

#include<stdio.h>
void main(){
int tab[6],i,max;
for(i=0;i<6;i++){
printf("Entrer un nombre ");
scanf("%d",&tab[i])}
max=tab[0];
for ( i =1; i<6; i++){
if (tab[i] > max){
max = tab[i];}}
printf(" le maximum est :%d \n",max);
}
2014-2015 : MP*

Marvin45
Messages : 19
Enregistré le : ven. déc. 05, 2014 4:52 pm

Re: Exercices,langage C

Message par Marvin45 » sam. déc. 06, 2014 11:04 pm

Ahh ok,merci beaucoup pour tes conseils Taupelvl et pour ce lien intéressant :)

Yodsanklai
Messages : 90
Enregistré le : ven. nov. 21, 2014 2:37 pm

Re: Exercices,langage C

Message par Yodsanklai » sam. déc. 06, 2014 11:17 pm

Pour moi, c'est hors sujet ici. Je te conseille d'aller plutôt sur un forum d'informatique.

Mais, quelques conseils quand même :
- tes programmes ne compilent pas, ils ne sont même pas syntaxiquement correct. Tu as un outil qui s'appelle un compilateur qui peut déjà vérifier automatiquement que ton programme n'est pas trop faux. Si c'est pour écrire des programmes sur papier, autant faire du pseudo-code
- tes programmes ne sont pas indentés. L'indendation te renseigne en un coup d'oeil sur certaines propriétés du programme, et s'il n'y a pas d'erreur de syntaxe évidentes. Si tu n'indentes pas, tu rends ton programme plus difficile à lire et à comprendre pour tout le monde.

Le C est quand même un mauvais langage pour apprendre la programmation. Je me demande pourquoi certaines fac/écoles s'obstinent à faire ce choix.

Avatar du membre
Taupelvl
Messages : 155
Enregistré le : ven. mai 16, 2014 3:37 am
Localisation : Paris

Re: Exercices,langage C

Message par Taupelvl » dim. déc. 07, 2014 5:13 am

Yodsanklai a écrit :Le C est quand même un mauvais langage pour apprendre la programmation. Je me demande pourquoi certaines fac/écoles s'obstinent à faire ce choix.

C'est un peu hors sujet mais pourquoi ? Je pense au contraire qu'il est beaucoup mieux structuré que certains langages dits 'pédagogiques' type Python et autres où la gestion des types et le contrôle de mémoire laisse quand un peu à désirer. M'enfin c'est un autre débat. Pour clore ce sujet voici un compilateur en ligne ( gratuit) si tu ne voulais pas installer un compilateur :http://ideone.com/
Comme dit plus haut, c'est plus simple de vérifier soit-même si son programme marche ou pas du coup.
Take a look at your friends. If you don’t think you could pull off a decent white-collar crime together, it’s time to make some replacements..

Yodsanklai
Messages : 90
Enregistré le : ven. nov. 21, 2014 2:37 pm

Re: Exercices,langage C

Message par Yodsanklai » dim. déc. 07, 2014 3:10 pm

Taupelvl a écrit :
Taupelvl a écrit :
Yodsanklai a écrit :Le C est quand même un mauvais langage pour apprendre la programmation. Je me demande pourquoi certaines fac/écoles s'obstinent à faire ce choix.

C'est un peu hors sujet mais pourquoi ? Je pense au contraire qu'il est beaucoup mieux structuré que certains langages dits 'pédagogiques' type Python et autres où la gestion des types et le contrôle de mémoire laisse quand un peu à désirer. M'enfin c'est un autre débat.


Il y a pas mal de raisons. En vrac :
- la syntaxe est compliquée. Tout ce qui concerne les pointeurs, et notamment les déclarations (exemple "char * const (*(* const bar)[5])(int )" ). Alors qu'on aimerait une syntaxe consistante du style "type variable". Par exemple int[10] x plutôt que int x[10]. Les opérateurs logiques sont compliqués. Syntaxe du for source d'erreur (on doit écrire 3 fois l'indice de boucle)
- Le typage est faible. Le langage ne protège pas ses propres abstractions. Et beaucoup d'erreur de type ne sont pas détectées par défaut on ne donnent lieu qu'à des warnings que les étudiants ne comprennent pas ou ignorent. Les booléens sont des entiers etc...
- Les pointeurs (et l'arithmétique de pointeurs). Les pointeurs et leur syntaxe sont une grosse source d'erreur en C, et même un débutant y est rapidement confronté comme on le voit ici avec le scanf.
- gestion manuelle de la mémoire source d'erreur.
- ... et plein d'autre chose.

Bref, c'est un langage de bas niveau adapté à certaines applications mais pas à l'apprentissage de la programmation. Mieux vaut privilégier un langage qui dispose d'abstractions de plus haut niveau et qui détecte plus d'erreurs à la compilation. Pascal et Ada sont plus adaptés si on veut faire de l'impératif (et même OCaml d'ailleurs). Python est bien aussi. Le typage est fort, mais dynamique. Donc les erreurs de types sont détectées à l'éxecution, ce qui est un peu moins commode je trouve.

C a sa place, mais dans un deuxième temps, pour des informaticiens. On pourra toujours dire qu'un débutant peut n'utiliser qu'un sous-ensemble du C, mais en pratique, il est très rapidement confronté à des choses un peu compliquées ou perturbantes.

On entend parfois des arguments pro-C avec lesquels je ne suis pas d'accord (notamment des geeks style "42")
- "Le modèle d'exécution du C est plus proche du matériel et du système d'exploitation", donc il faudrait commencer par la pour comprendre les langages de plus haut-niveau.

Les systèmes informatiques sont construits sous forme de "couches" qui permettent justement de s'abstraire du matériel et concevoir des choses de plus en plus compliquées. Il n'y a pas de raison de travailler à un niveau d'abstraction plutôt qu'à un autre. Surtout si ce que l'on veut apprendre ce sont des algorithme et des structures de donnée, je ne vois pas pourquoi il faudrait se contraindre à faire des appels systèmes etc...

- Le langage C est rapide.
Ça aussi c'est anecdotique. D'une part, c'est de moins en moins vrai, et de moins en moins important, et ça ne va pas concerner les débutants en programmation. Un "bon" programme est un programme correct et facile à maintenir, "rapide" est de moins en moins un critère prédominant, et quand c'est le cas, c'est plus une question d'algorithmes utilisés que de langage.

Concernant le controle de la mémoire, il est manuel en C (les structures allouées avec "malloc" sur le tas devraient être libérées pour éviter des fuites de mémoire). Dans la plupart des langages modernes, l'environnement d'execution inclus un ramasse-miette (garbage collector) qui s'en occupe. Sauf cas spéciaux, c'est toujours mieux d'avoir une gestion automatique de la mémoire (pour simplifier l'écriture, la lisibilité, la correction et la maintenance des programme).

Marvin45
Messages : 19
Enregistré le : ven. déc. 05, 2014 4:52 pm

Re: Exercices,langage C

Message par Marvin45 » dim. déc. 07, 2014 5:11 pm

marredeminorer a écrit :Je pense qu'il y'a aussi une petite erreur dans 1.b :) il faut écrire max=tab[0] après la saisie du tableau :

#include<stdio.h>
void main(){
int tab[6],i,max;
for(i=0;i<6;i++){
printf("Entrer un nombre ");
scanf("%d",&tab[i])}
max=tab[0];
for ( i =1; i<6; i++){
if (tab[i] > max){
max = tab[i];}}
printf(" le maximum est :%d \n",max);
}


Effectivement marredeminorer ,tu étais réveillé là,c'est sûr^^,merci en tout cas.

Yodsanklai
Messages : 90
Enregistré le : ven. nov. 21, 2014 2:37 pm

Re: Exercices,langage C

Message par Yodsanklai » dim. déc. 07, 2014 5:44 pm

Marvin45 a écrit :
marredeminorer a écrit :Je pense qu'il y'a aussi une petite erreur dans 1.b :) il faut écrire max=tab[0] après la saisie du tableau :

#include<stdio.h>
void main(){
int tab[6],i,max;
for(i=0;i<6;i++){
printf("Entrer un nombre ");
scanf("%d",&tab[i])}
max=tab[0];
for ( i =1; i<6; i++){
if (tab[i] > max){
max = tab[i];}}
printf(" le maximum est :%d \n",max);
}


Une variante, pas forcément mieux, mais parfois utile (et avec utilisation des balises code).

Code : Tout sélectionner

#include <limits.h>
...
#define SIZE 6   // tjrs mieux de donner un nom aux constantes
...
max = INT_MIN;  // on initialise le max au plus petit int représentable, défini dans limits.h
                          // ça évite de distinguer le cas particulier i = 0
for (i = 0; i < SIZE; i++) { 
   max = (tab[i] > max)?tab[i]:max;   // utilisation de l'opérateur ternaire _ ? _ : _
}

Avatar du membre
fakbill
Messages : 11231
Enregistré le : mer. juil. 30, 2008 4:59 pm
Classe : Dr.-Ing

Re: Exercices,langage C

Message par fakbill » lun. déc. 08, 2014 2:48 pm

Apprendre le C sur papier c'est predre son temps.
Il faut absolument tenter de compiler ses programmes et comprendre les erreurs renvoyées par le compilateur pour progresser.
Soit on fait ca soit on fait du pseudocode. Un truc "sur papier entre les deux" n'a aucun sens.

Le choix du lanage est limite un troll.
****Ca dépend de ce qu'on veut enseigner*****
Si on veux ensegner à qlqn une facon rapide de traiter des données de tous types de facon raisonnable alors python ou matlab ou un truc du genre est un BON choix. http://matplotlib.org/gallery.html#

Si on veut former des gens capable de comprendre comment un system embarqué marche dans le détail et comment, par exemple, python ou un OS simple fonctionne alors là oui il faut faire du C.

Pour ce qui est du typage, python a une approche *pragmatique* (comme toujours avec ce langage) :
Si l'objet passé en paramètre offre les bonnes méthodes alors c'est ok. On se fiche de son type exact. C'Est ce qu'on appelle le "Duck-Typing" et c'est une approche tout aussi valable que les templates à la C++ typé fort.

Pour ce qui est de la gestion de la mémoire c'est pareil : Ca dépend du but. Si on est sur un petit système embarqué, on va vouloir, le plus souvent, avoir une gestion fine de la mémoire. Cependant, on envoie des robots sur mars qui fonctionne avec un sous ensemble de JAVA. L'idée étant qu'on fait plus confiance dans un JRE simple que dans l'humain (+outils pour vérifier) pour gérer la mémoire. Là encore, c'est une question de choix en fonction de ce qu'on veut faire.
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Yodsanklai
Messages : 90
Enregistré le : ven. nov. 21, 2014 2:37 pm

Re: Exercices,langage C

Message par Yodsanklai » lun. déc. 08, 2014 7:58 pm

fakbill a écrit :****Ca dépend de ce qu'on veut enseigner*****


Oui, mais ici on veut enseigner les bases de la programmation. Itérations, instructions conditionnelles, types de données simples. Et pour ça, C est un mauvais langage parce qu'il cumule les difficultés et se situe à un niveau d'abstraction de trop bas niveau. On ne parle pas encore de faire du traitement de données, programmer des compilateurs ou des systèmes embarquées. Ça, ça vient des années plus tard.

Pour ce qui est du typage, python a une approche *pragmatique* (comme toujours avec ce langage) :
Si l'objet passé en paramètre offre les bonnes méthodes alors c'est ok. On se fiche de son type exact. C'Est ce qu'on appelle le "Duck-Typing" et c'est une approche tout aussi valable que les templates à la C++ typé fort.


Enfin la, j'ai l'impression que tu mélanges les concepts. La grosse différence entre Python et C c'est qu'en Python, le typage est dynamique. Autrement dit, les variables n'ont pas de type. Je peux écrire "x = 10", puis "x = [10]". Par contre, les valeurs en ont un. "type(x)" me calcule le type de la valeur dans x, à l'exécution. Inversement, dans un langage typé statiquement comme C, les variables ont un type défini à la compilation. Mais les objets référencés ne conservent pas d'information sur leur type à l'exécution. Cette donnée est effacée par le compilateur.

A coté de ça, le typage peut être faible ou fort. Indépendamment du fait qu'il soit statique ou dynamique. Les 4 combinaisons existent. Python est fort et dynamique, C est faible et statique. (en gros, le typage faible est plus permissif et peut autoriser la compilation de programme potentiellement incorrect).

Et finalement, il y a encore la distinction typage nominal et typage structurel. Dans un cas, l'égalité de type se fait sur leur noms (comme en C ou en Java), ou sur la structure (comme en Caml). Si je ne me trompe pas "duck typing" = typage dynamique structurel.

Avatar du membre
fakbill
Messages : 11231
Enregistré le : mer. juil. 30, 2008 4:59 pm
Classe : Dr.-Ing

Re: Exercices,langage C

Message par fakbill » lun. déc. 08, 2014 8:46 pm

Oui, mais ici on veut enseigner les bases de la programmation. Itérations, instructions conditionnelles, types de données simples. Et pour ça, C est un mauvais langage parce qu'il cumule les difficultés et se situe à un niveau d'abstraction de trop bas niveau. On ne parle pas encore de faire du traitement de données, programmer des compilateurs ou des systèmes embarquées. Ça, ça vient des années plus tard.

On est d'accord que le C est un mauvais langage pour des débutants.
Par contre SI !!! on parle de faire du traitement simple de données. Trouver le max d'un tableau c'est savoir trouver le max dans un jeu de données de la vraie vie...pour peu qu'on sache aussi lire le fichier d'input sans passer deux jours à coder.


Pas la peine de me refaire un cours de typage ;) Je ne vois pas ce qu'il y a de faux dans ce que je dis. Je dis juste que le C (ou le C++) et le python ont deux approches radicalement différentes dans la façon de gérer le typage.

Le duck typing c'est aussi simple que : "on ne vérifie pas le type mais seulement le fait que la méthode invoquée existe au moment". On se fiche le plus souvent du type en python. Ce qui compte c'est ce que l'objet *sait* faire *au moment* où on lui demande de le faire.
Le concept de "strongly typed" n'a pas trop de sens dans le contexte de python. D'ailleurs, wiki le dit très bien :
"The object-oriented programming languages Smalltalk, Ruby, Python, and Self are all "strongly typed" in the sense that typing errors are prevented at runtime and they do little implicit type conversion, but these languages make no use of static type checking: the compiler does not check or enforce type constraint rules. The term duck typing is now used to describe the dynamic typing paradigm used by the languages in this group."
Pas prof.
Prépa, école, M2, thèse (optique/images) ->ingé dans le privé.

Yodsanklai
Messages : 90
Enregistré le : ven. nov. 21, 2014 2:37 pm

Re: Exercices,langage C

Message par Yodsanklai » lun. déc. 08, 2014 11:46 pm

Je ne vois pas ce qu'il y a de faux dans ce que je dis. Je dis juste que le C (ou le C++) et le python ont deux approches radicalement différentes dans la façon de gérer le typage.


Ce n'est pas faux, mais ce que je veux dire c'est que du point de vue d'un débutant qui ne va ni manipuler des templates ou des objets, la différence fondamentale entre ces deux langages est que l'un fait du typage statique et l'autre dynamique. La même différence qu'entre le Scheme et le ML par exemple.

Le duck typing c'est aussi simple que : "on ne vérifie pas le type mais seulement le fait que la méthode invoquée existe au moment". On se fiche le plus souvent du type en python.

Oui. Ce que je voulais préciser c'est que duck typing signifiait deux choses. Que la vérification de type se fait à l'exécution (typage dynamique), donc au moment ou on accède à la valeur ET que d'une certaine façon le typage est structurel et pas nominal (tu ne mentionnes que la deuxieme propriété dans ton message initial). Or ces deux concepts sont orthogonaux. Parce que même dans des langages typés statiquement comme OCaml, tu peux écrire une fonction fun x -> x#a et qui acceptera en parametre n'importe quel objet qui possede un champ a (pas juste les objets qui implémentent une interface de nom donné comme en Java - typage nominal). Sauf que bien sur, en Caml, la verif se fait à la compilation et garantit l'absence d'erreur à l'exécution.

Le concept de "strongly typed" n'a pas trop de sens dans le contexte de python. D'ailleurs, wiki le dit très bien :
"The object-oriented programming languages Smalltalk, Ruby, Python, and Self are all "strongly typed" in the sense that typing errors are prevented at runtime


Euh, j'ai justement l'impression que wikipedia dit exactement que Python est fortement typé.

Si en python tu écris 1 + "hello", il va signaler une erreur à l'exécution. Il va pas s'efforcer à renvoyer une valeur comme le ferait C (ce que j'appelle du typage faible), mais il détecte bien qu'il y a une incompatibilité.

D'ailleurs, je trouve que leur formulation est un peu maladroite quand ils disent "typing errors" are prevented at runtime. Quand Python m'envoie promener avec : TypeError: unsupported operand type(s) for +: 'int' and 'str'
Je ne sais pas trop ce que c'est sinon une "typing error"!!

Répondre

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité