Wstęp do programowania w języku C/Instrukcja for: Różnice pomiędzy wersjami
Nie podano opisu zmian |
m Zastępowanie tekstu – „,...,” na „,\ldots,” |
||
(Nie pokazano 5 wersji utworzonych przez jednego użytkownika) | |||
Linia 47: | Linia 47: | ||
i = 1; | i = 1; | ||
while (i < N) /*Nzm.: a[i_max]= max = | while (i < N) /*Nzm.: a[i_max]= max = | ||
MAX(a[0], | MAX(a[0],\ldots,a[i-1]) & i <= N*/ | ||
{ | { | ||
if (a[i] > max){ | if (a[i] > max){ | ||
Linia 69: | Linia 69: | ||
''expr1;'' '''while''' ''(expr2) { instrukcja; expr3; }'' | ''expr1;'' '''while''' ''(expr2) { instrukcja; expr3; }'' | ||
''Przykład:'' | |||
<Source> | <Source> | ||
for (i = 10; i > 0; i--) | for (i = 10; i > 0; i--) | ||
Linia 76: | Linia 77: | ||
Oto kilka standardowych sposobów użycia instrukcji '''for'''. | Oto kilka standardowych sposobów użycia instrukcji '''for'''. | ||
# "Liczenie" od 0 do | # "Liczenie" od 0 do ''n-1''. <Source>for ( i = 0; i<n; i++ ) ... </Source> | ||
# "Liczenie" od 1 do ''n''. <Source>for ( i = 1; i<=n; i++ ) ...</Source> | |||
# | # "Liczenie" od ''n-1'' do 0. <Source>for ( i = n-1; i>=0; i-- ) ...</Source> | ||
for ( i = 1; i | # "Liczenie" od ''n'' do 1. <Source>for ( i = n; i>0; i-- ) ...</Source> | ||
# | |||
for ( i = n-1; i | |||
# | |||
for ( i = n; i | |||
Każde z 3 wyrażeń w pętli for może być pominięte. Jeżeli brakuje | Każde z 3 wyrażeń w pętli for może być pominięte. Jeżeli brakuje | ||
Linia 99: | Linia 93: | ||
max = a[0]; | max = a[0]; | ||
for ( i = 1; i < N; i++) | for ( i = 1; i < N; i++) | ||
/*Nzm.: a[i_max]=max=MAX(a[0], | /*Nzm.: a[i_max]=max=MAX(a[0],\ldots,a[i-1]) & i <= N*/ | ||
if (a[i] > max){ | if (a[i] > max){ | ||
i_max = i; | i_max = i; | ||
Linia 106: | Linia 100: | ||
/* a[i_max] = max = Max(a[0],...a[n-1]) */ | /* a[i_max] = max = Max(a[0],...a[n-1]) */ | ||
</Source> | </Source> | ||
== Operacje na tablicach == | |||
Oto kilka przykładów typowych operacji na tablicach. | Oto kilka przykładów typowych operacji na tablicach. | ||
# Czytanie danych do tablicy. | # Zerowanie tablicy. <Source>for ( i = 0; i<N; i++ ) a[i] = 0;</Source> | ||
for ( i = 0; i | # Czytanie danych do tablicy. <Source>for ( i = 0; i<N; i++ ) scanf("\%d", &a[i]);</Source> | ||
# Sumowanie elementów tablicy.<Source> sum = 0; for (i = 0; i<N; i++) sum += a[i];</Source> | |||
== Algorytmy sortowania == | |||
Wróćmy teraz do naszego programu znajdowania (pozycji) elementu | Wróćmy teraz do naszego programu znajdowania (pozycji) elementu | ||
maksymalnego. Można go użyć do sortowania elementów w tablicy. | maksymalnego. Można go użyć do sortowania elementów w tablicy. | ||
Linia 126: | Linia 115: | ||
w tablicy. Następnie wśród pierwszych N-1 elementów znajdujemy | w tablicy. Następnie wśród pierwszych N-1 elementów znajdujemy | ||
element największy i zamieniamy go z przedostatnim w tablicy, itd. | element największy i zamieniamy go z przedostatnim w tablicy, itd. | ||
Taki algorytm sortowania nosi nazwę | Taki algorytm sortowania nosi nazwę "Sortowania przez selekcję". | ||
<Source> | <Source> | ||
/* Sortowanie przez selekcje. */ | /* Sortowanie przez selekcje. */ | ||
Linia 144: | Linia 133: | ||
for ( i = 0; i < N; i++ ) | for ( i = 0; i < N; i++ ) | ||
scanf("%d", &a[i]); | scanf("%d", &a[i]); | ||
printf( | printf("Ciag do posortowania:\n"); | ||
for ( i = 0; i < N; i++ ) | for ( i = 0; i < N; i++ ) | ||
printf("%d, ", a[i]); | printf("%d, ", a[i]); | ||
Linia 151: | Linia 140: | ||
/* Wlasciwe sortowanie. */ | /* Wlasciwe sortowanie. */ | ||
for ( j = N-1; j > 0; j-- ){ | for ( j = N-1; j > 0; j-- ){ | ||
/* Nzm.: a[0], | /* Nzm.: a[0],\ldots,a[j]<=a[j+1]<=...<=a[N-1] */ | ||
max = a[0]; | max = a[0]; | ||
i_max = 0; | i_max = 0; | ||
for ( i = 1; i <= j; i++ ) | for ( i = 1; i <= j; i++ ) | ||
/* Nzm.: a[i_max]=max=MAX(a[0], | /* Nzm.: a[i_max]=max=MAX(a[0],\ldots,a[i-1]) */ | ||
if ( a[i] > max ){ | if ( a[i] > max ){ | ||
max = a[i]; | max = a[i]; | ||
Linia 165: | Linia 154: | ||
/* Wypisanie wynikow. */ | /* Wypisanie wynikow. */ | ||
printf(" | printf("Ciąg posortowany:\n"); | ||
for ( i = 0; i < N; i++ ) | for ( i = 0; i < N; i++ ) | ||
printf("%d, ", a[i]); | printf("%d, ", a[i]); | ||
Linia 175: | Linia 164: | ||
</Source> | </Source> | ||
Najlepszym algorytmem do sortowania krótkich ciągów jest | Najlepszym algorytmem do sortowania krótkich ciągów jest | ||
"Sortowanie przez wstawianie". W tym algorytmie przeglądamy | |||
sortowaną tablicę od strony lewej do prawej sortując najpierw | sortowaną tablicę od strony lewej do prawej sortując najpierw | ||
prefiks 1-elementowy, potem 2-elementowy, 3-elementowy, itd. | prefiks 1-elementowy, potem 2-elementowy, 3-elementowy, itd. | ||
Sortowanie prefiksu | Sortowanie prefiksu k-elementowego polega na przesunięciu | ||
wszystkich elementów większych od | wszystkich elementów większych od k-tego o jedną pozycję | ||
w prawo. W zwolnione miejsce wstawiamy element | w prawo. W zwolnione miejsce wstawiamy element k-ty. | ||
<Source> | <Source> | ||
/* Sortowanie przez wstawianie. */ | /* Sortowanie przez wstawianie. */ | ||
Linia 198: | Linia 187: | ||
for ( i = 0; i < N; i++ ) | for ( i = 0; i < N; i++ ) | ||
scanf("%d", &a[i]); | scanf("%d", &a[i]); | ||
printf( | printf("Ciag do posortowania:\n"); | ||
for ( i = 0; i < N; i++ ) | for ( i = 0; i < N; i++ ) | ||
printf("%d, ", a[i]); | printf("%d, ", a[i]); | ||
Linia 208: | Linia 197: | ||
v = a[i]; | v = a[i]; | ||
for ( j = i; (j > 0) && (a[j-1] > v) ; j-- ) | for ( j = i; (j > 0) && (a[j-1] > v) ; j-- ) | ||
/* Nzm.: v < a[j+1], | /* Nzm.: v < a[j+1],\ldots,a[i] */ | ||
a[j] = a[j-1]; | a[j] = a[j-1]; | ||
a[j] = v; | a[j] = v; |
Aktualna wersja na dzień 21:54, 15 wrz 2023
Tablice
Dotychczas rozważaliśmy tylko zmiene, na których można było zapamiętywać tylko pojedyncze wartości z typu określonego podczas deklaracji zmiennej. Większość języków programowania umożliwia grupowanie zmiennych w większe struktury. W języku C mamy dwa rodzaje "grupowań": tablice (ang. arrays) i struktury ang. structures. Tablica jest strukturą danych zawierającą skończoną liczbę elementów tego samego typu. Żeby zadeklarować tablicę musimy podać jej rozmiar (długość) i typ elementów. Rozmiar może być dowolnym wyrażeniem typu całkowitego o argumentach będących stałymi.
Przykład:
int a[10]; /* Deklaracja 10-elementowej tablicy a */
W trakcie pracy nad programem rozmiar tablicy może ulegać zmianie. Dlatego bardziej elegancko i bezpiecznie jest zdefiniować długość tablicy jako stałą, np.
#define N 10
int a[N];
Do elementów tablicy odwołujemy się podając nazwę tablicy i indeks elementu w nawiasach kwadratowych. Elementy tablicy są w C zawsze indeksowane od 0.
Przykład:
a[0] = 1;
printf("%d\n", a[5]);
++a[i];
Przykład:
W N-elementowej tablicy liczb całkowitych należy znaleźć pozycje elementu o największej wartości.
/* int a[N] - dana tablica liczb calkowitych. */
int i, i_max, max;
i_max = 0;
max = a[0];
i = 1;
while (i < N) /*Nzm.: a[i_max]= max =
MAX(a[0],\ldots,a[i-1]) & i <= N*/
{
if (a[i] > max){
i_max = i;
max = a[i];
}
i++; /* Rownowazne i = i+1; */
}
/* a[i_max] = max = Max(a[0],...a[n-1]) */
Instrukcja for
Powyższą pętle while można zastąpić przez najsilniejszą z pętli języka C - pętlę for. Pętla for w języku C ma postać:
for (exp1; exp2; exp3) instrukcja
Poza nielicznymi wyjątkami jest ona równoważna następującej konstrukcji z pętlą while
expr1; while (expr2) { instrukcja; expr3; }
Przykład:
for (i = 10; i > 0; i--)
printf("%d^2 = %d\n", i, i*i);
Oto kilka standardowych sposobów użycia instrukcji for.
- "Liczenie" od 0 do n-1.
for ( i = 0; i<n; i++ ) ...
- "Liczenie" od 1 do n.
for ( i = 1; i<=n; i++ ) ...
- "Liczenie" od n-1 do 0.
for ( i = n-1; i>=0; i-- ) ...
- "Liczenie" od n do 1.
for ( i = n; i>0; i-- ) ...
Każde z 3 wyrażeń w pętli for może być pominięte. Jeżeli brakuje
expr2 to dozór pętli przyjmuje zawsze wartość 0.
Zapiszmy teraz fragment programu liczenia maksimum z użyciem pętli for.
/* int a[N] - dana tablica liczb calkowitych. */
int i, i_max, max;
i_max = 0;
max = a[0];
for ( i = 1; i < N; i++)
/*Nzm.: a[i_max]=max=MAX(a[0],\ldots,a[i-1]) & i <= N*/
if (a[i] > max){
i_max = i;
max = a[i];
}
/* a[i_max] = max = Max(a[0],...a[n-1]) */
Operacje na tablicach
Oto kilka przykładów typowych operacji na tablicach.
- Zerowanie tablicy.
for ( i = 0; i<N; i++ ) a[i] = 0;
- Czytanie danych do tablicy.
for ( i = 0; i<N; i++ ) scanf("\%d", &a[i]);
- Sumowanie elementów tablicy.
sum = 0; for (i = 0; i<N; i++) sum += a[i];
Algorytmy sortowania
Wróćmy teraz do naszego programu znajdowania (pozycji) elementu maksymalnego. Można go użyć do sortowania elementów w tablicy. Najpierw znajdujemy element największy i zamieniamy go z ostatnim w tablicy. Następnie wśród pierwszych N-1 elementów znajdujemy element największy i zamieniamy go z przedostatnim w tablicy, itd. Taki algorytm sortowania nosi nazwę "Sortowania przez selekcję".
/* Sortowanie przez selekcje. */
#include <stdio.h>
#define N 10
main()
{
int a[10]; /* Sortowana tablica. */
int i, i_max, max, j;
/* Wczytanie danych. */
printf("Podaj %d liczb calkowitych", N);
printf(" oddzielonych spacjami.\n");
for ( i = 0; i < N; i++ )
scanf("%d", &a[i]);
printf("Ciag do posortowania:\n");
for ( i = 0; i < N; i++ )
printf("%d, ", a[i]);
printf("\n");
/* Wlasciwe sortowanie. */
for ( j = N-1; j > 0; j-- ){
/* Nzm.: a[0],\ldots,a[j]<=a[j+1]<=...<=a[N-1] */
max = a[0];
i_max = 0;
for ( i = 1; i <= j; i++ )
/* Nzm.: a[i_max]=max=MAX(a[0],\ldots,a[i-1]) */
if ( a[i] > max ){
max = a[i];
i_max = i;
}
a[i_max] = a[j];
a[j] = max;
}
/* Wypisanie wynikow. */
printf("Ciąg posortowany:\n");
for ( i = 0; i < N; i++ )
printf("%d, ", a[i]);
printf("\n");
return 0;
}
Najlepszym algorytmem do sortowania krótkich ciągów jest "Sortowanie przez wstawianie". W tym algorytmie przeglądamy sortowaną tablicę od strony lewej do prawej sortując najpierw prefiks 1-elementowy, potem 2-elementowy, 3-elementowy, itd. Sortowanie prefiksu k-elementowego polega na przesunięciu wszystkich elementów większych od k-tego o jedną pozycję w prawo. W zwolnione miejsce wstawiamy element k-ty.
/* Sortowanie przez wstawianie. */
#include <stdio.h>
#define N 10
main()
{
int a[10]; /* Sortowana tablica. */
int i, j, v;
/* Wczytanie danych. */
printf("Podaj %d liczb calkowitych", N);
printf(" oddzielonych spacjami.\n");
for ( i = 0; i < N; i++ )
scanf("%d", &a[i]);
printf("Ciag do posortowania:\n");
for ( i = 0; i < N; i++ )
printf("%d, ", a[i]);
printf("\n");
/* Wlasciwe sortowanie. */
for ( i = 1; i < N; i++ ){
/* Nzm.: a[0]<=...<=a[i-1] */
v = a[i];
for ( j = i; (j > 0) && (a[j-1] > v) ; j-- )
/* Nzm.: v < a[j+1],\ldots,a[i] */
a[j] = a[j-1];
a[j] = v;
}
/* Wypisanie wynikow. */
printf("Ciag posortowany:\n");
for ( i = 0; i < N; i++ )
printf("%d, ", a[i]);
printf("\n");
return 0;
}