Kolejny zestaw programów:
5 stycznia 09 (przeniesione z 22 grudnia 08) – szybkie sortowanie rekursywne
http://www.ipipan.gda.pl/~stefan/Dydaktyka/WstepDoProg/lab-12-22/
Pliki potrzebne do zadania:
dane1 – plik ze 100 000 liczbami nieposortowanymi, czas – program mierzący czas wykonywania.
Odpalamy programy w ten sposób: ./czas sort dane1 wynik .
Zadanie 1: uporządkować dane za pomocą rekursywnej funkcji mergesort omówionej na wykładzie:
#define N 100000
float a[N];
void merge (int p, int r, int q)
{
int i,j,k;
float pom[N];
i=p;
j=r;
k=p;
while (i<r && j<q)
{
if (a[i] <= a[j])
{
pom[k] = a[i]; i++; k++;
}
else
{
pom[k]=a[j]; j++; k++;
}
}
while (i<r) { pom[k]=a[i]; i++; k++;}
while (j<q) { pom[k]=a[j]; j++; k++;}
for (k=p; k<q; k++) a[k]=pom[k];
}
void mergesort (int p,int q)
{
int r;
if (p+1 < q)
{
r = (p+q)/2;
mergesort(p,r);
mergesort(r,q);
merge(p,r,q);
}
}
main ()
{
int i;
for (i=0; i<N; i++)
{
scanf("%f",&a[i]);
}
mergesort(0,N);
for(i=0; i<N; i++)
{
printf("%f\n",a[i]);
}
}
Zadanie 2: Jak wyżej, ale tym razem za pomocą programu quicksort (brakująca część programu została podana na laboratorium).
#define N 100000
float a[N];
void quicksort(int p, int q)
{
int j,k,l;
float r,x;
if (p+1 < q)
{
r = a[(p+q)/2];
// sth
k = p;
l = q;
j = q;
while(j>k)
{
if (a[j-1]==r) j--;
else if (a[j-1]<r)
{
x = a[j-1];
a[j-1]==a[k];
a[k]=x;
k++;
}
else
{
x = a[j-1];
a[j-1] = a[l-1];
a[l-1]=x;
l--;
j--;
}
}
quicksort(p,k);
quicksort(l,q);
}
}
main ()
{
int i;
for (i=0; i<N; i++)
{
scanf("%f",&a[i]);
}
quicksort(0,N);
for(i=0; i<N; i++)
{
printf("%f\n",a[i]);
}
}
12 stycznia 09, reprezentacja komputerowa liczb (cecha i mantysa)
http://www.ipipan.gda.pl/~stefan/Dydaktyka/WstepDoProg/lab-01-12/
Zadanie 1: Obliczyć ile bitów zajmuje INT, poprzez potęgowanie liczby 2:
main(){
int liczba,ile;
liczba = 1;
ile =0;
while (liczba > 0 )
{
liczba = liczba *2;
ile ++;
}
printf("Jest %i bitow\n",ile+1);
}
Zadanie 2: Obliczanie cechy i mantysy dla typu FLOAT:
//zad 2, lab 01-12
main ()
{
float liczba,last;
int cecha,mantysa;
liczba = 1;
last = 0;
cecha = 0;
mantysa = 0;
while (liczba != last)
{
last = liczba;
liczba = liczba * 2;
cecha ++;
}
cecha = cecha - 2;
printf("Maksymalna cecha wynosi %i \n",cecha);
liczba = 1;
do
{
liczba = liczba / 2;
mantysa ++;
}
while (liczba != 0);
printf("Mantysa wynosi %i \n",mantysa - cecha);
}
Zadanie 3: tak jak w punkcie 2, ale float liczba,last zamieniamy na double liczba, last.
main ()
{
double liczba,last;
int cecha,mantysa;
// ... i tak dalej, jak w zadaniu 2
Zadanie 4: Wykonać program, który dzieli a/2 tak długo aż: 1 + a = 1, (a będzie tak małą liczbą float, że zostanie zaokrąglone do zera).
main()
{
float a;
int ile;
a = 1;
ile = 0;
while (1 + a != 1)
{
a = a / 2;
ile --;
}
printf("Ostatnia potega to %i\n",ile);
}
.
Kilka innych programów z rekursją:
1. Program prosi usera o podanie rozmiaru tablicy ( 0 < n <= 100 ). User wpisuje dowolne liczby, a program je sortuje.
float a[100];
void sort(int n)
{
int index,i;
float pamietaj;
index = 0;
for (i=1; i<n; i++)
{
if (a[i]>a[index]) index = i;
}
pamietaj = a[index];
for (i=index; i<n-1; i++)
{
a[i]=a[i+1];
}
a[n-1] = pamietaj;
if (n>2) sort(n-1);
}
main()
{
int n,i;
printf("Podaj n:");
scanf("%i",&n);
if ( n<1 || n>100 )
{
printf("Zly zakres");
return;
}
//skanuj tablice
for (i=0; i<n; i++)
{
scanf("%f",&a[i]);
}
if (n > 1) sort(n);
// drukuj tablice
for (i=0; i<n; i++)
{
printf("%f\n",a[i]);
}
}
2. Permutacje. Podać n ( 0 < n <= 20). Program wyświetla wszystkie permutacje dla liczb od 0 do n-1. np.: dla n = 2:
01
10
dla n = 3:
012
021
102
120
201
210
//permutajce
//te zmienne sa dostepnie globalnie, tzn. jezeli gdziekolwiek je zmienimy, to zmieniaja sie dla !calego! programu
int a[20],n;
//ta funkcja drukuje tablice a dla wartosci n od tylu, tak po prostu wyglada ladniej
void drukuj()
{
int i;
for ( i=n; i>0; i-- )
{
printf( "%i" , a[i-1] );
}
printf( "\n" );
}
//permutacje
void permute( int k )
{
int i,t;
if ( k==0 ) drukuj();
else
for ( i=0; i<k; i++ )
{
t = a[i];
a[i] = a[k-1];
a[k-1] = t;
permute( k-1 );
t = a[i];
a[i] = a[k-1];
a[k-1] = t;
}
return;
}
//glowna czesc programu
main()
{
int i;
//nie potrzebujemy int n, poniewaz jest zdefinionwane na poczatku
printf( "Podaj n: " );
scanf( "%i" , &n );
if ( n<1 || n>20 )
{
printf( "Zly zakres" );
return;
}
//zapychamy tablice a kolejnymi liczbami naturalnymi od 0 do n-1
for ( i=0; i<n; i++ )
{
a[i] = i;
}
//permutujemy
permute( n );
//to jest juz wszystko
return;
}
.