- •Основы программирования
- •Содержание
- •Лабораторная работа №1 Линейные и разветвляющиеся вычислительные процессы
- •Краткие теоретические сведения
- •Классификация данных
- •Декларирование объектов
- •Структура программы
- •Константы
- •Операции Операции выражения
- •Арифметические операции
- •Операция присваивания
- •Сокращенная запись операции присваивания
- •X##; - постфиксную.
- •Преобразование типов операндов арифметических операций
- •Операция приведения типа
- •Операции сравнения
- •Логические операции
- •Побитовые логические операции, операции над битами
- •Операция «,» (запятая)
- •Функции вывода информации
- •Функции ввода информации
- •Ввод - вывод потоками
- •Стандартные математические функции
- •Синтаксис операторов языка Си
- •Операция присваивания
- •Условные операторы
- •If (условие ) оператор1;
- •If (условие1) оператор1;
- •Условная операция "? :"
- •Оператор выбора switch
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Циклические операторы while и do–while
- •Вложенные циклы
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Строки, как одномерные массивы символов
- •Указатели и операции над адресами
- •Операции над указателями (адресная арифметика)
- •Связь указателей и массивов
- •Пример 1: Упорядочить по алфавиту массив строк (не более 20) длиной не более 10 символов в каждой:
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа №4 Многомерные массивы, динамическое распределение памяти
- •Краткие теоретические сведения
- •Массивы указателей
- •Указатели на указатели
- •Динамическое размещение данных
- •Проверить, является ли введенная строка полиндромом (справа-налево читается также как и слева-направо).
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Вызов функции.
- •Изменение значений параметров.
- •Область действия переменных
- •Классы памяти.
- •Рекурсивные функции.
- •Операция typedef
- •Указатели на функции
- •Примеры работы с функциями
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Декларация структурного типа данных
- •Создание структурных переменных
- •Обращение к полям структур
- •Вложенные структуры
- •Использование typedef
- •Массивы структур
- •Размещение структурных переменных в памяти
- •Пример на использование структур
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа № 7 Файлы в языке с
- •Краткие теоретические сведения
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа № 8 Графический режим работы
- •Kраткие теоретические сведения
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Команды вставки и удаления (под блоком понимается выделенное подсветкой подмножество символов)
- •Команды работы с блоками
- •Набор текста программы
- •Компиляция, редактирование связей, запуск программы на выполнение
- •Многофайловая компиляция
- •Отладка программы
- •Использование глобальных переменных, объявленных вне файла
- •Литература
Динамическое размещение данных
Если в задаче заранее неизвестно количество объектов и объект описан указателем удобно использовать динамическое размещение данных.
Прототипы функций работы с памятью находятся в библиотеке alloc.h, рассмотрим основные из них:
void *calloc(unsigned n, unsigned m); - возвращает указатель на начало области памяти для размещения n элементов по m байт каждый, при неудачном завершении возвращает значение NULL;
void *malloc(unsigned n); - возвращает указатель на блок памяти длиной n байт, при неудачном завершении возвращает значение NULL;
void *realloc(void *bf, unsigned n); - изменяет размер ранее выделенной памяти с адресом начала bf на n байт;
void free(void *bf); - освобождает ранее выделенный блок памяти с адресом bf;
coreleft(void); - возвращает значение объема неиспользованной памяти (тип возвращаемого результата unsigned – для моделей памяти tiny, small, medium; unsigned long – для других моделей памяти).
Пример выделения памяти для массива действительных чисел размером n:
float *x; // Указатель объекта типа float–x[0]
int n; // Количество элементов массива
. . .
x=(float*)calloc(n,sizeof(float)); // Захват памяти для nэлементов
. . .
free(x); // Освобождение памяти
В С++ введены две операции: захват памяти - new и освобождение захваченной ранее памяти -delete.
Общий формат записи:
указатель =new тип (значение);
. . .
delete указатель;
Например:
int *a;
a = new int (8);
данном случае создана целочисленная динамическая переменная, на которую установлен указатель a и которой присвоено начальное значение 8. После работы с ней освобождаем память:
delete a;
Операции new для массивов:
указатель = newтип [количество] ;
Результат операции – адрес начала области памяти для размещения данных, указанного количества итипа; при нехватке памяти – NULL.
Операция delete для массивов:
delete [ ]указатель;
Пример динамического размещения при работе со строковыми данными в С
Проверить, является ли введенная строка полиндромом (справа-налево читается также как и слева-направо).
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <calloc.h>
void main(void)
{
char *s;
int i, k;
clrscr();
puts(" Vvedi stroky");
gets(s);
k=strlen(s);
s=(char*)calloc(k,sizeof(char)); // Захват памяти для строки длиной k
for (i=0; i<(int)(k/2); i++)
if(s[i]!=s[k-i-1]) { puts("\n NO!!"); getch();
free(s); exit(0); }
puts("\n YES - Polindrom!");
getch();
free(s); // Освобождение памяти
}
Пример динамического размещения одномерного массива в С
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<alloc.h>
void main(void)
{ int i,n; float *a;
puts(“\n Input n:”);
scanf(“%d”,&n);
printf(“\n Свободная память -%d”,coreleft());
a=(float*)calloc(n,sizeof(float)); // Захват памяти
printf(“\n Array a \n”);
for(i=0; i<n; i++) {
*(a+i)=(float)random(10); // Диапазон от 0 до 10
printf(“ %d“, a[i]);
}
printf(“\n Память после захвата -%d”,coreleft());
free(a); // Освобождение памяти
getch();
}
Пример динамического размещения двумерного массива в С
. . .
void main(void)
{ int i,j,n,m;
float **a;
puts(“\n Input n,m:”);
scanf(“%d %d”,&n,%m);
printf(“\n Свободная память -%d”,coreleft());
a=(float **)calloc(n,sizeof(float*)); // Захват памяти
for(i=0; i<n; i++)
a[i]=(float *)calloc(m,sizeof(float));
. . .
for(i=0; i<n; i++) free(a[i]); // Освобождение памяти
free(a);
getch();
}
Пример создания одномерного динамического массива в С++
...
double *x;
int i, n;
...
cout<< "Введите размер массива: ";
cin>>n;
x = new double [n] ;
if (x == NULL)
{
cout<<" Предел размерности ! ";
return;
}
for (i=0; i<n; i++) //выполняем некоторые действия с массивом
cin>>x[i];
...
delete [ ]x; // Освобождение памяти
...
Пример создания двухмерного динамического массива в С++
...
int **m, n1, n2, i, j;
cout<< " Введите размеры массива (количество строк и столбцов): ";
cin>>n1>>n2;
m = new int * [n1]; // Захват памяти для указателей
for ( i=0; i<n1; i++) // Захват памяти для элементов матрицы
m[i] = new int [n2];
. . .
for(i=0;i<n1;i++) // выполняем некоторые действия с матрицей
for ( j=0; j<n2; j++)
m[i][j] = i+j; // *(*(m+i)+j) = i+j;
. . .
for ( i=0;i<n1;i++) // Освобождение памяти
delete [ ] m[i];
delete [ ] m;
. . .
Пример динамического размещения массива строк в С++
#include <iostream.h>
#include <string.h>
void main()
{
char **str;
int n1,i;
cout<<"Введите количество строк: ";
cin>>n1;
str=new char *[n1+1];
for (i=0;i<n1+1;i++)
str[i]=new char[255];
if (str[i]==NULL)
{
cout<<"Predel razmera massiva";
return;
}
cout<<"Введите строки: "<<endl;
for (i=0;i<n1;i++)
cin>>*(str+i);
cout<<"Вывод массива строк: "<<endl;
for (i=0;i<n1;i++)
cout<<*(str+i)<<endl;
for(i=0;i<n1;i++)
delete [ ] str[i];
delete [ ] str;
}