Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercices pour débutants en C

Au menu : zSommeChiffres (nombres, algo)

8 novembre 2008 à 14:00:51

Citation : Jaloyan1

-----------------
  9  -1   2   6  -3   7  10  -8  -4   0  -2   4  -9  -7   8   6   1  -5
 -9  -8  -7  -5  -4  -3  -2  -1   0   1   2   4   6   6   7   8   9  10
 0.000s - 88 permutations, 0 appels

tri my_triselection en cours sur 10000 entiers tries...
 1.265s - 0 permutations, 0 appels


0 permutations?
C'est quoi?
C'est cela qui m'a fait désorienter.


Une permutation c'est tout simplement un échange (swap, ça te dit un truc ?). :)
Un tri par sélection sur un tableau trié ne nécessite pas de permutation (cette propriété dépend justement de l'algorithme).

Citation : Jaloyan1

c'est le même algo, mais pas le même nombre de permutations.


C'est tout à fait normal (et logique). Imagine-toi un tri à bulles sur un tableau non-trié, il y aura des permutations à effectuer. Mais le même algorithme sur un tableau trié n'engendre pas de permutation car lors du parcours du tableau, tous les éléments adjacents seront bien placés. Je ne comprend pas vraiment ton problème, ce fait est logique. :o

Citation : Jaloyan1

et que veut dire les 2 lignes du debuts avec la troisième qui suit?


La première ligne affiche un tableau non-trié. Entre l'affichage de la première et de la deuxième ligne, on tri le tableau avec un tri par sélection. La deuxième ligne affiche donc le tableau après le tri. La troisième ligne, c'est une sorte de "bilan" de ce tri : On affiche son temps d'exécution, les permutations qui ont été nécessaires afin de trier le tableau et le nombre d'appels de la fonction de tri (je vois que yoch ne compte pas le premier appel). En réalité, le nombre d'appels n'est intéressant que pour les tris récursifs (tri rapide, tri fusion, etc...).

Citation : Jaloyan1

pourrais-tu m'envoyer le code source de ce programme pour que je comprenne mieux son fonctionnement?


Regarde ça avec yoch mais de toute manière, je pense que je vais le poster dans la correction étant donné qu'il est très bien fait et qu'il fonctionne. ;)

Je posterais la correction ce soir ou demain. J'ai remarqué que très peu de personne ont participé à cet exercice, je suppose donc qu'il était un peu trop difficile pour les débutants. Le prochain sera un peu plus simple et proposé par Invading. :)
  • Partager sur Facebook
  • Partager sur Twitter
8 novembre 2008 à 15:10:54

Bonjour a tous !
Je visitait les forums de programmations et je vois que, finalement, tout les programmes créés sont tous en console o_O !Pouvez-vous me dire quand on débutera le programme en fenêtre ?

Pouvez-vous me dire quand on débutera le programme en fenêtre ?

Parce que, je suis franchement impatient de savoir quand je vais commencer a programmer en fenêtre :D
Salut a tous ^^

  • Partager sur Facebook
  • Partager sur Twitter
8 novembre 2008 à 15:48:40

Si tu suis les cours du site, les programmes ne mode fenêtre commence en chapitre 3 avec la SDL.
  • Partager sur Facebook
  • Partager sur Twitter
8 novembre 2008 à 16:16:01

ah bon?
Le tableau est déjà trié?
Et où c'est marqué?

Citation : Faedog

Bonjour a tous !
Je visitait les forums de programmations et je vois que, finalement, tout les programmes créés sont tous en console o_O !Pouvez-vous me dire quand on débutera le programme en fenêtre ?

Pouvez-vous me dire quand on débutera le programme en fenêtre ?


Parce que, je suis franchement impatient de savoir quand je vais commencer a programmer en fenêtre :D
Salut a tous ^^



Les programmes en GUI n'ont pas d'intérêt particulier en matière de maitrise du langage, je pense que ce sujet parle avant tout de la bibliothèque standard.

  • Partager sur Facebook
  • Partager sur Twitter
8 novembre 2008 à 17:24:44

Salut,

Crys', l'exercice est terminé?... o_O Je croyais qu'on avait un mois!... :-° Bon, j'ai posté une réponse, mais je pense qu'elle aurait été meilleure avec un peu plus de temps... En tout cas j'attends la suite, l'idée est très bonne...

Sur la difficulté du zTri, l'exercice ne paraissait pas insurmontable, mais je pense que yoch en a effrayé beaucoup... :-°

Si on se contentait de suivre l'énoncé à la lettre, même les débutants pouvaient y arriver... De plus c'était l'occasion d'étudier la notion de complexité d'un algo (il y a un super tutoriel sur le site...).

a++
  • Partager sur Facebook
  • Partager sur Twitter
Zeste de Savoir, le site qui en a dans le citron !
9 novembre 2008 à 14:19:36

Effectivement GurneyH. ;)

Sinon, je précise que l'exercice sera terminé mardi. J'avais prévu de donner la correction de zTri aujourd'hui mais je n'ai pas le temps. o_O Vous pouvez donc encore m'envoyer vos codes.

Et oui, l'exercice est (presque) terminé. Il parait qu'un mois est beaucoup trop long pour des exercices de ce genre, donc j'en fais plusieurs par mois (quatre si possible, donc un par semaine). Qu'à cela ne tienne, vous pouvez très bien vous entraîner à faire les exercices proposés même après leur correction. :)
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2008 à 19:49:41

Titre : zStrcapitalize
N° et mois : 9 Novembre
Sujet : Recoder la fonction strcapitalize

Objectif



Vous devez coder la fonction strcapitalize: elle met en majuscule la premiere lettre d'une phrase, et tout le reste en minuscule. Il y a néanmoins une contrainte: vous devrez recoder toute fonctions utilisees, donc choisissez les bien :p

Voici une serie d'exemple, regardez les bien:

"saLut les zeRos."

Salut les zeros.


"iL Y a 3mOts."

Il y a 3mots.


"PLOP               aux zEros."

Plop               aux zeros.



Precision de derniere minute: write n'est pas a recoder (quand meme ^_^ )
C'est un exo relativement facile, amusez-vous =)
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2008 à 20:03:11

Citation : Invading

vous devrez recoder toute fonctions utilisees



Y compris printf ?
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2008 à 20:17:40

Si tu tiens a l'utiliser, oui ;) mais on peut largement faire sans.

char *strcapitalize(char *tab);


Le prototype de la fonction ^^
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2008 à 20:45:38

Au temps pour moi, j'ai mal lu l'enoncé...

A part ça, tu devrais peut-être utiliser les balises de code pour encadrer les phrases originales, parce que les espaces successifs ont été supprimés dans
PLOP               aux zEros.
  • Partager sur Facebook
  • Partager sur Twitter
9 novembre 2008 à 21:04:40

Ah, exact, je n'avais pas vu, voila qui est fait. Vous pouvez me MP si vous avez des questions =)
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 0:45:23

:o:oo_Oo_O
recoder la fonction printf ?? vous etes sur que l'exo est fait pour les debutants ?
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 0:54:06

tu as mal compris la fonction n'est pas censé afficher quoi que ce soit, elle doit juste mettre la premier lettre de chaque phrase en maj et les autre en min, mais pas afficher le texte ;)
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 0:58:11

Recoder printf... C'est un exercice donné à la "piscine" (période d'intégration) à EPITECH, en première année, et je ne pense pas que ça soit de toute première facilité. Il faut chercher du côté de la fonction write. Mais bon courage... :-°
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 1:06:20

Citation : Eusebus

Recoder printf... C'est un exercice donné à la "piscine" (période d'intégration) à EPITECH, en première année,



Heu, vu la complexité de la fonction, je doute que les élèves (sauf exceptions) parviennent à doder cette fonction de manière conforme à la norme (il suffit que je regarde l'implémentation de Plauger de la dite fonction pour etre convaincu qu'il s'agit d'un exercice de C d'une grande difficulté).


Citation : Eusebus

Il faut chercher du côté de la fonction write.


Pas de chance, ce n'est pas une fonction standard, on ne va donc pas comparer ...
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 1:13:44

Ben pourtant ils le font bien... Ok, je me suis trompé, il ne le font pas pendant la piscine mais trois mois après la rentrée... Si tu ne me crois pas, regarde ici : Lien

En ce qui concerne le write, c'est un ami qui vient d'y rentrer qui m'en a parlé. Peut-etre ai-je mal retranscrit ses propos, si c'est le cas mille excuses. :(
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 1:47:21

Et puis quitte à pousser le vice à l'extrême, si on recode printf en utilisant write, il faut peut-être aussi recoder write derrière...

Enfin bref, ca n'a pas d'importance puisqu'il n'y a pas de printf a écrire dans cette fonction.
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 1:50:08

En effet. :)

Ca ferait un exercice relativement complexe et donc inadapté pour ce topic. Mais ça doit être formateur, néanmoins... (ou comment réinventer la roue :lol: )
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 7:47:27

IL n'y a pas de problèmes à réinventer la roue... tant qu'on ne le fait qu'une fois pour comprendre comment marche la dite roue ;)
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 8:10:12

Citation : mcyrb

Et puis quitte à pousser le vice à l'extrême, si on recode printf en utilisant write, il faut peut-être aussi recoder write derrière...

Enfin bref, ca n'a pas d'importance puisqu'il n'y a pas de printf a écrire dans cette fonction.



En gros, le titre de l'exercice sera zOS
coder un OS, avec sa lib standard, on mettra un cahier des charges de 50 pages environ ^^

mais on doit vraiment recoder touper et tolower?

On peut utiliser des bibliothèques non standard que l'on a codé avec quelque autres personnes?
Car je trouve cela un peu chiant.
Déjà on a fait deux fonctions qui mettent des phrases et des lettres en majuscules/minuscules.
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 9:46:23

Vous enflammez pas, rien de difficile. Ne recoder pas write, ca sera deja beaucoup plus simple ;)

A vous ensuite de vous amusez a recoder ce que vous voulez. Y a rien de difficile honnetement =)

@Jaloyan1: du moment que vous ne faites pas appel a une fonction systeme (sauf write), tu fais ce que tu veux, du moment que ça marche ^^
@Eusebus: ton ami a bien dit: write peut être utilise. (Et Printf on le fait vers decembre =) )

  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 13:21:39

Oui, c'est ce qui est indiqué sur le lien que j'ai mis pour justifier mes propos... "19/12/2003"... :p

Toi aussi apparemment tu as eu droit aux joies de la moulinette ! :lol:
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 19:40:15

Citation : Invading


Vous devez coder la fonction strcapitalize: elle met en majuscule la premiere lettre d'une phrase, et tout le reste en minuscule. Il y a néanmoins une contrainte: vous devrez recoder toute fonctions utilisees, donc choisissez les bien :p

Precision de derniere minute: write n'est pas a recoder (quand meme ^_^ )
C'est un exo relativement facile, amusez-vous =)


Citation : Invading

char *strcapitalize(char *tab);



Le prototype de la fonction ^^


Citation : Invading

@Jaloyan1: du moment que vous ne faites pas appel a une fonction systeme (sauf write), tu fais ce que tu veux, du moment que ça marche ^^


Pourquoi faire write (même pas standard), si la fonction retourne un pointeur sur chaine ? Et qu'appelles tu fonction système ?
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
10 novembre 2008 à 19:48:00

L'imite on fait avec les paramètres indéterminés.
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 20:28:44

bonjour à tous,
pour ma part je trébuche sur le tri a insertion. Je vous envoie mon code

Le main :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "fonctiontableau.h"
#define dim 10



int main()
{

    double tab[dim];

    fonction(tab,dim); // pour remplir le tableau
    affiche(tab,dim);
    timing();
    //triComparaison(tab,dim);
    //triBulle(tab,dim);
    triInsertion(tab,dim);
    timing();
    affiche(tab,dim);

    return 0;
}


fonctiontableau.h
#ifndef FONCTIONTABLEAU_H_INCLUDED
#define FONCTIONTABLEAU_H_INCLUDED

void timing();
void affiche (double tab[] , long tailletab);
void fonction( double tab[], long tailletab);

void triComparaison(double tab[],long tailletab);
void triBulle(double tab[],long tailletab);
void insertionElement(double tab[],long tailletab,long position,double elementAinserer);
void triInsertion(double tab[],long tailletab);


#endif // FONCTIONTABLEAU_H_INCLUDED



fonctiontableau.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

#define bool int
#define vrai  1
#define faux 0


void timing()
{
    time_t timestamp;
    struct tm * t;

    timestamp = time(NULL);
    t = gmtime(&timestamp);
    // t ->tm_hour equivalent à (*t).tm_hour
    printf(" \n %02uh %02umin %02usec\n", t->tm_hour, t->tm_min, t->tm_sec);


}



void affiche (double tab[] , long tailletab)
{
    long i;
    for (i=0;i<tailletab;i++)
    {
        printf ("%lf \n",tab[i]);
    }
    printf("\n");
}


void fonction( double tab[], long tailletab)
{
    long i;
    tab[0]=-1;
    for (i=1;i<tailletab;i++)
    {
        tab[i]=-i*tab[i-1];
    }
}



void triComparaison(double tab[],long tailletab)
{
    int i,j;
    double temp;
    int Nbre_Comparaison=0;
    int Nbre_Echange = 0;
    for (i=0;i<tailletab;i++)
    {
        for (j=i;j<tailletab ;j++)
        {
            Nbre_Comparaison ++;
            if  ( tab[i] > tab[j] )
            {
                temp=tab[i];
                tab[i]=tab[j];
                tab[j]=temp;
                Nbre_Echange ++;
            }

        }

    }
    printf(" \n %d Comparaisons \n",Nbre_Comparaison);
    printf(" \n %d Echange \n",Nbre_Echange);



}
void triBulle(double tab[],long tailletab)
{

    int i;
    bool EnOrdre;
    long temp;
    int Nbre_Comparaison=0;
    int Nbre_Echange = 0;

    while(EnOrdre != vrai)
    {
        EnOrdre = vrai;
        for( i=0 ; i < tailletab ; i++)
        {
            Nbre_Comparaison ++;
            if(tab[i] > tab[i+1])
            {
                temp=tab[i];
                tab[i]=tab[i+1];
                tab[i+1]=temp;
                EnOrdre = faux;
                Nbre_Echange ++;
            }
        }
    }
    printf(" \n %d Comparaisons \n",Nbre_Comparaison);
    printf(" \n %d Echange \n",Nbre_Echange);

}


void insertionElement(double tab[],long tailletab,long position,double elementAinserer)
{
    long i;
    for (i=tailletab-1; i>=position ; i--)
    {
        tab[i]=tab[i-1];
    }
    tab[i]=elementAinserer;

}

void triInsertion(double tab[],long tailletab)
{
    long i,j,positionMin,valeurMin,temp ;

    for(i=0 ; i<tailletab ; i++)
    {
        positionMin = i;
        valeurMin = tab[i];
        for (j=i ; j < tailletab ; j++)
        {
            if (valeurMin < tab[j])
            {
                temp=valeurMin;
                valeurMin=tab[j];
                tab[j]=temp;
                positionMin=j;
            }

        }
        printf("\n tour %ld\n",i);
        affiche ( tab , tailletab);

        insertionElement(tab,j,positionMin,valeurMin);

        printf("\n tour %ld\n",i);
        affiche ( tab , tailletab);
    }

}


si quelqu'un peut m'aider
merci




  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 20:31:00

Merci, pour ce topic cela me permettra de pratiquer avant de me lancer dans un projet ...
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 20:39:46

Citation : yoch

Pourquoi faire write (même pas standard), si la fonction retourne un pointeur sur chaine ?


Invading a sans aucun doute poster un prototype à titre d'exemple, c'est en effet une manière de procéder mais si vous avez mieux (il existe toujours mieux ^^ ), vous faites mieux, en même temps, c'est un exercice, donc si vous n'y arrivez pas, essayez encore et regardez la correction.

Citation : MorderX

Merci, pour ce topic cela me permettra de pratiquer avant de me lancer dans un projet ...


(Merci) C'est en effet une bonne stratégie. :)

  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 20:49:26

En fait, j'appelle fonction system toutes les fonctions des lib officielles (genre printf, etc etc). Vous voulez utiliser strlen? Recoder le, vous voulez recoder islowcase? Bah recodez le =)

Vous faites ce que vous voulez, le prototye que vous voulez, du moment que vous recoder les fonctions utilises (sauf write).
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 20:54:26

Citation : Invading

En fait, j'appelle fonction system toutes les fonctions des lib officielles (genre printf, etc etc). Vous voulez utiliser strlen? Recoder le, vous voulez recoder islowcase? Bah recodez le =)

Vous faites ce que vous voulez, le prototye que vous voulez, du moment que vous recoder les fonctions utilises (sauf write).



tu te fous de nous?

Ah bon comment ça non?

Bon je sors.
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2008 à 21:03:18

Ok erreur : Invading, printf n'est en aucun cas une fonction dite "system". (Vous lui pardonnez ça :p )

Jaloyan1 : je ne comprend pas trop ta réaction : réécrire strlen est un jeu d'enfant, idem pour isupper ou islower. Il faut juste aller jeter un coup d'œil à la table ASCII et c'est codé en deux temps trois mouvements. Vraiment, cet exercice est simple et très utile (manipulation de char et de tableau de char), l'idée n'est pas de moi mais bien du posteur (Invading). ;)
Cet exercice vous permet donc, comme dit précédemment, de vous entraîner à la manipulation du type char mais aussi, ne l'oublions pas, de vous familiariser avec la norme ASCII. Que demander de plus ? Si l'auteur de l'exo vous autorisait à utiliser les fonctions de ctype.h, bah, cela n'a plus rien d'un exercice, on est d'accord.
  • Partager sur Facebook
  • Partager sur Twitter