int main(int argc, char **argv) { int n, k; double pas; double *x, *y, *x0, *x1, *tmp; struct info_t info; const char *donnees = argv[1]; /* le fichier des donnees bruitees */ n = atoi(argv[2]); /* nombre de donnees bruitees */ pas = 1./n; init_info(n, &info); x = (double*)malloc((n+2)*sizeof(double)); y = (double*)malloc((n+2)*sizeof(double)); lire_fichier(donnees, x, &info); x0 = x; x1 = y; for( k = 1 ; k <= KMAX ; k++ ) { lissage(x0, &info, x1); tmp = x0; x0 = x1; x1 = tmp; } ecrire_fichier("lissage.txt", x0, &info); free(x); free(y); return 0; }
int main() { Personne P; P=saisie(P); ecrire_fichier(P); return 0; }
int main() { char path_fichier[100] ; // adresse du fichier a lire char path_fichier_ville[100]; // adresse du fichier de villes FILE *fp_ville; // fichier de villes FILE *fp_origine_html; // fichier donne map.html FILE *fp_new_html; // fichier cree map.html pour l'option 1 FILE *fp_new_html_2; // fichier cree map.html pour l'option 2 FILE *fp_new_html_3; // fichier cree map.html pour l'option 3 int x=0; //nombre de villes a afficher int i=0; //compteur int nombre_de_ville=0;//le nombre de ville du fichier int limite=0; // limite de parcours de l'avion int No_de_ville_X; //Ville_X int No_de_ville_Y; //succeseur de X float *table_distance; //tableau des distances dans DIJKSTRA int *table_marque; //tableau des marques dans DIJKSTRA int *table_pere; //tableau des peres dans DIJKSTRA float *table_prim_distance; //tableau des distances dans Prim int *table_prim_marque; //tableau des marques dans Prim int *table_prim_pere; //tableau des peres dans Prim int No_de_depart=0; //numero de la ville de depart int No_de_dest=0; //numero de la ville de destination Ville *ville; //tableau des villes Ville depart; //ville de depart Ville dest; //ville de destination int N; //le numero demonstre les N plus grandes villes pour afficher aerien couvrant Ville *x_plus_grand_villes; //les x plus grandes villes char choix_menu; // caractere pour choisir dans le menu char command1[100]; //commande pour utiliser la commande systeme char command2[100]; //commande pour utiliser la commande systeme char Continue_encore[100]; //caractere pour continuer le menu int trouvee=0; //valeur pour trouver la ville do{ do { //menu printf("\n\nBIENVENUE DANS LE PROGRAMME D'UTILISATION DES DONNEES GEOLOCALISES DU GROUPE 5: DILI5 (地理)\n\n\n\t\tMENU PRINCIPAL:\n\n\t"); printf("Veuillez choisir l'option que vous désirez réaliser:\n\n\n"); printf("1: Afficher les X plus grandes villes sur google map\n\n2: Calculer le plus court chemin entre deux villes\n\n3: Calculer l'arbre aérien recouvrant minimal\n\n"); scanf("%c",&choix_menu); if (choix_menu != '1' && choix_menu != '2' && choix_menu != '3') printf("entrez une option valide ! "); }while(choix_menu != '1' && choix_menu != '2' && choix_menu != '3'); //lire fichier_ville printf("saisir le path de ville_fichier:\n"); scanf("%s", path_fichier_ville); switch(choix_menu) { case '1': printf("vous avez choisit d'afficher les X premières villes sur google map\n"); //*******************************************Questions 1************************************************** nombre_de_ville=0; // pour reinitialiser le menu a chaque fois if(path_fichier_ville[strlen(path_fichier_ville)-4]=='.' && path_fichier_ville[strlen(path_fichier_ville)-3]=='x' && path_fichier_ville[strlen(path_fichier_ville)-2]=='m' && path_fichier_ville[strlen(path_fichier_ville)-1]=='l') { // avec un fichier xml sprintf(command1, "./parser.out %s > ville_antlr.csv", path_fichier_ville); system(command1); // commande system qui applique la commande1 fp_ville=lire_fichier("./ville_antlr.csv"); } else { // avec un fichier csv fp_ville=lire_fichier(path_fichier_ville); } //lire fichier map.html printf("saisir le path_fichier de map.html\n"); scanf("%s", path_fichier); fp_origine_html=lire_fichier(path_fichier); //lire fichier map_out.html printf("saisir le path_fichier de map_out.html:\n"); scanf("%s", path_fichier); fp_new_html=fopen(path_fichier, "w+"); ville=read_ville(fp_ville, &nombre_de_ville); //*******************************************Question 2************************************************ //affiche_tableau(ville, 50); printf("saisir X premieres villes:\n"); scanf("%d", &x); while(x>nombre_de_ville||x<=0) { printf("respectez la regle, try again\n"); scanf("%d", &x); } ville=tri_ville(ville, 1, nombre_de_ville); //tri decroissant x_plus_grand_villes=x_premieres_villes(ville, x); // choix des villes ecrire_fichier(x_plus_grand_villes, fp_origine_html, fp_new_html, x); //ecriture du fichier printf("\n\nfichier map_out done =)\n\n"); //----------------------------------------------------------------------------------------- // liberation de l'espace memoire du tableau dynamique des villes free(ville); fclose(fp_origine_html); break; case '2': nombre_de_ville=0; printf("vous avez choisit de calculer le plus court chemin entre deux villes\n"); if(path_fichier_ville[strlen(path_fichier_ville)-4]=='.' && path_fichier_ville[strlen(path_fichier_ville)-3]=='x' && path_fichier_ville[strlen(path_fichier_ville)-2]=='m' && path_fichier_ville[strlen(path_fichier_ville)-1]=='l') { sprintf(command1, "./parser.out %s > ville.csv", path_fichier_ville); system(command1); fp_ville=lire_fichier("./ville_antlr.csv"); //**********************************************Question3+Bonus 1******************************************* depart=choisir_ville_depart("./ville_antlr.csv"); dest=choisir_ville_dest("./ville_antlr.csv"); while(depart.pop==0 || dest.pop==0) { printf("\ndesole :( vous devez respectez la facon de saisir, try again:\n\n"); depart=choisir_ville_depart("./ville_antlr.csv"); dest=choisir_ville_dest("./ville_antlr.csv"); } printf("le ville depart:%s\n",depart.nom_ville); printf("le ville dest:%s\n", dest.nom_ville); printf("la distance direct entre ces 2 villes est:%f\n", distance(depart, dest)); //---------------------------------------------------------------------------------- } else { fp_ville=lire_fichier(path_fichier_ville); //**********************************************Question3+Bonus 1******************************************* depart=choisir_ville_depart(path_fichier_ville); dest=choisir_ville_dest(path_fichier_ville); while(depart.pop==0 || dest.pop==0) { printf("\ndesole :( vous devez respectez le facon de saisir, try again:\n\n"); depart=choisir_ville_depart(path_fichier_ville); dest=choisir_ville_dest(path_fichier_ville); } printf("le ville depart:%s\n",depart.nom_ville); printf("le ville dest:%s\n", dest.nom_ville); printf("la distance direct entre ces 2 villes est:%f\n", distance(depart, dest)); //-------------------------------------------------------------------------------------- } //lire fichier map.html printf("saisir le path_fichier de map.html\n"); scanf("%s", path_fichier); fp_origine_html=lire_fichier(path_fichier); //lire fichier map_out.html printf("saisir le path_fichier de map_out_2.html:\n"); scanf("%s", path_fichier); fp_new_html_2=fopen(path_fichier, "w+"); //--------------------------------------------------Question3_Dijkstra---------------------------------------- //initiation les tableau: distance, marque et pere ville=read_ville(fp_ville, &nombre_de_ville); table_distance=creer_table_distance(depart, ville, nombre_de_ville); table_marque=creer_table_marque(nombre_de_ville); table_pere=creer_table_pere(nombre_de_ville); printf("saisir la limite de longeur:\n"); scanf("%d", &limite); //----------------------------------------Dijkstra---------------------------------------------------------- while(!toutes_villes_extraites(table_marque, nombre_de_ville)&&!trouvee)//===>tant que il y a des villes non extraire.. { No_de_ville_X=extraire_min(table_distance, table_marque, nombre_de_ville); //printf("ville_X c'est :%s et la distance :%f\n", ville[No_de_ville_X].nom_ville, table_distance[No_de_ville_X]); if(ville[No_de_ville_X].latitude==dest.latitude&&ville[No_de_ville_X].longitude==dest.longitude) {trouvee=1;}//si on trouve la ville destiaire. else{ table_marque=extraire_update_table_marque(table_distance, table_marque, nombre_de_ville); for(No_de_ville_Y=0; No_de_ville_Y<nombre_de_ville; No_de_ville_Y++) { if(distance(ville[No_de_ville_X], ville[No_de_ville_Y])<=limite)//pour les successeurs de ville_X { //Attention!! ici l'ordre des fonctions est un peu different de l'algorithme du cours //si on utilise relache table_distance en premier, la fonction relacher_table_pere ne marche bien!! //il faut, premierement, je notes les peres; Ensuite, on applique relacher_table_distance// table_pere=relacher_table_pere(table_distance, table_pere, No_de_ville_X, No_de_ville_Y, ville); table_distance=relacher_table_distance(table_distance, No_de_ville_X, No_de_ville_Y, ville); } } } } ////pour le tester //for(i=0; i<nombre_de_ville; i++){ // printf("%d. %s---%s---> %f, %d\n", i, depart.nom_ville, ville[i].nom_ville, table_distance[i], table_marque[i]);} //for(i=0; i<nombre_de_ville; i++){ // if(table_pere[i]==-1) // {continue;} // else{printf("%d. %s's father is %s-\n", i, ville[i].nom_ville, ville[table_pere[i]].nom_ville); // } //} //!!!不建立图很好!!至少不用1000*10000建图 每两城市之间城市数目《1000!! (avec un graphe il faut faire un calcul de 1000*1000 alors qu'ici on utilise 1000) //建图与不建图比较!不建图比较好 for(i=0; i<nombre_de_ville; i++) { if(ville[i].latitude==depart.latitude&&ville[i].longitude==depart.longitude) No_de_depart=i; if(ville[i].latitude==dest.latitude&&ville[i].longitude==dest.longitude) No_de_dest=i; } printf("apres Dijkstra, la distance entre ces 2 villes est: %f\n", table_distance[No_de_dest]); if(table_distance[No_de_dest]!=99999.0&&table_distance[No_de_dest]!=0.0) { ecrire_fichier_chemin(ville, fp_origine_html, fp_new_html_2, table_pere, No_de_depart, No_de_dest); printf("ecrire map_chemin_done =) \n\n"); } else { printf("on ne peut pas y arriver ou alors vous avez saisi deux fois la meme ville\n\n"); } //liberation des espaces memoire des tableaux dynamiques free(table_distance); free(table_marque); free(table_pere); free(ville); fclose(fp_origine_html); break; //----------------------------------------------------------------------------------------------------------------------- case '3': printf("vous avez choisit de calculer l'arbre aérien recouvrant minimal\n"); nombre_de_ville=0; if(path_fichier_ville[strlen(path_fichier_ville)-4]=='.' && path_fichier_ville[strlen(path_fichier_ville)-3]=='x' && path_fichier_ville[strlen(path_fichier_ville)-2]=='m' && path_fichier_ville[strlen(path_fichier_ville)-1]=='l') { sprintf(command1, "./parser.out %s > ville.csv", path_fichier_ville); system(command1); fp_ville=lire_fichier("./ville_antlr.csv"); } else { fp_ville=lire_fichier(path_fichier_ville); } //lire fichier map.html printf("saisir le path_fichier de map.html\n"); scanf("%s", path_fichier); fp_origine_html=lire_fichier(path_fichier); //lire fichier map_out.html printf("saisir le path_fichier de map_out_3.html:\n"); scanf("%s", path_fichier); fp_new_html_3=fopen(path_fichier, "w+"); //***********************************************Question 4 Prim*********************************************************** //initiation les tableau: distance, marque et pere ville=read_ville(fp_ville, &nombre_de_ville); printf("saisir les N plus grand villes pour afficher l'arbre aerien couvrant, au moins 1 villes..!:\n"); scanf("%d", &N); while(N>nombre_de_ville||N<=0) { printf("Vous ne respectez pas la regle, try again\n"); scanf("%d", &N); } ville=tri_ville(ville, 1, nombre_de_ville); x_plus_grand_villes=x_premieres_villes(ville, N); //affiche_tableau(x_plus_grand_villes, N); possibilite d'afficher le tableau table_prim_distance=creer_table_prim_distance(x_plus_grand_villes, N); table_prim_marque=creer_table_prim_marque(N); table_prim_pere=creer_table_prim_pere(N); table_prim_pere[0]=0;//!!! while(!tous_villes_extraire_prim(table_prim_marque, N)) { No_de_ville_X=extraire_prim_min(table_prim_distance, table_prim_marque, N); //printf("ville_X c'est :%s et la distance :%f\n", x_plus_grand_villes[No_de_ville_X].nom_ville, table_prim_distance[No_de_ville_X]); table_prim_marque=extraire_update_table_prim_marque(table_prim_distance, table_prim_marque, N); for(No_de_ville_Y=0; No_de_ville_Y<N; No_de_ville_Y++)//pour chaque voisin de ville_X. cette fois par rapport au DIJKSTRA, on n'a pas de condition stricte.. { table_prim_pere=relacher_table_prim_pere(table_prim_distance, table_prim_marque, table_prim_pere, No_de_ville_X, No_de_ville_Y, x_plus_grand_villes); table_prim_distance=relacher_table_prim_distance(table_prim_distance, table_prim_marque, No_de_ville_X, No_de_ville_Y, x_plus_grand_villes); } //pour le tester // for(i=0; i<N; i++){ // printf("%f %d\n", table_prim_distance[i], table_prim_marque[i]); // } } //pour le tester //for(i=0; i<N; i++){ // printf("%f\n", table_prim_distance[i]); //} // //for(i=0; i<N; i++){ // printf("+++%s's pere est %s+++\n", x_plus_grand_villes[i].nom_ville, x_plus_grand_villes[table_prim_pere[i]].nom_ville); //} ecrire_fichier_couvrant_minimal(fp_origine_html, fp_new_html_3, table_prim_pere, N, x_plus_grand_villes); printf("\n\necrire fichier fichier_couvrant_minimal done =)\n\n"); //liberation des espaces memoire des tableaux dynamiques fclose(fp_origine_html); free(table_prim_distance); free(table_prim_marque); free(table_prim_pere); free(ville); break; default: printf("erreur vous n'avez pas selectionner le bon numéro !!!\n"); break; } sprintf(command2, "rm -f ville_antlr.csv"); system(command2); printf("voulez vous continuer ?\n N pour arreter\n"); scanf("%s",Continue_encore); printf("Vous avez taper: %s\n",Continue_encore); if (*Continue_encore =='N' || *Continue_encore=='n') { printf("FIN DU PROGRAMME\n"); } printf("\n\n\n"); }while(*Continue_encore!='N' && *Continue_encore!='n'); return 0; }
/*remplir liste_arg à partir de commande * tester l'entrée pour exécuter les commandes*/ void test_commandes(struct str_commande liste_commande[MAX_COMMANDE],char *cwd, char* commande){ int chiffre = 0; int fd[2], fd_in =0; int redirection =0; int nb_de_commande = decoupe2(liste_commande,commande,"|"); int y = 0; pid_t fils; while( y< nb_de_commande){ int r = 0; if (redirection != 1){ for(r =0; r<liste_commande[y].nb_arg;r++){ if (strcmp(liste_commande[y].liste_arg[r], ">") == 0){ redirection = 1; liste_commande[y].liste_arg[r] = 0; liste_commande[y].nb_arg = r; break; } } } pipe(fd); fils = fork(); if(fils == -1){ /*si le fork s'est mal passé*/ exit(EXIT_FAILURE); }else{ if(fils == 0){/*si c'est le fils*/ if (fd_in != 0){ dup2(fd_in,0); // 0 c'est stdin } if (y <nb_de_commande-1 || redirection == 1){ // si il reste une comande a droite ou q'il y a une redirection dup2(fd[1],1); // 1 c'est stdout } if (strcmp(liste_commande[y].liste_arg[0], "quit") == 0){ exit(0); }else if(strcmp(liste_commande[y].liste_arg[0], "history") == 0){ history(liste_commande[y].liste_arg, liste_commande[y].nb_arg); exit(EXIT_SUCCESS); }else if(strcmp(liste_commande[y].liste_arg[0], "touch") == 0){ touch(liste_commande[y].liste_arg, liste_commande[y].nb_arg); exit(EXIT_SUCCESS); }else if(strcmp(liste_commande[y].liste_arg[0], "cd") == 0){ exit(EXIT_SUCCESS); }else if(sscanf(liste_commande[y].liste_arg[0], "!%d",&chiffre )){ /*exécute la commande numero $chiffre précédente*/ int i; for(i=0; i<MAX_COMMANDE; i++){ memset(liste_commande[y].liste_arg,0,sizeof(char*)*MAX_ARG); /* on met a zero le tableau d'argument*/ liste_commande[y].nb_arg = 0; } commande = tab_commande(chiffre,liste_commande[y].liste_arg, commande); test_commandes(liste_commande,cwd,commande); exit(EXIT_SUCCESS); }else if(strcmp(liste_commande[y].liste_arg[0], "cat") == 0){ cat(liste_commande[y].liste_arg, liste_commande[y].nb_arg); exit(EXIT_SUCCESS); }else{ char path_total[256]; fct_fork_exec(liste_commande[y].liste_arg, 1, path_total); } }else{ /*si c'est le père*/ close(fd[1]); fd_in = fd[0]; if (redirection == 1){ ecrire_fichier(fd[0],liste_commande[y].liste_arg[r+1]); } if(strcmp(liste_commande[y].liste_arg[0], "cd") == 0){ fn_cd(liste_commande[y].liste_arg,cwd); } } } if (redirection == 1){ redirection = 0; } y++; } waitpid(fils, NULL, 0); /*on attend le fils*/ }