- •О.В. Курипта, о.В. Минакова, д.К. Проскурин Основы программирования и алгоритмизации
- •Оглавление
- •Введение
- •Лабораторная работа № 1 создание, отладка и запуск консольного приложения
- •1.1 Теоретические сведения
- •1.2 Приемы, используемые при отладке программ
- •1.3 Пример разработки консольного приложения – вывода текста
- •%[Флаг][ширина][.Точность][h|l|l]тип,
- •2.2 Приемы форматированного вывода информации
- •2.3 Примеры форматированного вывода информации
- •2.4 Практические задания
- •3.2 Приемы оформления кода
- •3.3 Пример конструирования программы
- •3.4 Практические задания
- •4.2 Приемы, используемые при вычислениях
- •4.3 Примеры выполнения заданий
- •4.4 Практические задания
- •4.5 Контрольные задания
- •Лабораторная работа № 5 Реализация разветвляющихся алгоритмов
- •5.1. Теоретические сведения
- •If (выражение) оператор 1;
- •5.2 Приемы оформления ветвлений
- •If (условие) оператор;
- •If (условие) оператор;
- •5.3 Примеры решения задач
- •5.4 Практические задания
- •5.5 Контрольные задания
- •Лабораторная работа №6 Многоальтернативная обработка данных
- •6.1 Теоретическая справка
- •6.2 Примеры использования управляющих конструкций
- •Int choice; /* Текущийвыборпунктаменю*/
- •6.3 Практические задания
- •6.4 Контрольные задания
- •Лабораторная работа №7 Циклический вычислительный процесс
- •7.1. Циклический вычислительный процесс
- •7.2. Приемы эффективного построения циклов
- •7.3. Примеры построения циклов
- •7.4. Практические задания
- •7.5 Контрольные задания
- •Лабораторная работа №8 Использование вложенных циклов
- •8.1. Практические аспекты использования циклов
- •8.2. Методы оптимизации циклов
- •8.3. Примеры использования вложенных циклов
- •8.4. Практические задания
- •8.5. Контрольные задания
- •Лабораторная работа №9 Структурирование программы с использованием функций
- •9.1. Теоретические сведения
- •9.2. Правила написания функций
- •9.3. Примеры написания и использования функций
- •Int fact(int k) //вычисление факториала
- •9.4. Практические задания
- •9.5. Контрольные задания
- •Лабораторная работа №10 Создание одномерных массивов
- •10. 1 Теоретические сведения
- •10.2 Приемы инициализации и заполнения массивов случайными числами
- •10.3 Примеры работы с массивами
- •10.4. Практические задания
- •10.5. Контрольные задания
- •Лабораторная работа №11 Адресная арифметика
- •11.1 Теоретические сведения
- •Int *p1, *p2;//объявление указателя
- •11.2 Способы инициализации указателей
- •11.3 Примеры работы с указателями
- •11.4 Практические задания
- •11.5 Контрольные задания
- •Лабораторная работа №12 Работа со строками через указатели
- •12. 1. Теоретические сведения
- •12. 2. Примеры работы со строками
- •12.3 Способы преобразования чисел в строки
- •12. 4 Практические задания
- •12.5 Контрольные задания
- •Лабораторная работа №13 Использование интегрированных типов данных для разработки программ и создания библиотек
- •13.1 Теоретические сведения
- •13.2 Примеры программ с использованием структур
- •13.3 Практические задания
- •13.4 Практические аспекты создания библиотек на языке Си
- •13.5 Контррольные задания для совместной разработки библиотеки
- •Int w, h; // размеры прямоугольника
- •Int x0, y0; // левая верхняя точка прорисовки
- •Лабораторная работа №14 Запись и чтение файлов
- •14.1 Теоретические сведения
- •Int fclose(указатель файла);
- •14.2 Примеры программ работы с файлами
- •14.3 Практические задания по записи файла
- •14.4 Практические задания на чтение файла
- •14.5 Контрольные задания
- •Лабораторная работа №15 поиск в статическом одномерном массиве
- •15.1 Теоретические сведения
- •15.2 Приемы реализации линейного поиска
- •15.3 Примеры реализации алгоритмов поиска
- •Inta[10]; // массив
- •Int min; // номер минимального элемента
- •Int I; // индекс массива
- •15.4 Практические задания
- •15.5 Контрольные задания
- •Лабораторная работа №16 статический многомерный массив
- •16.1 Теоретические сведения
- •16.2 Приемы работы со статическим многомерным массивом
- •16.3 Примеры работы со статическим многомерным массивом
- •16.4 Практические задания
- •16.5 Контрольные задания
- •Лабораторная работа № 17 динамическИе массиВы
- •17.1 Теоретические сведения
- •17.2 Примеры работы с динамическими массивами
- •Void input_arr_random (float *mas, int n);// прототип функции
- •Input_arr_random (mas,n);// вызов функции
- •17.3 Особенности работы с двумерными динамическими массивами
- •Int **a; /* указатель на двумерный массив */
- •Int ***b; /* указатель на трехмерный массив */
- •17.4 Практические задания
- •17.5 Контрольные задания
- •Лабораторная работа № 18 Передача параметров в функцию
- •18.1 Теоретические сведения
- •18.2 Передача параметров функции main
- •18.3 Примеры передачи структур данных по адресу
- •Int main(void) /* вывод строки в верхнем регистре */
- •Void arrprint (int*a, int n, int m);// прототип функции
- •Int *a; // указатель на массив
- •Int **a; // память под массив указателей на строку
- •18.4 Практические задания
- •18.5 Контрольные задания
- •Лабораторная работа № 19 алгоритмы сортировки
- •19.1 Теоретические сведения
- •19.2 Практические задания
- •Заключение
- •Библиографический список
- •Приложение
- •3 96006, Воронеж, ул. 20-летия Октября,84
10.2 Приемы инициализации и заполнения массивов случайными числами
При отладке программ возникает необходимость заполнить массив некоторыми значениями, если массив небольшой, то это можно сделать явно:
double a[]={-12.6, 2e-2, 123, 2.1e14, 2.5};
Или заполнить константами в цикле:
for(i=0; i<n; i++)a[i]=MYCONST;
Но лучше заполнить случайными числами. Случайные числа могут быть сгенерированы функцией стандартной библиотеки Си rand(), которая генерирует числа в диапазоне от 0 до RAND_MAX и возвращает число типа unsigned long. Функция rand() не имеет аргументов. Константа RAND_MAXи прототип функции rand() объявлены в <stdlib.h>.
Так как возможна генерация числа только по определенному алгоритму, то для превращения функции rand в генератор действительно случайных чисел, нужно его каждый раз инициировать неким случайным числом. Для этого следует использовать функцию srand (unsigned seed), которая в качестве аргумента seed получает некоторое число, которое определяет последовательность генерации случайных чисел функцией rand.
srand (12);
Если этим числом будет системное время, тогда при каждом запуске программы будет происходить инициализация генератора «новым значением», и, как следствие, создаваться неповторяемаяпоследовательность чисел.
/* объявление необходимых переменных */
int stime;
longl time;
/* получает текущее календарное время */
ltime = time(NULL);
/* преобразование его к типу int */
stime = (unsigned) ltime/2;
/* инициализация генератора */
srand(stime);
За одно обращение к функции rand можно получить одно случайное число в диапазоне от 0 до RAND_MAX. Для получения случайного целого числа m в заданном диапазоне от A до B, необходимо выполнить преобразование:
m = A+ rand() % (B -A);
Если необходимо заполнить массив случайными числами вещественного типа, то вещественное число в интервале от 0 до 1 может быть получено:
x=1.* rand()/RAND_MAX
Заполнение массива случайными вещественными числами в интервале от XMIN до XMAX может быть организовано
for(i=0; i<N; i++)
a[i]=XMIN+1.f*(XMAX-XMIN)*rand()/RAND_MAX;
Константы диапазонов генерации чисел удобно задавать с использованием директив препроцессора:
#define XMAX 112.4
Подобное управление размерами и параметрами массива на этапе препроцессорной обработки позволяет легко менять их размер и другие связанные с ними параметры.
#define NMAX 10 //определение размера массива
main()
{
int value[NMAX];
for(i=0;i<NMAX; i++) value[i]=100-i*10;
}
10.3 Примеры работы с массивами
Пример 1. Ввод элементов массива с клавиатуры
#include<stdio.h>
void main(void)
{
double a[100], с;
intn, i;
printf("Введите количество чисел n = ");
scanf("%d", &n);
if( n>(sizeof a)/sizeof(double) )
{ printf("Слишком много элементов\n"); return; }
for(i=0; i<n; i++)
{
printf("a[%d] = ", i);
scanf("%lf", &c);
a[i]=с;
}
/* Операторы, обрабатывающие массив */
}
Во многих случаях удобно возложить на программу подсчет числа элементов, вводимого массива, при этом ввод завершается при появлении во входном потоке признака конца данных. Таким признаком в следующей программе служит число большее 1.0e300
#include<stdio.h>
void main(void)
{
double a[100], temp; int n, end;
for(end=n=0; n<(sizeof a)/sizeof(double); n++)
{
printf("a[%d] = ", n); scanf("%lf", &temp);
if( temp>=1.0e300 ) { end=1; break; }
a[n] = temp;
}
if( end )
{
/* Операторы, обрабатывающие массив */
}
else
printf("Переполнение массива\n");
}
Пример 2. Инициализация массива случайными числами
#include<stdlib.h>
#include <stdio.h>
#define XMIN 5
#define XMAX 15
void main(void)
{
int N, i;
float a[100];
printf("Введите количество чисел n = ");
scanf("%d", &N);
if(N>100)
{ printf("Слишком много элементов\n"); return; }
for(i=0; i<N; i++)
a[i]=XMIN+1.f*(XMAX-XMIN)*rand()/RAND_MAX;
// Обработка массива
}
Пример 3. Печать массива, заполненного случайными числами
main()
{
int s[10];
printf("Массив заполнится числами в заданном диапазоне от -10 до 20: \n");
srand(time(NULL)|clock());
for (int i=0;i<10;i++)
s[i]=-10+rand()%31;
printf("получен массив с целочисленными элементами\n");
for (int i=0;i<10;i++)
printf("\n s[%d]= %d", i, s[i]);
}
Комментарий к примеру
Функция srand осуществляет инициализацию генератора случайных чисел. Функция time возвращает текущее календарное время системы. Эта функция вызывается с нулевым указателем. Функция clock возвращает приблизительное процессорное время, потраченное на работу с программой. Таким образом, в качестве аргумента функции srand всегда будет новое неповторяющееся значение. Объявления этих функций в заголовочных файлах ctime.hи stdlib.h.
Пример 4. Формирование нового массива со значениями элементов, равными корню квадратному из значений исходного массива и вывод их на печать в виде таблицы
main()
{
int A[10],B[10], i;
// Инициализация массива А
printf("Индекс | Новый | Старый");
for(i=0; i<10; i++)
{
B[i]=sqrt(A[i]);
printf("\n%-7d|%7.2f|%7.2f", i, B[i], A[i]);
}
return;
}