
- •Рязанская государственная радиотехническая академия Объектно-ориентированное программирование
- •Рязань 2003
- •390005, Рязань, ул. Гагарина, 59/1.
- •1. Программирование линейных алгоритмов Основные понятия
- •Идентификаторы
- •Объявление переменных
- •Стандартные типы данных
- •Представление констант
- •Символьные константы
- •Строковые константы
- •Ввод – вывод данных
- •Математические функции
- •Контрольные вопросы
- •Варианты заданий
- •2. Программирование алгоритмов разветвляющейся структуры Операторы управления
- •Контрольные вопросы
- •Цикл с параметром
- •Контрольные вопросы
- •Варианты заданий
- •4. Массивы. Классы памяти переменных Классы памяти переменных
- •Распределение памяти
- •Массивы
- •Инициализация
- •Указатели
- •Связь одномерных массивов с указателями
- •Связь двумерных массивов с указателями
- •Динамические массивы
- •Контрольные вопросы
- •Варианты заданий
- •5. Функции пользователя
- •Передача параметров в функции
- •Шаблоны функций
- •Контрольные вопросы
- •Варианты заданий
- •6. Структуры, объединения, битовые поля Структуры
- •Объединение
- •Битовые поля
- •Контрольные вопросы
- •Варианты заданий
- •7. Файлы
- •Типовые операции с файлами
- •Функции форматного ввода и вывода данных
- •Определение длины файла:
- •Спецификаторы доступа
- •Конструкторы и деструкторы
- •Наследование
- •Наследование и контроль доступа
- •Указатель this
- •Перегрузка операций
- •Константные объекты и константные методы
- •Статические элементы класса
- •Виртуальные функции
- •Абстрактные классы
- •9. Варианты заданий на курсовое проектирование
- •Оглавление
Связь двумерных массивов с указателями
int B[10][10];
B [0] – адрес первого элемента первой строки.
( B[0] + j)- адрес j–го элемента первой строки.
*(B[0] + j) – извлекается j–й элемент первой строки.
*(*(B+i)+j ) – значение j–го элемента i–й строки.
Пример:
Определить средний балл за сессию из пяти экзаменов у трех студентов.
#include <iostream.h>
#define NSt 3
#define NBal 5
void main()
{ int i,j,SumBal;
int Exams[NSt][NBal];
float SrBal;
//ввод оценок для студентов
for (i=0;i<NSt;i++)
{ cout<<’\n’<<”Оценки для студента N"<<i<<”: ”;
for (j=0;j<NBal;j++)
cin>>Exams[i][j];}
//вычисление среднего балла для каждого студента
for (i=0;i<NSt;i++)
{ SumBal=0;
for (j=0;j<NBal;j++)
SumBal+=Exams[i][j];
SrBal=SumBal/NBal;
cout<<’\n’<<”Средний бал для студента N”<<i<<”: ”<<SrBal;}}
Динамические массивы
Для того чтобы использовать функции динамического распределения памяти, нужно включить в программу заголовочный файл #include <alloc.h>.
Заказ динамической памяти осуществляется с помощью функции malloc(<необходимое число байт>), которая возвращает указатель на начало заказанной памяти. Если в качестве параметра поставить ноль, функция возвращает указатель на NULL.
Указатель на тип void, возвращаемый функцией, можно преобразовать к любому типу, используя операцию (тип*).
Приведем фрагмент программы, позволяющий выделить память под 20 элементов массива целых чисел:
int *p; // Указатель на переменную типа int.
p = (int*) malloc(40); // Переменная р содержит адрес первого
// байта массива целых чисел, под который выделено 40 байт.
В приведенном примере выделяется 40 байт оперативной памяти, если программа будет транслироваться компилятором, имеющим другой размер типа int, то она будет работать некорректно. Поэтому вместо числового значения размер необходимой памяти лучше записать так:
malloc(20*sizeof(int));
Если свободной динамической памяти нет, то malloc возвращает 0.
Функция free(p) освобождает память, т.е. возвращает ее системе.
Для динамического распределения памяти существует также операция new. Выражение a = new int[size]; является динамическим запросом на выделение памяти для массива в size целых элементов. Эта операция возвращает указатель на первый элемент этого массива. Адрес этого элемента присваивается адресной переменной а. Если операция new не может выделить требуемый фрагмент памяти, то возвращает нуль.
Для освобождения памяти используется операция delete[] a.
Для обращения к элементам динамического массива используются те же средства, что и у обычного массива – операции индексирования а[i] или разадресации *(a+i) .
Строки
Поддерживаются строки заканчивающиеся нуль символом, т.е. строки практически не ограниченной длины. Для работы с ними есть несколько десятков библиотечных функций, для использования которых необходимо включить заголовочный файл <string.h>.
Таблица 1.
Прототип функции |
Назначение функции |
char *strcat(char *s1, const char *s2) |
Слияние строк, возвращает начало строки s1 |
char *strcpy(char *s1, const char *s2) |
Копирует строку s2 в строку s1 |
char *strstr(const char *s1, const char *s2) |
Ищет первое вхождение в строке s1 подстроки s2. Возвращает указатель на тот элемент s1, с которого начинается подстрока s2 |
int *strcmp(const char *s1, const char *s2) |
Сравнение строк. Возвращает 0, если строки совпадают; >0, если s1>s2; <0,если s1<s2 |
unsigned strlen(char *s) |
Вычисляет длину строки без нуль – символа |
Пример:
Осуществить поиск слова в строке и заменить его на другое.
#include<iostream.h>
#include<string.h>
#define NStr 100
#define NWord 10
//Функция поиска и замены
void SearchChange(char *S,char *W,char *WC)
{ char *PosStr=NULL;//указатель на первое вхождение подстроки
char ResStr [120];//измененная строка
while(strstr(S,W)!=0)//пока в строке есть искомое слово
{PosStr=strstr(S,W);//первое вхождение искомого слова
strcpy(ResStr,S);//создание дубликата исходной строки
ResStr[strlen(ResStr)-strlen(PosStr)]='\0';
//перенос конца строки до искомого слова
*PosStr=S[strlen(ResStr)+strlen(W)];
//остаток строки после искомого слова
strcat(ResStr,WC);//соединение строки и заменяемого слова
strcat(ResStr,PosStr);//соединение строки и остатка
strcpy(S,ResStr); };}
main(){
char String[NStr];
char Word[NWord];
char WordCh[NWord];
cout<<"Введите строку:"<<endl; gets(String);
cout<<"Введите слово для поиска и замены:"<<endl; gets(Word);
cout<<"Введите слово для вставки:"<<endl; gets(WordCh);
if (strstr(String,Word)==0) cout<<"Такого слова нет!"<<endl;
else{
SearchChange(String,Word,WordCh);
cout<<"Новая строка: "<<String<<endl;}