Programy C (pt 3)

Kolejny zestaw programów w C:

Na początek skrypt basha czas, który sprawdza czas działania programów, przypominam, że odpala się go tak:

./czash.sh NazwaProgramu PlikZDanymi GdzieZapisaćWynik
np.: ./czas.sh sortowanie dane wynik

Program czas:

#!/bin/bash

POCZsek="$(date +%s)"
POCZnano="$(date +%N)"

$PWD/$1 <$2 >$3

KONsek="$(date +%s)"
KONnano="$(date +%N)"

echo; echo "CZAS WYKONANIA PROGRAMU $1:"

if  [ $POCZnano -le $KONnano ]
then  echo "$(($KONsek - $POCZsek)).$(($KONnano - $POCZnano)) sek."
else  echo "$(($KONsek - $POCZsek - 1)).$(($KONnano + 1000000000 - $POCZnano)) sek."
fi
echo

Do wykonania zadań potrzebne są pliki dane1 , dane2.


Sortowanie 1 – Mamy tablicę z 100000 liczb (dane1_1), wczytujemy ją i układamy w drugiej tablicy tak aby najpierw były mniejsze od 0, potem równe zero a na koniec większe od 0.

main()
{
int i,j;
float t[100000],liczby[100000];

for (i=0; i<100000; i++)
{
	scanf("%f",&t[i]);
}

j = 0;
for (i=0; i<100000; i++)
{
	if ( t[i] < 0 )
	{
		liczby[j] = t[i];
		j++;
	}
}
for (i=0; i<100000; i++)
{
	if ( t[i] == 0 )
	{
		liczby[j] = t[i];
		j++;
	}
}
for (i=0; i<100000; i++)
{
	if ( t[i] > 0 )
	{
		liczby[j] = t[i];
		j++;
	}
}

//do pliku
for (i=0; i<100000; i++)
{
	printf("%f\n",liczby[i]);
}

}

Wersja 2 – Ten sam program co powyżej, ale tym razem sortujemy dane tylko w jednej tablicy.

main()
{
int i,p,q,r;
float a[100000],temp;

// program sortuje liczby do tej samej tablicy

for (i=0; i<100000; i++)
{
	scanf("%f",&a[i]);
}

p = 0;
q = 99999;
r = q;

for (i=0; i<100000; i++)
{
	if (a[q]==0)
	{
		q--;
	}
	else if(a[q]<0)
	{
		temp=a[p];
		a[p]=a[q];
		a[q]=temp;
		p++;
	}
	else
	{
		temp=a[q];
		a[q]=a[r];
		a[r]=a[q];
		q--;
		r--;
	}
}

//do pliku
for (i=0; i<100000; i++)
{
	printf("%f\n",a[i]);
}

}

Sortowanie 2 – Mamy dwie tablice (a o rozmiarze 5000 i b o rozmiarze 10000, wszystkie 15000 kolejno zapisane w pliku dane2_1) które są ciągami niemalejącymi. Układamy je do trzeciej tablicy tak, aby nadal był to ciąg niemalejący.

Wersja 1:

main()
{
int i,p,q;
float a[5000],b[10000],c[15000];

// program układa ciagi z dwoch tablic w jeden

for (i=0; i<5000; i++)
{
 scanf("%f",&a[i]);
}
for (i=0; i<10000; i++)
{
 scanf("%f",&b[i]);
}

i = 0;
p = 0;
q = 0;
while (p<5000 && q<10000)
{
 if (a[p] < b[q]) //wstaw a, bo jest mniejsze
 {
 c[i]=a[p];
 p++;
 i++;
 }
 else    //wstaw b, bo jest mniejsze, lub a juz jest skonczone
 {
 c[i]=b[q];
 q++;
 i++;
 }
}

for (i=i; i<15000; i++)
{
 if (p<5000)
 {
 c[i]=a[p];
 p++;
 }
 else
 {
 c[i]=b[q];
 q++;
 }
}

//do pliku
for (i=0; i<15000; i++)
{
 printf("%f\n",c[i]);
}

}

