- •Министерство образования и науки Российской федерации
- •Пример выполнения задания по теме № 1
- •Формулы для решения задач
- •Варианты заданий
- •Контрольные вопросы по теме № 1
- •Тема №2. Ветвление программы (использование операторов ветвления и переключателяswitch)
- •Варианты заданий
- •Пример выполнения лабораторного задания № 2
- •Блок-схема алгоритма вычисления составной функции
- •Контрольные вопросы к лабораторной работе № 2
- •Тема №3. Циклы, символьный (литерный) тип данных
- •Примеры выполнения задания по теме №3.
- •Блок-схема к программе
- •Варианты заданий
- •Контрольные вопросы к теме № 3
- •Тема №4. Функции в языке Си
- •Контрольные вопросы по теме №4
- •Тема №5. Обработка одномерных массивов Задание:
- •Краткая теоретическая справка и рекомендации по выполнению
- •Примеры функций для работы с одномерными массивами
- •Варианты заданий
- •Контрольные вопросы по теме № 5
- •Тема №6. Строки и использование библиотечных функций для их обработки
- •Краткая теоретическая справка и рекомендации по выполнению
- •Пример выполнения лабораторного задания № 6
- •Варианты заданий
- •Контрольные вопросы к теме № 6
- •Тема №7. Двумерные массивы. Файловый (бинарный) ввод-вывод Задание:
- •Краткая теоретическая справка
- •Примеры функций для работы с двумерным массивом
- •Тема №8. Односвязные списки. Файловый (текстовый) ввод-вывод Задание:
- •Краткая теоретическая справка и пример решения задачи
- •Оглавление
Примеры функций для работы с одномерными массивами
// 1. Инициализация генератора случайных чисел
void Randomize()
{
srand(time(0));
}
Функция инициализации генератора случайных чисел использует библиотечные функции srand, в которую в качестве параметра передается текущее времяtime(0). Прототип функцииtimeнаходится в заголовочном файле<time.h>.
//2. Генератор случайного числа в диапазоне от 0 до range
int Random(int range)
{
return (rand() % range);
}
Функция генератора случайных чисел использует библиотечную функцию rand(прототип в файлеstdlib.h). Функцияrandвычисляет псевдослучайное число в диапазоне от 0 до 65535. Для задания числа в заданном диапазоне используется остаток от целочисленного деления генерируемого числа на диапазонrange.
// 3. Проверка повторения случайного числа
// c - указатель начала массива, n - индекс нового элемента
int Test_Repetition(int *c, int n)
{ int x, j;
x = 0; // Считаем, что значение новое
// Цикл сравнения со всеми предыдущими
for (j=0; j<n; j++)
if (*(c+n)==*(c+j))
{
x = 1; // Элементы совпали
break;
}
return x;
}
Функция проверки повторения случайного числа используется только тогда, когда по условию задачи необходимо генерировать неповторяющиеся случайные числа. Эта функция простым перебором сравнивает новое число (c[n]) со всеми значениями массива.
// 4. Добавить новый элемент
// с - указатель начала массива, n - номер нового элемента
// range1, range2 – левая и правая границы диапазона
void New_Item(int *c, int n, int range1, int range2)
{ int x = 0; // Элементы массива разные
do
{
c[n] = Random(range2 - range1) + range1; // Новое значение
x =Test_Repetition(c,n); // Проверка на повторение
}
while (x==1); // Повторять, когда элементы совпали
}
В этой функции, если проверка на «неповторимость» элемента не требуется, достаточно использовать только строку присваивания в переменную c[n]результата работы функцииRandom.
// 5. Заполнение одномерного массива
// c - массив, n - количество элементов
void Filling (int *c, int n, int range1, int range2)
{ int i;
c[0]=Random (range2 - range1) + range1; // Элемент с индексом 0.
// Цикл заполнения массива
for (i=1;i<n; i++) // Цикл заполнения элементов значениями
New_Item(c, i, range1, range2);
}
Для реализации заполнения неповторяющимися числами, в функции заполнения массива приходится первое значение (с индексом 0) задавать отдельно, а не в цикле.
// 6. Распечатка одномерного массива
void Print(int *c, int n)
{ int i;
for (i=0; i<n; i++)
printf("%4d",c[i]);
puts(""); // Переход на новую строку
}
// 7. Поиск минимального значения
// с – указатель на начало одномерного массива,
// n - количество элементов массива,
// index – указатель на индекс минимума
int Min(int *c, int n, int *index)
{ int i, min;
min = c[0]; // Начальное значение минимума
(*index) = 0; // Начальное значение индекса минимума
for ( i=1; i<n; i++ )
if (c[i]<min)
{
min = c[i];
(*index) = i;
}
return min;
}
В функции поиска минимального значения в массиве обратите внимание на использование параметра-переменной index, которая передается указателем.
// 8. Создание дубликата массива в динамической памяти
int * Copy (int *c, int n)
{ int *m, i;
// Резервирование памяти под дубликат массива
m = (int*)malloc(sizeof(int)*n);
// Копирование массива
for ( i = 0; i<n; i++ ) m[i] = c[i];
// Функция возвращает адрес нового массива
return m;
}
Обратите внимание, что количество резервируемой памяти определяется типом данных одного элемента и количеством элементов в массиве ((sizeof(int)*n)).Так как библиотечная функция для резервирования памяти (malloc) возвращает нетипированный указатель, то требуется преобразование к типу. В данном примере – это преобразование к типу указателя на целое число (int *).
// 9. Обмен элементов местами в массиве
void Exchange (int *c, int n, int k)
{ int tmp; //Переменная для временного хранения данных
tmp = c[n];
c[n] = c[k];
c[k] = tmp;
}
// 10 .Сортировка методом прямого поиска
void SearchSort ( int *c, int n )
{ int i, min, indexMin; int *p;
for ( i=0; i<n-1; i++) // Определить массив с индексами от i до n
{ p = (c+i); // Задать адрес начала массива
min = Min (p, n-i, &indexMin); // Найти минимум в массиве
// Обменять местами минимальный элемент с первым
Exchange ( p, 0, indexMin ); }
}
Основная часть программы для обработки одномерных массивов может содержать заголовочные файлы, предварительное описание функций и главную часть программы. Предварительно описанные функции (в виде заголовков) могут быть представлены после главной функции.
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <time.h>
#define N 15
void Randomize();
int Random(int range);
int Test_Repetition(int *c, int n);
void New_Item(int *c, int n, int range1, int range2);
void Filling (int *c, int n, int range1, int range2);
void Print(int *c, int n);
int Min(int *c, int n, int *index);
int * Copy (int *c, int n);
void Exchange (int *c, int n, int k);
void SearchSort ( int *c, int n );
// Главная функция
int main()
{
int m[N];
int min, IndexMin;
int *Duplicate;
Rus();
Randomize();
Title();
puts("\nЗаполнение массива");
Filling(m,N,-30,70);
puts("\nРаспечатка массива\n");
Print (m,N);
puts("\nМинимальное значение массива\n");
min = Min(m,N,&IndexMin);
printf("min = %d его индекс = %d \n", min, IndexMin);
puts("\nСоздание дубликата массива\n");
Duplicate = Copy(m,N);
puts("\nРаспечатка дубликата массива\n");
Print (Duplicate,N);
puts("\nСортировка дубликата методом прямого поиска");
SearchSort(Duplicate,N);
puts("\nРаспечатка дубликата массива после сортировки\n");
Print (Duplicate,N);
puts("\nУдаление дубликата");
free(Duplicate);
return 0;
}