План:
Дефиниране и използване на масиви
Mасивите като параметри на функции
Масиви от символи
Двумерни масиви
Двумерни масиви като параметри на функции
Многомерни масиви
** Дефиниране и използване на
масиви.
Сравни с дефиниция на
вектор с 10 елемента тип double:
vector<double> salaries(10);
* Индекси на елементите на масив
Пример: На елементът с индекс 4 се задава стойност 355:
salaries[4] = 355;
Елементите на масива се номерират (индексират), започвайки
от 0:
salaries[0] - първи елемент
salaries[1] - втори елемент
salaries[2] - трети елемент
salaries[3] - четвърти елемент
...
salaries[9] - десети елемент
Индекс |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
Стойност |
? |
? |
? |
? |
355 |
? |
? |
? |
? |
? |
Пример: Масив със
заплати.
const int SAL_MAXSIZE = 10;
double sal[SAL_MAXSIZE]; /* фиксираме
дължината на масива */
int sal_size =
0; /* брой
на използваните елементи на масива */
bool more = true;
/* необходими са
2 условия за прекратяване на цикъла - спиране на въвеждането или
запълване на всички елементи на масива */
while (more and sal_size <
SAL_MAXSIZE)
{ cout << "Enter salary or 0 to
quit";
double x;
cin >> x;
if (cin.fail()) more = false
else
{ sal[sal_size] = x; /*
задаване на стойност на елемент на масива */
sal_size++; /*
увеличаване с 1 на използваните елементи */
}
}
** Mасивите като параметри на
функции.
Пример: Намиране на максимален елемент на масив.
double
maximum(const double a[], int a_size)
{ if (a_size == 0) return 0;
double highest = a[0];
int i;
for (i = 1; i <
a_size; i++)
if
(a[i] > highest) highest = a[i];
return highest;
}
Пример: Следващата програма чете заплати от стандартен вход
и отпечатва максималната заплата.
// salarray.cpp
#include <iostream>
using namespace std;
void
read_data(double a[], int a_maxsize, int& a_size)
{ a_size = 0;
double x;
while (a_size < a_maxsize
and (cin >> x))
{ a[a_size] = x; a_size++; }
}
double
maximum(const double a[], int a_size)
{ if (a_size == 0) return 0;
double highest = a[0];
int i;
for (i = 1; i < a_size;
i++)
if (a[i]
> highest) highest = a[i];
return highest;
}
int
main()
{ const int SALARIES_MAXSIZE = 100;
double
salaries[SALARIES_MAXSIZE];
int salaries_size = 0;
cout << "Please enter all salary data: ";
read_data(salaries,
SALARIES_MAXSIZE, salaries_size);
if (salaries_size == SALARIES_MAXSIZE and not cin.fail())
cout
<< "Sorry - extra data ignored\n";
double maxsal = maximum(salaries, salaries_size);
cout << "The maximum
salary is " << maxsal << "\n";
return 0;
}
Please enter all salary data:
200 240 250 210 290 310 205 q The maximum salary is 310 |
** Масиви от
символи.
char ch = 'w';
ch = 126;
Всеки C-низ завършва със специален символ с ASCII код 0.
char greeting[6] = "Hello"; char greeting[] = "Hello"; char greeting[10] = "Hello"; |
|
Пример: Добавяне на
елементи на един С-низ към друг С-низ.
// append.cpp
01: #include <iostream> 02: using namespace std; 03: /** 04: Appends as much as possible from a string to another string 05: @param s the string to which t is appended 06: @param s_maxlength the maximum length of s (not counting '\0') 07: @param t the string to append 08: */ 09: void append(char s[], int s_maxlength, const char t[]) 10: { int i = strlen(s); 11: int j = 0; 12: /* append t to s */ 13: while (t[j] != '\0' and i < s_maxlength) 14: { s[i] = t[j]; 15: i++; j++; 16: } 17: /* add zero terminator */ 18: s[i] = '\0'; 19: } 20: 21: int main() 22: { const int GREETING_MAXLENGTH = 10; 23: char greeting[GREETING_MAXLENGTH + 1] = "Hello"; 24: char t[] = ", World!"; 25: append(greeting, GREETING_MAXLENGTH, t); 26: cout << greeting << "\n"; 27: return 0; 28: }
* Превръщането С-низ в типа string и обратно става по следния начин:
const string s = "ABCD"; s.c_str(); |
char c[] = "1234"; string s = static_cast<string>(c); |
Пример: Използване на
функцията atoi от библиотеката cstdlib за превръщане на низ
в число.
string year = "1999";
int y = atoi(year.c_str());
C_str.cpp
Важно е да не се забравя
символа за край на низ при използване на масиви от символи
(С-низове), защото много функции, които работят със С-низове и
операция изходен поток определят дължината на низа по този символ.
const int BALANCE_ROWS = 11;Достъп до елементите на двумерния масив се осъществява с два индекса.
const int BALANCE_COLS = 6;
double balances[BALANCE_ROWS][BALANCE_COLS];
// matrix.cpp
01: #include <iostream> 02: #include <iomanip> 03: #include <cmath> 04: using namespace std; 05: 06: const int BALANCES_ROWS = 11; 07: const int BALANCES_COLS = 6; 08: 09: const double RATE_MIN = 5; 10: const double RATE_MAX = 10; 11: const double RATE_INCR = 12: (RATE_MAX - RATE_MIN) / (BALANCES_ROWS - 1); 13: const int YEAR_MIN = 5; 14: const int YEAR_MAX = 30; 15: const int YEAR_INCR = 16: (YEAR_MAX - YEAR_MIN) / (BALANCES_COLS - 1); 17: 18: /** 19: Prints a table of account balances. 20: @param the table to print 21: @param table_rows the number of rows in the table. 22: */ 23: void print_table(const double table[][BALANCES_COLS], 24: int table_rows) 25: { const int WIDTH = 10; 26: cout << setiosflags(ios::fixed) << setprecision(2); 27: for (int i = 0; i < table_rows; i++) 28: { for (int j = 0; j < BALANCES_COLS; j++) 29: cout << setw(WIDTH) << table[i][j]; 30: cout << "\n"; 31: } 32: } 33: /** 34: Computes the value of an investment with compound interest 35: @param initial_balance the initial value of the investment 36: @param p the interest rate per period in percent 37: @param n the number of periods the investment is held 38: @return the balance after n periods 39: */ 40: double future_value(double initial_balance, double p, int n) 41: { double b = initial_balance * pow(1 + p / 100, n); 42: return b; 43: } 44: 45: int main() 46: { double balances[BALANCES_ROWS][BALANCES_COLS]; 47: for (int i = 0; i < BALANCES_ROWS; i++) 48: for (int j = 0; j < BALANCES_COLS; j++) 49: balances[i][j] = future_value(10000, 50: RATE_MIN + i * RATE_INCR, 51: YEAR_MIN + j * YEAR_INCR); 52: 53: print_table(balances, BALANCES_ROWS); 54: 55: return 0; 56: }