Wersja 2:

main()
{
int i,p,q,m,n;
float a[5000],b[10000],c[15000];

m = 5000;
n = 10000;

for (i=0; i<15000; i++) c[i]=0;

// program układa ciagi z dwoch tablic w jeden

for (i=0; i<m; i++) scanf("%f",&a[i]);
for (i=0; i<n; i++) scanf("%f",&b[i]);

p = 0; q = 0;
for (i=0; i<15000; i++)
{
 if (p<m && a[p] < b[q]) //wstaw a, bo jest mniejsze
 {
 c[i]=a[p]; p++;
 }
 else    //wstaw b, bo jest mniejsze, lub a juz jest skonczone
 {
 c[i]=b[q]; q++;
 }
}

//do pliku
for (i=0; i<m+n; i++) printf("%f\n",c[i]);

}

Powyższy program korzysta z pewnej niedoskonałości C, bowiem jeżeli tablica a się skończy to p == m, a element a[m] tablicy nie istnieje (tablica ma 5000 elementów od 0 do 4999, tymczasem m=5000), więc liczba ta to będzie losowy śmieć z pamięci ram, nie mniej jednak warunek p<m jest fałszywy, w związku z czym cokolwiek znajdzie się za znakami && to i tak cały warunek jest fałszywy ( false && true == false).


ASCII – Użytkownik podaje zakres jako dwie liczby. Program drukuje litery ASCII w tym zakresie, w postaci 6 kolumn, numeracja od góry na dół (trzeba zatem obliczyć liczbę wierszy).

Przykład:

     45: -     51: 3     57: 9     63: ?     69: E     75: K
     46: .     52: 4     58: :     64: @     70: F     76: L
     47: /     53: 5     59: ;     65: A     71: G
     48: 0     54: 6     60: <     66: B     72: H
     49: 1     55: 7     61: =     67: C     73: I
     50: 2     56: 8     62: >     68: D     74: J

Kod:

main()
{
    int pocz,kon,i,j,ile,teraz;

    printf("ASCII - podaj zakres:\nod: ");
    scanf("%i",&pocz);
    printf("do: ");
    scanf("%i",&kon);
    printf("\n");

    if (kon>255) kon = 255;

    ile = (kon - pocz + 1) / 6;
    if ( (kon-pocz+1) % 6 > 0) ile++;

    for (i=0; i<ile; i++)
    {
        printf("    ");
        for(j=0; j<6; j++)
        {
            teraz = pocz+i+ile*j;

            if (teraz<100) printf(" ");
            if (teraz<=kon)
                printf("%i: %c    ",teraz,teraz);
        }
        printf("\n");
    }
    printf("\n");
}

Suma maksimów kolumn – użytkownik podaje liczbę kolumn i wierszy w macierzy. Następnie wprowadza dane wierszami. Program szuka dla każdej kolumny największej liczby (maksimum kolumny) i sumuje je wszystkie, podając wynik. Zakładamy, że macierz nie będzie większa niż 100 x 100.

Przykład:

Dla macierzy

1 2 3
5 0 4
3 1 7

Wynik to: 5+2+7 = 14;

main()
{

int a[100][100],w,k,i,j,naj,suma;

printf("Czesc: Podaj liczbe wierszy: ");
scanf("%i",&w);
printf("Podaj liczbe kolumn: ");
scanf("%i",&k);

for(i=0; i<w; i++)
{
    printf("Wiersz %i\n",i+1);
    for (j=0; j<k; j++)
    {
        scanf("%i",&a[i][j]);
    }
}

suma = 0;
for (j=0; j<k; j++)
{
    naj = a[0][j];

    for (i=1; i<w; i++)
    {
        if (a[i][j]>naj) naj =    a[i][j];
    }
    suma = suma + naj;
}

printf("\nDzieki. Twoja suma maksimow wynosi: %i\n",suma);
}

.

Dodaj komentarz