Guest User

Turhake

a guest
Dec 27th, 2010
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. #define C_BUFFER 50
  7. #define MAX_WORDS 100
  8.  
  9. /* void-osoitin voi olla minkä tyyppinen vain.  Tyypin kokoa johon se osoittaa
  10.  * ei tiedetä, eikä tässä tarvitsekaan, jos tiedetään minkä kokoisia osoittimet
  11.  * ovat (kokonaislukuja johonkin muistiosoitteeseen). Vaihdetaan siis vain
  12.  * osoitinmuuttujien sisältö keskenään laittamalla tälle funktiolle osoitinten
  13.  * osoitteet. Argumenttien räpeltäminen suoraan ei onnistu, koska argumenteistä
  14.  * tehdään funktiokutsua varten kopiot. Siispä homma täytyy hoitaa
  15.  * pointterikikkailulla. Jos osaat pointterit, osaat C:tä. */
  16. void swap(void *a, void *b)
  17. {
  18.     void *tmp = a;
  19.     a = b;
  20.     b = tmp;
  21. }
  22.  
  23. int main(void)
  24. {
  25.         int c, d, nth_c, i, nth_w; /* c = luettu merkki; nth_c = monesko merkki sanassa   */
  26.         char cbuf[C_BUFFER];       /* puskuri luetulle sanalle. Sana ei voi olla pidempi. */
  27.         char *sanat[MAX_WORDS];    /* puskuri sanoille. Sanoja ei voi olla enempää.       */
  28.     char **sekaseka;
  29.     char *sana;
  30.     nth_c = 0;
  31.     nth_w = 0;
  32.     while ((c=getchar()) != EOF)
  33.     {
  34.         if(c==' '||c=='\n')
  35.         {
  36.             /* merkkijonot ovat nollaterminoituja '\0', ja calloc
  37.              * alustaa valmiiksi muistialueen. Operaattori sizeof
  38.              * antaa tyypin koon. */
  39.             sana = calloc(nth_c+1, sizeof(char));
  40.             strncpy(sana, cbuf, sizeof(char)*nth_c);
  41.             sanat[nth_w] = sana;
  42.             nth_w++;
  43.             nth_c = 0;
  44.         }
  45.         else
  46.         {
  47.             cbuf[nth_c] = c;
  48.             nth_c++;
  49.         }
  50.     }
  51.     /* tehdään kopio sanalistasta, ja sekoitetaan sen osoittimet. */
  52.     sekaseka = malloc(sizeof(char**)*nth_w);
  53.     memcpy(sekaseka, sanat, sizeof(char**)*nth_w);
  54.     for (i = 0; i < nth_w; i++)
  55.     {
  56.         sekaseka[i] = sanat[i];
  57.     }
  58.     /* sekaseka */
  59.     srand((unsigned int)(time(NULL)/2)); /* käytetään aikaa siemenenä */
  60.     for (i = 0; i < nth_w*10; i++)
  61.     {
  62.         c = rand() % nth_w;
  63.         d = rand() % nth_w;
  64.         swap(&(sekaseka[c]), &(sekaseka[d]));
  65.     }
  66.     for (i = 0; i < nth_w; i++)
  67.     {
  68.         printf("%s ", sekaseka[i]);
  69.     }
  70.     printf("\n");
  71.     return EXIT_SUCCESS;
  72. }
Advertisement
Add Comment
Please, Sign In to add comment