Questions INGINIOUS

  1. Faites l’exercice relatif à printf(3) sur INGINIOUS : https://inginious.info.ucl.ac.be/course/LEPL1503/s2_printf
  2. Faites l’exercice relatif à strcat(3) sur INGINIOUS : https://inginious.info.ucl.ac.be/course/LEPL1503/s2_strcat
  3. Faites l’exercice relatif à strlen(3) sur INGINIOUS : https://inginious.info.ucl.ac.be/course/LEPL1503/s2_strlen
  4. Faites l’exercice relatif à strcasecmp(3) sur INGINIOUS : https://inginious.info.ucl.ac.be/course/LEPL1503/s2_strcasecmp
  5. L’an dernier, vous avez écrit un programme permettant de détecter si une chaîne de caractères était un palindrome. Faites de même en C avec l’exercice INGINIOUS https://inginious.info.ucl.ac.be/course/LEPL1503/s2_palindrome (bonus)
  6. Un utilisateur peut adapter le comportement d’un programme via les arguments passés en ligne de commande. Ecrivez un programme permettant d’afficher un argument sur deux tel qu’indiqué sur INGINIOUS: https://inginious.info.ucl.ac.be/course/LEPL1503/s2_main_argc
  7. Ecrivez le corps de la fonction swap2 permettant d’échanger les valeurs stockées dans deux variables de type entier. Faites de même lorsque les arguments de cette fonction sont des structures contenant des fractions : https://inginious.info.ucl.ac.be/course/LEPL1503/s2_swap2int

Vérifiez vos réponses

Questions de discussion

  1. Soit char *ptr = "Test". Itérez sur ce pointeur et affichez avec printf(3) la valeur et l’adresse mémoire où se trouve stocké chaque caractère de deux façons différentes. Regardez la manpage de printf(3) pour savoir comment afficher la valeur d’un pointeur.

  2. Lorsque l’on veut améliorer les performances d’un programme, il est utile de pouvoir mesurer précisément son temps d’exécution. La commande time(1posix) permet d’effectuer cette mesure depuis la ligne de commande. Parfois, on souhaite mesurer le temps de calcul une partie critique d’un code. Une façon simple pour obtenir cette mesure est d’utiliser gettimeofday(2) comme dans l’exemple ci-dessous (./s2_perf.c).

    /***********************************************
     * perf.c
     *
     * Mesure de temps de calcul via gettimeofday
     *
     ***********************************************/
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/time.h>
    
    /* Return t2-t1 in microseconds */
    long timeval_diff(struct timeval *t2, struct timeval *t1)
    {
      long diff = (t2->tv_usec + 1000000 * t2->tv_sec) - (t1->tv_usec + 1000000 * t1->tv_sec);
      return (diff);
    }
    // n : number of iterations of the loop
    void compute(int n) {
      // long computation
      double sum=0;
      int i;
      for(i=0;i<n;i++) {
        sum=sum+i;
      }
    }
    
    int main(int argc, char *argv[])
    {
      struct timeval tvStart, tvEnd;
      int err;
      int num; // number of operations for compute
      if(argc!=2)
        exit(EXIT_FAILURE);
      else
        num=atoi(argv[1]);
    
      err=gettimeofday(&tvStart, NULL);
      if(err!=0)
        exit(EXIT_FAILURE);
    
      // long computation
      compute(num);
    
      err=gettimeofday(&tvEnd, NULL);
      if(err!=0)
        exit(EXIT_FAILURE);
    
      printf("Duration : %ld microseconds\n", timeval_diff(&tvEnd, &tvStart));
    
      return(EXIT_SUCCESS);
    }
    
    

    Pour certaines opérations, les performances dépendent du type de données utilisé. Modifiez le programme ci-dessous de façon à utiliser un calcul plus compliqué que la simple addition et comparez sur de longues itérations (\(10^7\) ou plus) les performances de cette opération lorsqu’elle utilise des int, long long, double ou float. Les performances sont-elles identiques ?