Exercice de la piscine 42: afficher l'alphabet

Exercice de la piscine 42: afficher l'alphabet - C - Programmation

Marsh Posté le 22-05-2017 à 16:40:47    

Bonjour tout le monde, voila je commence a apprendre le C, mais comme je l'apprend seul, en regardant des videos sur youtube je progresse pas trop.
Bon je suis encore vraiment debutant, du coup je me suis dis, que j'allais essayer de faire les exercices de l'ecole 42.
Probleme, je bloque des le premier niveau en faite !
Voici la consigne:
 
Fichiers à rendre : ft_print_alphabet.c
Fonctions Autorisées : ft_putchar
• Écrire une fonction qui affiche l’alphabet en minuscule sur une seule ligne, dans
l’ordre croissant, à partir de la lettre ’a’.
• Elle devra être prototypée de la façon suivante :
void ft_print_alphabet(void);
 
Et c'est la que je comprends pas avec le besoin d'etre prototypée...  
Deja ça veut dire quoi et ça sert a quoi ?
Parce que logiquement on utilise tout simplement putchar et hop ça affiche l'alphabet non ?

Code :
  1. #include <stdio.h>
  2. int main ()
  3. {
  4.    char ch;
  5.    for(ch = 'A' ; ch <= 'Z' ; ch++)
  6.    {
  7.       putchar(ch);
  8.    }
  9.  
  10.    return(0);
  11. }


 
Mais du coup, faut virer int main () par => le prototype qu'on nous demande non ? ça: void ft_print_alphabet(void);
 
Mais resultat, chez moi ça ne compile plus du coup !


---------------
http://forum.hardware.fr/hfr/Achat [...] 4112_1.htm
Reply

Marsh Posté le 22-05-2017 à 16:40:47   

Reply

Marsh Posté le 22-05-2017 à 18:23:05    

Bonjour !  
 
Je pense qu'ils veulent que vous créiez une fonction "ft_print_alphabet(void)" qui imprime l'alphabet, que vous appellerez depuis le main.
 
Tout bêtement.
 
Définir le prototype, c'est décider, dans ce cas, que la fonction ne prend aucun paramètre et ne renvoie rien.
 
Quel est l'intérêt ? Je pense, en lisant l'exercice, que dans leur module de test, ils ne donnent que le fichier "ft_print_alphabet.c" qui ne contient que cette fonction et que le "main" est fourni par ailleurs (leur module de test) => Pour que cela compile il faut que les deux parties soient d'accord sur le prototype de la fonction.
 
Bonne continuation.


---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 23-05-2017 à 21:12:42    

Très bonne initiative que de vouloir apprendre à coder en C.
 
Le prototype d'une fonction définit le type de valeur de retour ainsi que les paramètres et leur types que reçoit la fonction.
 

Code :
  1. void ft_print_alphabet(void);


 
Dans le langage C, les fonctions doivent être déclarées avant que l'on puisse les appeler. En général, cela se fait dans les fichier d'entête (.h).
 
Pour débuter, tu peux simplement la déclarer avant son appel par la méthode main().
 

Code :
  1. #include <stdio.h>
  2. void ft_print_alphabet(void);
  3. int main ()
  4. {
  5.         ft_print_alphabet();
  6.         return(0);
  7. }
  8. void ft_print_alphabet()
  9. {
  10.         char ch;
  11.         for(ch = 'a' ; ch <= 'z' ; ch++)
  12.         {
  13.                  putchar(ch);
  14.         }
  15. }


 
 
 

Reply

Marsh Posté le 24-05-2017 à 00:02:14    

Bonjour, merci pour votre aide mais en faite ce que je ne comprends pas c'est donc, qu'on est d'accord qu'en C il nous faut toujours ceci en debut:

Code :
  1. int main ()


 
Et pourtant quand je regarde les codes des etudiants de 42 eux ne le mettent jamais !
Voici un exemple:

Code :
  1. int  ft_putchar(char c);
  2. void ft_print_alphabet(void)
  3. {
  4. int letter;
  5. letter = 'a';
  6. while (letter <= 'z')
  7. {
  8.  ft_putchar(letter);
  9.  letter++;
  10. }
  11. }


 
Mais pourtant l'etudiant qui l'a fait quand il l'a rendu il a du verifier que ça compile non ?
Donc du coup si on ne mets pas int main () on est d'accord que ça ne compile pas ?
Ou alors ils utilisent un système non standard ou je ne sais quoi ?


Message édité par raiden5002 le 24-05-2017 à 00:02:59

---------------
http://forum.hardware.fr/hfr/Achat [...] 4112_1.htm
Reply

Marsh Posté le 24-05-2017 à 00:29:13    

Citation :

qu'on est d'accord qu'en C il nous faut toujours ceci en debut:

Oui et Non, c'est un peu compliqué.

 

Un logiciel écrit en C sera souvent composé de plusieurs fichiers .c histoire de mettre un peu d'ordre (genre pour un logiciel de simulation de physique p.ex. un fichier .c pour le code en rapport avec l'interface graphique, un fichier pour la partie simulation, un fichier pour des fonctions mathématiques utilisés, ...) et pour ne pas avoir un seul fichier énorme (des gros logiciels ça peut être des centaines de milliers de lignes de code!). Un seul fichier dans le projet doit contenir la fonction main().

 

Quand on lance le compilateur (p.ex. GCC ou celui de Microsoft dont j'ignore le nom) il se passe en réalité plusieurs choses avec plusieurs logiciels qui forment la "toolchain" (mais comme tout est automatique - heureusement - on ne le remarque généralement pas à moins de savoir quoi chercher). Ce qui est important c'est que chaque fichier .c est traité séparément et transformé dans une espèce de fichier code machine intermédiaire (peu importe). Cette étape est la compilation en soit et elle est possible pour tout fichier .c avec une syntaxe valide, peu importe si il y a une fonction main() ou pas. Ensuite un logiciel appellé "Linker" (ne regarde pas ça sur internet, ça va t'embrouiller, c'est horriblement compliqué dans les détails mais il n'est pas nécessaire de s'y connaître grandement puisque c'est automatique) va prendre les différents fichiers intermédiaires et en faire un exécutable. Cela est possible uniquement si il existe une et une seule fonction main() quelque part dans un des fichiers .c. Par convention (c'est standardisé quelque part) quand Windows/Linux lance un programme il va lancer la fonction main().

 

Autrement dit: On peut compiler du code .c sans main(), mais on n'obtiendra pas d'exécutable (par contre ça permet de vérifier la syntaxe du code). Si on veut un exécutable il faut forcément une fonction main(). Soit les étudiants dont tu parles n'exécutent pas leur code soit il ne donnent simplement pas leur code complèt. Car bien sûr on peut très bien mettre tout son programme dans une fonction xy() et la fonction main() ne fera rien d'autre qu'appeller cette fonction (et retourner 0 à la fin), dans ce cas le code de la fonction main() n'est pas très intéressant et certains ne le donneront donc pas. (Je dis pas que c'est une bonne méthode mais c'est possible).

 

Ah, pourquoi tout ce bazar avec chaque fichier .c compilé séparément? Cela est très utile dans les gros projets. En cas de modification du code il ne faudra recompiler que les fichiers .c qui ont été modifiées, pour les autres on pourra réutiliser le fichier intermédiare correspondant pour l'étape suivante, à savoir produire un exécutable. Pour des projets de quelque lignes cela n'a aucune importance, par contre pour un projet avec 100.000 lignes le temps de compilation peut baisser énormément!

 

Bon, j'espère que je ne t'ai pas embrouillé d'avantage qu'avant. :o

 

edit: L'exemple de solution que tu donnes n'est pas génial, passer un int à une fonction qui prend un char peut créer des problèmes (il y a "moins de place" dans le char que dans le int). Je ne vois aucune raison de ne pas déclarer letter en char.


Message édité par rat de combat le 24-05-2017 à 00:32:57
Reply

Marsh Posté le 24-05-2017 à 00:37:30    

Euuuuuuuh baaaah merci :D :D
Je pense que je vais relire ton message 3-4 voir une 10ene de fois pour tout bien tout comprendre hein  :pt1cable:  
Mais merci c'est super complet en tout cas :)
 
Du coup je me demande un truc, si je recupere leurs source sans le int main() et que je le rajoute moi même ça devrait fonctionner non  :D ?
 
En tout cas grand merci pour le long message si bien expliqué :)


