Работа с массивами и строками Лекция 7
План лекции Одномерные массивы n Двумерные статические массивы n Двумерные динамические массивы n Строки n
Одномерные массивы
Одномерные массивы n Объявление массива на языке Си: short mas[3]; short *pt; pt = mas;
Одномерные массивы
Одномерные массивы n Адрес элемента массива: pt + 1 ≡ mas + 1 ≡ &mas[1] n Значение элемента массива: *(pt + 1) ≡ *(mas + 1) ≡ mas[1] n Имя массива является его начальным адресом
Одномерные массивы n Пример. Найти сумму элементов одномерного массива целых чисел
Одномерные массивы void Input. Arr. Key(int *a, int n); void Print. Arr(int *a, int n); extern "C" int const n = 5; extern "C" int a[5]; extern "C" int s; extern "C” void sum();
Одномерные массивы int a[n], s; void main(){ Input. Arr. Key(a, n); Print. Arr(a, n); sum(); cout <<endl<<"Summa elementov=" << s; getch(); }
Одномерные массивы void Input. Arr. Key(int *a, int n) { for (int i = 0; i < n; i++) { cout << "Input “<<i<<" element= "; cin >> a[i]; } }
Одномерные массивы void Print. Arr(int *a, int n) { for (int i = 0; i < n; i++) cout << a[i] << " "; }
Одномерные массивы. MODEL FLAT, C. DATA EXTRN a : DWORD, n : DWORD, s : DWORD
Одномерные массивы. CODE PUBLIC C sum PROC XOR EBX, EBX XOR EAX, EAX MOV ECX, n JECXZ end 1 cycle: ADD EAX, DWORD PTR a[EBX] ADD EBX, 4 LOOP cycle end 1: MOV s, EAX RET sum ENDP END
Одномерные массивы n add EAX, DWORD PTR a[EBX] add EAX, DWORD PTR [a + EBX] add EAX, DWORD PTR [EBX]+a n В качестве индексного регистра можно использовать регистры EBX, ESI, EDI
Двумерные статические массивы n Объявление статического массива на языке Си: short mas[3][2];
Двумерные статические массивы
Двумерные статические массивы n Адрес элемента массива: mas ≡ &mas[0][0] n Значение элемента массива: **mas ≡ mas[0][0] n Адрес элемента массива: mas + 1 ≡ &mas[1][0] n Значение элемента массива: **(mas + 1) ≡ mas[1][0]
Двумерные статические массивы n Пример. Найти сумму элементов двумерного массива целых чисел
Двумерные статические массивы #include <time. h> extern "C" int const n = 3; extern "C" int const m = 2; extern "C" int a[n][m]; extern "C" int s; extern "C" void sum 2 x();
Двумерные статические массивы void Input. Arr(int a[n][m], int n, int m); void Print. Arr(int *a, int n, int m); int a[n][m], s;
Двумерные статические массивы int main(){ Input. Arr(a, n, m); Print. Arr. Dyn(b, n, m); sum 2 x(); cout <<endl<<"Summa elementov=" << s; getch(); return 0; }
Двумерные статические массивы void Input. Arr(int a[n][m], int n, int m) { srand((unsigned)time(NULL)); for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) a[i][j] = rand()/1000; }
Двумерные статические массивы void Print. Arr(int *a, int n, int m){ for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cout << a[i*m + j] << "t"; cout << endl; } }
Двумерные статические массивы. MODEL FLAT, C . DATA EXTRN a : DWORD, n : DWORD, m : DWORD, s : DWORD m 4 DD ?
Двумерные статические массивы. CODE PUBLIC C sum 2 x PROC XOR EBX, EBX XOR EAX, EAX MOV EDX, m SHL EDX, 2 MOV m 4, EDX MOV ECX, n JECXZ end 1 cycle 1: PUSH ECX XOR ESI, ESI MOV ECX, m JECXZ end 1 cycle 2: ADD EAX, DWORD PTR a[EBX][ESI] ADD ESI, 4 LOOP cycle 2 ADD EBX, m 4 POP ECX LOOP cycle 1 end 1: MOV s, EAX RET sum 2 x ENDP END
Двумерные динамические массивы
Двумерные динамические массивы n Объявим динамический массив на языке Си: short **mas;
Двумерные динамические массивы
Двумерные динамические массивы n n mas ≠ &mas[0][0] mas + 1 ≠ &mas[1][0]
Двумерные динамические массивы n Адрес элемента массива: *mas ≡ &mas[0][0] n Значение элемента массива: **mas ≡ mas[0][0] n Адрес элемента массива: *(mas + 1) ≡ mas[1][0] n Значение элемента массива: **(mas + 1) ≡ mas[1][0]
Двумерные динамические массивы n Пример. Найти сумму элементов двумерного массива целых чисел
Двумерные динамические массивы extern "C" int **b; void Input. Arr. Dyn(int **b, int n, int m); void Print. Arr. Dyn(int **b, int n, int m); int s; int **b;
Двумерные динамические массивы int main(){ b = new int*[n]; for (int i = 0; i < n; i++) b[i] = new int [m]; Input. Arr. Dyn(b, n, m); Print. Arr. Dyn(b, n, m); sum 2 x. Dyn(); cout << endl << "Summa elementov = " << s; getch(); return 0; }
Двумерные динамические массивы void Input. Arr. Dyn(int **b, int n, int m) { for (int i = 0; i < n; i++) for (int j = 0; j < m; j++) b[i][j] = rand()/1000; }
Двумерные динамические массивы void Print. Arr. Dyn(int **b, int n, int m) { for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cout << b[i][j] << "t"; cout << endl; } }
Двумерные динамические массивы. DATA EXTRN b : DWORD, n : DWORD, m : DWORD, s : DWORD . CODE PUBLIC C sum 2 x. Dyn
Двумерные динамические массивы sum 2 x. Dyn PROC MOV EDX, b MOV EBX, [EDX] XOR EAX, EAX MOV ECX, n JECXZ end 1 cycle 1: PUSH ECX XOR ESI, ESI MOV ECX, m JECXZ end 1 cycle 2: ADD EAX, DWORD PTR [EBX][ESI] ADD ESI, 4 LOOP cycle 2 MOV EBX, [EDX+4] POP ECX LOOP cycle 1 end 1: MOV s, EAX RET sum 2 x. Dyn ENDP END
Строки
Строки n Команды обработки строк позволяют работать с последовательностью символов (байт) как с единым целым
