12.07.2015 Views

znaki - MARS

znaki - MARS

znaki - MARS

SHOW MORE
SHOW LESS
  • No tags were found...

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Znaki, tablice znakoweW języku C do pamiętania znaków przeznaczony jest typ char (charakter). Zmienna typu charzajmuje 1 bajt w pamięci. Ponadto każdemu znakowi odpowiada jego kod ASCII, który jest liczbącałkowitą (int). Stałe znakowe zapisywane są między znakami pojedynczego cudzysłowia (np.‘a’, ‘A’), natomiast do zapisu stałych tekstowych (ciągu znaków) używa się symboli: ” (np.”stala tekstowa”). Na końcu tekstu kompilator dodaje znak końca tekstu – jest to znak okodzie 0, który jest zapisywany ‘\0’. Tekst, czyli ciąg znaków (string) zapisywany jest w pamięcikomputera w tablicy typu char.Kod znaku a znakPoniższy program wyświetla wprowadzone z klawiatury <strong>znaki</strong> i ich kody ASCI. Zastosowano funkcjęgetchar do wczytywania 1 znaku z klawiatury. Znak jest wyświetlany na ekranie za pomocąspecyfikacji %c stosowanej dla znaków oraz %d. Warunkiem stopu jest wprowadzenie spacji (‘ ‘) okodzie ASCII 32.#include main(){int wybor;do{wybor=getchar();printf("%d %c\n",wybor,wybor);}while (wybor!=32); // do spacji}Używając powyższego programu można zauważyć, że kody małych i dużych liter różnią się o wartość32, co odpowiada cyfrze 1 na 6 bicie od prawej strony (26=32).Małe litery a duże literyKolejny program pokazuje kilka sposobów zamiany liter małych na duże i odwrotnie przyzastosowaniu operatorów matematycznych ( -, + ) oraz bitowych operatorów logicznych ( |, & ):


#include #include int main(){//zamiana malych liter na duze i z powrotem}unsigned i,j,maska;i=97;printf("i=%d i=%c\n",i,i);i=i-32;printf("i=%d i=%c\n",i,i);// maska 0000000000100000maska=32;i=i | maska;printf("i=%d i=%c\n",i,i);maska=~maska;//maska 1111111111011111printf("maska=%d\n",maska);i=i & maska;printf("i=%d i=%c\n",i,i);Przykład – zliczanie słów w tekścieDo ilustracji tablic tekstowych przedstawiony zostanie program, który wczytuje dowolny tekst i zliczawystępujące w nim słowa. Do zliczania słów zostaną wykorzystane dwie nieznacznie różniące sięfunkcje. Kolejne słowo w tekście rozpoznawane jest po tym, że występuje przed nim przynajmniejjedna spacja.#include #include #define MAX 150int licz_slowa_2(text)char *text;{char znak=' ',poprz;int l=0;while(poprz=znak,znak=*text++)if(znak!=' ' && poprz==' ')l++;return l;}int licz_slowa_1(text)char *text;{char znak, poprz=' ';int i=0,j=0;


}while((znak=text[i++])!='\0'){if(znak!=' ' && poprz==' ')j++;poprz=znak;}return j;int main(){int slowa;char tekst[MAX],*wtekst;//wtekst=gets(tekst);wtekst=fgets(tekst,20,stdin);printf("%s\n",tekst);printf("%s\n",wtekst);slowa=licz_slowa_1(wtekst);printf(" slow: %d\n slow: %d\n",slowa,licz_slowa_2(tekst));}Do wczytania tablicy tekstowej zastosowano funkcję fgets. Pierwszym aktualnym parametrem jestnazwa tablicy, drugi parametr określa liczbę znaków do wczytania, a trzeci wskazuje plik, z któregoma odbywać się czytanie - w tym przypadku jest to standardowe wejście, czyli klawiatura (stdin).Funkcja fgets zwraca wskaźnik do przeczytanego tekstu, czyli adres zerowego elementu tablicy.Funkcja fgets dodatkowo dodaje na koniec tablicy znak końca linii (o kodzie 10), a po nim znakkońca tekstu (\0). Rozmiar zadeklarowanej tablicy powinien być zatem dłuższy od wczytywanegotekstu o minimum dwa <strong>znaki</strong>. Alternatywnym rozwiązaniem jest zastosowanie funkcji gets (liniazakomentarzowana w programie), jednak ze względu na bezpieczeństwo systemu funkcji tej niepowinno się stosować. Na uwagę zasługuje konstrukcja: znak=*text++ występującą w funkcjilicz_slowa_2. Do zmiennej znak podstawiany jest jeden bajt spod adresu wskazywanegoprzez zmienną text, a następnie zmienna ta jest inkrementowana, co oznacza, że będzie onawskazywać na kolejny bajt. W alternatywnej funkcji licz_slowa_1 zastosowano konstrukcję:znak=text[i++] - do zmiennej znak podstawiany jest i-ty element tablicy (text[i]), anastępnie indeks i jest zwiększany o 1.

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!