Informatyka I Wykł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.
Download
Report
Transcript Informatyka I Wykł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.
Informatyka I
Wykład 9
TABLICE
PREPROCESOR
OPERATORY c.d.
(nie tylko binarne)
Jerzy F. Kotowski
1
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
2
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
3
9_1
Dyrektywa define a wyrażenia stałe
• Przykład: #define N 10
………………
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
4
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
5
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
6
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
7
Operatory bitowe - przykłady
• 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
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
Jerzy F. Kotowski
8
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
9
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
10
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
11
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
Jerzy F. Kotowski
printf(”binarnie = ”);
for(;j<i;j++,i--)
{
m = s[i];
s[i] = s[j];
s[j] = m;
}
printf(s);
12