---------------
http://forum.hardware.fr/hfr/Achat [...] 4112_1.htm
Reply

Marsh Posté le 24-05-2017 à 00:52:32    

raiden5002 a écrit :

Du coup je me demande un truc, si je recupere leurs source sans le int main() et que je le rajoute moi même ça devrait fonctionner non  :D ?


Exact, mais il faut bien sûr appeller "leur" fonction principale depuis ta main. Genre

Code :
  1. int main(void)
  2. {
  3.     ft_print_alphabet(); //appeller la fonction qu'on veut
  4.    
  5.     return 0; //indiquer "pas d'erreur" au système d'exploitation
  6. }


(par contre si t'as pas le code pour ft_putchar() l'exemple que tu donnes ne tournera pas ou pour m'exprimer correctement tu pourras le compiler mais tu n'auras pas d'exécutable car le fameux Linker va râler :sweat: )
 
(Concernant le return 0: Par convention (la encore c'est standardisé) la fonction main retourne un int, donc il faut mettre un return à la fin. Si on ne met rien le programme va certes quand même tourner mais c'est une erreur dans le code!)

Reply

Marsh Posté le 24-05-2017 à 12:02:12    

D'accord merci beaucoup :)
Je comprends mieux tout ça :)
Je vais continuer les exercices :)


---------------
http://forum.hardware.fr/hfr/Achat [...] 4112_1.htm
Reply

Marsh Posté le 25-12-2017 à 21:13:49    

Pour t'aider tu as (openclassroom) https://openclassrooms.com/courses/ [...] ons-outils  (une suite de cours gratuit) qui est pas mal quand on débute. Je pense que ça sera plus efficace que les vidéos youtube.

 


Message édité par Zilak le 25-12-2017 à 21:14:14
Reply

Marsh Posté le 22-01-2020 à 11:39:51    

Je suis un peu a la bourre mais si y’a pas de main dans les exos des eleves de 42 c’est parce que tu doit juste rendre une fonction, pas un programme.

Reply

Marsh Posté le 22-01-2020 à 11:39:51   

Reply

Marsh Posté le 22-01-2020 à 13:14:41    

KiwiPoilu a écrit :

Je suis un peu a la bourre mais si y’a pas de main dans les exos des eleves de 42 c’est parce que tu doit juste rendre une fonction, pas un programme.


3 ans après, oui, effectivement, t'es un peu à la bourre. T'as le sens de l'euphémisme  :whistle:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 02-02-2020 à 08:26:30    

KiwiPoilu a écrit :

Je suis un peu a la bourre mais si y’a pas de main dans les exos des eleves de 42 c’est parce que tu doit juste rendre une fonction, pas un programme.


 
salut  
en lisant ton message j'en ai deduit que tu as deja fait la piscine 42 .
Etant inscrit pour la piscine de juillet 2020 j'aimerais beaucoup avoir ton retour d'experience .
Merci

Reply

Marsh Posté le 05-11-2020 à 19:15:24    

tellyou a écrit :


 
salut  
en lisant ton message j'en ai deduit que tu as deja fait la piscine 42 .
Etant inscrit pour la piscine de juillet 2020 j'aimerais beaucoup avoir ton retour d'experience .
Merci


Yo, je t'ai repondu en mp désolé pour le retard je n'avais point vu ton message :D

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed