J'ai besoin d'aide en language C.

  • Auteur de la discussion orchideor
  • Date de début

orchideor

Nouveau membre
Salut;
Je desire savoir comment pourrais je réaliser une courbe en C, en fait le professeur nous a demandé de faire une courbe qui retrace la rapidité de chaque méthode de tris .

Tout ce qui se rapporte à l'utilisation de la fonction Time et de la réalisation d'une courbe me sera du plus grand soutient.

Merci d'avance pour l'interêt que vous porterez à ce message .
 

shidosh

Habitué
Je pense que ton prof veux que tu vois par toi même que le temps de certains algo de tri peuvent être sous la forme d'une coube (log) et non pas une droite.
Je suppose que tu as déjà vu différents algo de tri

Ensuite pour ton expérience, il faut regarder des tableaux de tailles différentes par exemple, de taille 10, 20, 50, 100, 200, 500, 1000, 2000, 5000 ....
Mais le placement des éléments joue bcp ds le temps de résolution de l'algo, c'est pourquoi tu devras le faire pour trois type de tableaux:
- Trié [1, 2, 3, 4, ... ,n]
- Trié décroissant [n, n-1, n-2, ..., 2, 1]
- Random[20,56, 23, 1, ... ,12]

Ensuite, le mieux est de regardé le temps d'exécution pour chaque tableau, en suivant la base de code (écrite plus bas) ou tu prend le temps avant et après l'exécution pour estimer le temps à résoudre le tri.

Au final, tu auras le temps pour chaque tri différents et chaque tableau initial (trié, inversé, random) (axe y) en fonction des tailles (axe x).

Pour faire les courbes, je te conseil gnuplot.

Mais fait déjà ton code avec l'écriture ds un fichier de résultat, c'est déjà pas mal :p

[cpp]
// Include pour prise de temps
#include <sys/time.h>

int toto(){

//tu déclares 2 strructures de type timeval
// ti pour temps initial
// tf pour temps final
struct timeval ti,tf;

//tu prend le temps avant l'algo
gettimeofday(&ti,NULL);

/* Algo de tri*/

//tu prend le temps apres l'algo
gettimeofday(&tf,NULL);

//Tu écris le résultat ds le fichier descfp que tu auras crée avant
fprintf(descfp,"Sampling time : %f micro-seconds\n", ((double) ((tf.tv_sec-ti.tv_sec)*1000000 + (tf.tv_usec-ti.tv_usec))));
}
[/cpp]
 

orchideor

Nouveau membre
Je te remercie Shidosh pour toutes tes clarifications , cela m'a été du plus grand aide , je vais commencer comme tu me l'as conseillé par faire les executions que tu m'as joind , mais il reste que je ne sais comment je pourrais créer le fichier descfp?
 

orchideor

Nouveau membre
Voila mon programme , j'ai suivie les instructions mais je crois que j'ai des fautes , pourriez vous me corriger .
merci




#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<dos.h>
#define taille 10000
#define true 1
#define false 0
#include <sys/time.h>
int tab [taille];
int N;
int i;

struct timeval{float ti;
float tf;
};
gettimeofday(&ti,NULL);
int saisie_al(void)
{
randomize();
printf("donner le nombre des element de tableau N ");
scanf("%d",& N);
for(i=0;i<N;i++)
tab=random(100);
return tab;
}
gettimeofday(&tf,NULL);
gettimeofday(&ti,NULL);
void tri_shell(int tableau[],int longueur)
{
int n, i, j, valeur;

n=0;

while(n<longueur)
{
n=3*n+1;
}

while(n!=0)
{
n=n/3;
for (i=n;i<longueur;i++)
{
valeur=tableau;
j=i;

while((j>(n-1)) && (tableau[j-n]>valeur))
{
tableau[j]=tableau[j-n];
j=j-n;
}
tableau[j]=valeur;
}
}
}
gettimeofday(&tf,NULL);
gettimeofday(&ti,NULL);
void tri_insertion(int tab[],int n)
{
int i, memory, j, marqueur;

for(i=1;i<n;i++)
{
memory=tab;
j=i-1;

do
{
marqueur=false;
if (tab[j]>memory)
{
tab[j+1]=tab[j];
j--;
marqueur=true;
}
if (j<0) marqueur=false;
}
while(marqueur);
tab[j+1]=memory;
}
}gettimeofday(&tf,NULL);
void echanger(int tab[], int i, int j)
{
int memoire;
memoire=tab;
tab=tab[j];
tab[j]=memoire;
}


int partition(int tableau[], int deb, int fin)
{
int compt=deb;
int pivot=tableau[deb];
int i;

for(i=deb+1;i<=fin;i++)
{
if(tableau<pivot)
{
compt++;
echanger(tableau,compt,i);
}
}
echanger(tableau,compt,deb);
return(compt);
}
void tri_rapide_bis(int tableau[],int debut,int fin)
{
if(debut<fin)
{
int pivot=partition(tableau,debut,fin);
tri_rapide_bis(tableau,debut,pivot-1);
tri_rapide_bis(tableau,pivot+1,fin);
}
}
gettimeofday(&ti,NULL);
void tri_rapide(int tableau[],int longueur)
{
tri_rapide_bis(tableau,0,longueur-1);
}gettimeofday(&tf,NULL);

saisie()
{
do
{
printf("Donner le nombre d'elements a trier");
scanf("%d",&N);
}
while ( (N<=0) && (N>taille) ); /*taille de test*/
for ( i=0 ;i<N ; i++)
{
printf("Donner un entier");
scanf("%d",&tab);
}
return true;
}
menu()
{
int choix;
printf("\n\ntaper 1 pour saisir\n");
printf("taper 2 pour saisie aleatoir \n");
printf("taper 3 pour affichage \n");
printf("taper 4 pour bulle1 \n");
printf("taper 5 pour bulle2 \n");
printf("taper 6 pour tri_insertion \n");
printf("taper 7 pour tri_shell \n");
printf("taper 8 pour tri rapide \n");
printf("taper 9 pour quitter \n");
scanf("%d", & choix );
return choix;
}
affichage()
{
for ( i=0 ; i<N ; i++)
printf("%d \t",tab);

}gettimeofday(&ti,NULL);
void bulle1 ()
{
int aux,j ;
for ( j=0 ; j<N; j++ )
for ( i=N-1 ; i>=j+1 ; i-- )
if ( tab<tab[i-1] )
{
aux=tab;
tab=tab[i-1];
tab[i-1]=aux;
}
}gettimeofday(&tf,NULL);
gettimeofday(&ti,NULL);
void bulle2 ()
{
int aux ,drapeau,j=0;
do
{
drapeau=false ;
for (i=N-1 ; i>=j+1 ; i-- )
if ( tab<tab[i-1] )
{
aux=tab;
tab=tab[i-1];
tab[i-1]=aux;
drapeau=true;
}
j++ ;
}
while (j<N-1 && drapeau==true);
}gettimeofday(&tf,NULL);
main()
{
int rep ;


do{
rep=menu();

switch(rep)
{
case 1 : saisie ();break;
case 2 : saisie_al();break;
case 3 : affichage ();break;
case 4 : bulle1 ();break;
case 5 : bulle2 ();break;
case 6 : tri_insertion(tab,N); break;
case 7 : tri_shell(tab,N);break;
case 8 : tri_rapide(tab,N);break;



}
}
while(rep!=9);
}
 

shidosh

Habitué
Je corrige ça demain apreme apres mon boulot :p
Il y a quelques erreurs en effet :)
 

shidosh

Habitué
Explique moi clairement ce que tu veux faire? tu veux comparer des temps pour une taille donnée?
Il y a bcp d'erreur dans ton programme car tu fais passer par exemple des tableaux dans tes fonctions alors qu'il n'y a pas besoin de la faire vu que ton tableau est static. si tu veux passer un tableau en paramètre, tu dois utiliser des pointeurs.

Je peux te modifier ton programme (sans toucher à tes algo de tri) pour faire en sorte que tu es un fichier de ce type:

#Algo tri par bulle
10 2
20 6
50 8
100 12
200 26
500 46
1000 68
2000 90
5000 120

Avec le nom de l'algo, le nombre d'élément ds le tableau et le temps qu'il a fallu pour le trier.

Mais es tu sous Linux ou Windows?
 

zeb

Modérateur
( Avant de publier du code, lire les règles et les appliquer s'il vous plaît )
 

orchideor

Nouveau membre
Je désire comparer le temps que fait chaque algo de tri pour une taille donnée , en ce qui concerne le programme des algo il est juste , je lai compilé et executé, le problème réside dans les autres instructions ; je ne sais ou ni comment les utiliser.
Pour les pointeurs je ne dois les utiliser cet exercice ne doit pas les comporter ,Linux je ne suis pas encore arrivée à ce stade .
je nai pas compris lalgo de tri par bulle que tu as ecris ,le premier chiffre est pour?et le deuxième.
merci encore shidosh pour toute ton aide.
 

boub popsyteam

Grand Maître
MErci d'editer ton post precedent et de rajouter les balises CODE (bouton CPP dans l'editeur)
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 136
Messages
6 718 120
Membres
1 586 398
Dernier membre
mookie767
Partager cette page
Haut