/***************************************************************************
 *   Copyright (C) 2005 by Christian Bucher                                *
 *   christian.bucher@amadyne.net                                          *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

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

/*
Die Funktion int rand() liefert eine pseudozufällige  Zahl zwischen 0 
und RAND_MAX (meist 32K). Der Startwert des Pseudozufallszahlengenerators 
kann mit srand() gesetzt werden. Damit werden die Zahlen "etwas zufälliger"

Der Modulo-Operator a % b evaluiert den Rest einer ganzzahligen Division von
a / b und kann beispielsweise für unaufwändige Bereichsbegrenzung grosser 
Zahlen verwendet werden, da x % y immer zwischen 0 und y-1 liegt.

Der Shuffle-Algorithmus muss die Liste der Tracks so mischen, dass alle 
genau einmal abgespielt werden.

Wir modellieren die Liste der Tracks als Array, das die Tracknummern enthält 
(die Grösse ist ja per Def. auf 100 beschränkt). Der Algorithmus besteht darin, 
"oft genug" zwei Zufällige Werte dieses Arrays zu vertauschen. Oft genug kann z.B.
2x die Trackanzahl sein.

*/

#define MAX_TRACKS 100

int main(int argc, char *argv[])
{
int anTracks[MAX_TRACKS];
int nTitel = 0;
int i;
int nTemp, nZuf1, nZuf2;
  
  printf("Hallo Fremder, wie viel Tracks? \n");
  scanf ("%d", &nTitel);

  // PIPI-Schnellversion ohne Funktionen
  printf("Trackliste vorher:\n");
    
  if (nTitel > 1 && nTitel < MAX_TRACKS)
    {
    for (i = 0; i < nTitel; i++)
      {
      anTracks[i] = i+1;
      
      printf("%02d",anTracks[i]);
      
      if (9 == (i%10) )
        {
        printf ("\n");
        }
      else
        {
        printf ("\t");
        }
      }
    printf ("\n\n");
    
    // jetzt mischen
    for (i = 0; i < nTitel * 2; i++)
      {
      // zwei zufällige Indizes
      nZuf1 = rand()%nTitel; 
      nZuf2 = rand()%nTitel;
      
      // vertauschen
      nTemp = anTracks[nZuf1];
      anTracks[nZuf1] = anTracks[nZuf2];
      anTracks[nZuf2] = nTemp;      
      }
  
    printf("Trackliste nachher:\n");
      
    for (i = 0; i < nTitel; i++)
      {
      printf("%02d",anTracks[i]);
      
      if (9 == (i%10) )
        {
        printf ("\n");
        }
      else
        {
        printf ("\t");
        }
      }
    printf ("\n\n");
        
    }
  else
    {
    printf ("Bloedmann!\n");
    }

  return EXIT_SUCCESS;
}

syntax highlighted by Code2HTML, v. 0.9.1