120 likes | 250 Vues
Informatyka I Wykład 9. TABLICE PREPROCESOR OPERATORY c.d. (nie tylko binarne). Tablice jednowymiarowe. type_name identifier[const_expr];. type_name – nazwa typu elementu tablicy identifier – nazwa tablicy
E N D
Informatyka IWykład 9 TABLICE PREPROCESOR OPERATORY c.d. (nie tylko binarne) Jerzy F. Kotowski
Tablice jednowymiarowe type_name identifier[const_expr]; • type_name– nazwa typu elementu tablicy • identifier – nazwa tablicy • const_expr – liczba elementów tablicy. Musi to być wyrażenie stałe (obliczane przez kompilator) • Indeksy: 0, 1, 2, … , const_expr - 1 • Przykłady: int Ala[10]; double Ola[2*7+5]; struct Ula Ela[100]; – kiedyś będzie Ula Ela[100]; – C++ Ala[4] = 3; Jerzy F. Kotowski
Dyrektywy preprocesora • Jak sama nazwa wskazuje preprocesor to narzędzie, które funkcjonuje przed rozpoczęciem procesu właściwego. • Proces – proces kompilacji programu. Preprocesor przygotowuje program źródłowy do kompilaacji. • Przykłady: #include <stdio.h> • #include “c:\Jurek\\C\inf_8_1.cpp” • #define S(x) ((x)*(x)) • #define Ala • #define N 10 Jerzy F. Kotowski
9_1 Dyrektywa definea wyrażenia stałe • Przykład: #define N10 • ……………… • float Ula[N], Ela[N*N+2]; • int i; • for(i=0;i<N;i++) Ula[i] = 2*i; • Zaleta: Modyfikujemy w jednym miejscu a nie w wielu. • Wady: Tak określona stała nie ma typu. To nie jest nazwa OBIEKTU - nie można testować wartości wyrażeń. • C++: Słowo kluczowe const • const float pi = 3.14; Jerzy F. Kotowski
Inicjalizacja wartości początkowych • Przykłady: float Ula[5] = {0, 3, 4.5, 7.1, -1}; • float Ula[6] = {0, 3, 4.5, 7.1, -1}; - ostrzeżenie • float Ula[4] = {0, 3, 4.5, 7.1, -1}; - ERROR!! • float Ula[ ] = {0, 3, 4.5, 7.1, -1}; - policz sobie • Tablice znakowe: • char Ala[12] = {‘A’,’l’,’a’,’ ‘,’m’,’a’,’ ‘,’k’,’o’,’t’,’a’,’\0’}; - HELP!! • char Ala[12] = “Ala ma kota”; • Dużo lepiej! • Terminating null będzie dodany automatycznie. Trzeba o tym pamiętać, jeżeli go nie chcemy. Jerzy F. Kotowski
Tablice wielowymiarowe type ident[const_ex1] [const_ex2]; • Przykład:float Ala[N][N+1]; • [ ]– operator indeksowy 15 • A[2][3] – przykład użycia. Co to jest B[2,3]? • (A[2])[3] – operator indeksowy jest lewostronnie łączny • Wniosek:Tablice wielowymiarowe w C są tablicami tablic. • Nie ma ograniczenia na wymiar (poza rozsądkiem). • Inicjalizacja: int Ala[2][3]={{1,3,5},{8,2,4}}; • Niepełna inicjalizacja: int Ala[2][3]={1,3,8,2,4}; • Tablica znakowa: char Ola[3][5]={”Ala”,”ma”,”kota”}; • Policz sobie sam: char Ola[3][ ]={”Ala”,”ma”,”kota”}; Jerzy F. Kotowski
Operatory bitowe • Operatory bitowe - jak sama nazwa wskazuje - działają na poszczególnych bitach swoich argumentów • Argumentami tych operatorów nie mogą być dane typu float oraz double • Operator jednoargumentowy (jeden) • ~bitowe uzupełnienie zerojedynkowe 14 • Operatory dwuargumentowe (pięć) • & - bitowa koniunkcja 8 • | - bitowa alternatywa 6 • ^ - bitowa różnica symetryczna 7 • << - przesunięcie w lewo 11 • >> - przesunięcie w prawo 11 Jerzy F. Kotowski
Operatory bitowe - przykłady char s[20]; int x, m=1, i=0; scanf(”%d”,&x); while(m) { if(x&m) s[i++] = ‘1’; else s[i++] = ‘0’; m = m<<1; }// Trzeba odwrócić s w miejscu • Bitowa koniunkcja służy do zasłaniania pewnych bitów: • y = x & m; • m - maska • y = x & 0177; • Przesłania wszystko za wyjątkiem siedmiu najmłodszych bitów Jerzy F. Kotowski
Operatory bitowe - przykłady c.d. • Int x = 2, y, z; • y = x & 1; • z = x && 1; • y = 0 z = 1 • x = 10&7; 2 • x = 10|7; 15 • x = 10^7; 11 • Definicja funkcji zwracającej n bitów liczby x zaczynając od pozycji p • unsigned getbits(x, p, n) • unsigned x, p, n; • { • return(x>>(p+1-n)&~(~0<<n); • } • 0 00000000 ~0<<n 11111000 • ~0 11111111 ~(~0<<n) 00000111 Jerzy F. Kotowski
Operatory i wyrażenia przypisania • Operatory arytmetyczne Operatory bitowe (2 argumentowe) • + - * / % & | ^ << >> . • Definicja operatora • e1 op= e2 e1 = e1 op (e2) • Przykłady: • x /= y x = x/y • Cechy: Zwięzłość, bliskie językowi naturalnemu • Niebezpieczeństwo!!x = 15; • x = x*2/3; ( x: 10) • x *= 2/3; (x: 0) !! Jerzy F. Kotowski
Operator warunkowy • Jest to jedyny w języku C operator trójargumentowy (i tak jest czasami nazywany) • Oznaczenie: ?: Priorytet: 3 • Definicja operatora • y = e1 ? e2 : e3; if(e1) y=e2; else y=e3; • Korzyści: zwięzłość i czytelność programu • for(i=0;i<N;i++) printf(„”%d%c”,a[i],(i%10==9||i==N-1)?’\n’:’ ‘); • if(x&m) s[i++]=‘1’;else s[i++]=‘0’; s[i++] = x&m ? ’1’ : ’0’; • y = a>b ? a : b; Jerzy F. Kotowski
Nasz ulubiony przykład char s[20]; int x, m =1, i=0, j=0; printf(”x = ”); scanf(”%d”,&x); while(m) { s[i++] = x&m ?’1’:’0’; m <<= 1; } x[i--] = 0; // term. null printf(”binarnie = ”); for(;j<i;j++,i--) { m = s[i]; s[i] = s[j]; s[j] = m; } printf(s); Jerzy F. Kotowski