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);
}
.