Автор: Пользователь скрыл имя, 22 Декабря 2011 в 20:19, курс лекций
Под табуляцией функции понимается вычисление значений функции в зависимости от аргумента, который меняется в определенных пределах с постоянным шагом. Решение задачи табуляции является достаточно характерным примером реализации циклического алгоритма.
1. Табуляция функции 4
1.1. Практические задания 6
2. Методы нахождения корней уравнений 8
2.1. Метод половинного деления 8
2.2. Итерационные методы 10
2.3. Практические задания 15
3. Вычисление определенного интеграла 16
3.1. Практические задания 19
4. Вычисление конечных сумм 20
4.1. Практические задания 24
5. Индексированные переменные 26
5.1. Одномерный массив 26
5.2. Практические задания 30
5.3. Двумерный массив 32
5.4. Практические задания 38
6. Решение системы линейных алгебраических
уравнений методом Гаусса 41
6.1. Практические задания 44
Литература 46
Упорядоченное множество данных может быть представлено в виде так называемых регулярных типов или массивов. Для задания массива требуется указать его имя (идентификатор), тип входящих в него элементов, размер, равный количеству элементов в массиве, а также размерность (вектор, матрица, трехмерный массив и т. д.), равную количеству индексов, необходимых для доступа к отдельным элементам.
Объявление
массива сводится к указанию типа
его элементов и количества элементов.
Общий вид оператора объявления индексированных
переменных имеет вид:
идентификатор_типа
имя_массива [размер][размер]
Например, объявление массива целых
чисел размером в 10 элементов
имеет следующий вид:
int x[10];
Размер массива задается целой константой. Тип элемента массива может быть любым.
Размер массива, определяемый количеством его элементов, в Си фиксируется при его объявлении в программе и не может быть изменён в процессе её выполнения. Отсюда совет: при написании достаточно общего (массового) алгоритма следует выбирать границы массива с запасом, помня о том, что при компиляции программы под используемый в ней массив выделяется не более 1 Мбайт оперативной памяти (для приложений MS DOS не более 64 Кбайт).
Преимущества использования в программах массивов, к элементам которых обращаются с помощью индексированных переменных, наиболее явно проявляются в том случае, когда необходимо производить одинаковые операции над большим количеством чисел. Так как элементы массива обозначаются одним именем и различаются лишь местоположением (индексом), алгоритм решения таких задач основывается на циклическом повторении некоторой операции, причем параметром цикла, как правило, является индекс. В тексте программы для обозначения элементов массива используется имя массива, а далее в квадратных скобках указывается индекс элемента массива. Индексация элементов массива в программах, написанных на языке Cи, всегда начинается с 0.
Пример
подобного алгоритма - ввод и вывод одномерных
массивов с известным количеством элементов.
Ниже представлен листинг программы подсчета
итоговой суммы заработной платы некоторого
подразделения:
/* Ввод и вывод массива */
#include <stdio.h>
#include
<stdlib.h>
int main()
{
const int NumOfMen=30;
unsigned int n,s,i;
unsigned int Salary[NumOfMen];
printf("Количество сотрудников?\n");
scanf( "%u", &n);
if ((n==0) || (n>NumOfMen))
{
printf("Ошибка! Недопустимое количество сотрудников?\n");
exit(4);
}
printf("Вводите значения зарплат \n ");
s=0;
/* Цикл ввода и суммирования */
for(i=0;i<n;i++)
{
printf(" %u -я зарплата: ",i+1);
scanf("%u", &Salary[i]);
s = s+Salary[i];
}
for(i = 0; i< n; i++)
printf( "%u \t \n",Salary[i]); /*При выводе разделяем числа
printf("Сумма зарплат равна %u: \n", s);
rewind(stdin); /* рекомендуется вызывать
перед использованием
фунций символьного ввода из стандартного
файла ввода */
getchar();
}
Весьма часто приходится сталкиваться с задачей упорядочения числовых массивов, т. е. расположения элементов исходного набора данных в порядке возрастания или убывания. Эта задача, поставленная в общем виде, называется задачей сортировки.
Сортировка - перегруппировка заданного множества объектов в некотором определенном порядке. Цель сортировки - облегчить поиск отдельных элементов в таком отсортированном множестве (телефонная книга, оглавление книги, библиотеки, словари, склады и т. д.).
Основным условием алгоритма сортировки обычно является экономное использование доступной памяти: перестановки должны выполняться на том же месте, где расположен исходный массив, и количество дополнительно используемых ячеек памяти должно быть минимально. В качестве примера приведена программа сортировки методом “пузырька” или, по-другому, методом прямого обмена.
Метод основан на поочерёдном сравнении стоящих рядом элементов массива; если порядок в паре неправилен, элементы меняются местами. Для выполнения такой перестановки требуется одна дополнительная ячейка памяти.
Ниже
приведен листинг программы сортировки
по убыванию числового одномерного массива,
написанный на языке Си.
/* Программа сортировки методом
пузырька */
#include <stdio.h>
#include
<stdlib.h>
int main()
{
int i, j, j1, n, n1;
double t, x[1000];
printf("Введите длину последовательности: ");
scanf("%d", &n);
for(i = 0; i< n; i++)
{
printf(" Введите %d -й элемент: ", i);
scanf("%lf", &x[i]);
}
printf("Для запуска
getchar();
n1= n-1;
for(i = n-1; i>=0; i--)
for(j = 0; j<i; j++)
{
j1 = j+1;
if (x[j] < x[j1])
{ /* перестановка элементов */
t = x[j];
x[j] = x[j1];
x[j1] = t;
}
}
printf("Сортировка закончена.
задайте число элементов в строке вывода ");
scanf("%d", &j);
for(i = 0; i< n; i++)
{
printf("%8.1lf", x[i]);
if ((i+1)% j == 0) printf("\n");
}
printf("Для завершения нажмите (Enter)");
rewind(stdin); /*рекомендуется вызывать
перед использованием
фунций
символьного ввода из стандартного файла
ввода */
getchar();
return 0;
}
Выбрать из массива x положительные компоненты и переписать их в массив b(b1,b2,...,bn).
Существует большой класс задач, решение которых основано на знании выводов векторной алгебры (математики). Наиболее известной из таких задач является разрешение системы линейных уравнений. Для того, чтобы с наименьшими затратами можно было перенести решения (формулы с индексными переменными) различных задач из векторной алгебры в программу, разработчики языка Си стремились максимально сблизить форму записи математических выражений на этом языке к той, что используется в математике. Так, если в математике для описания элемента матрицы A используется запись типа aij, то в Си для описания элемента двумерного массива - a[i][j].
Первое, с чем сталкивается программист при работе массивами, - это их ввод и вывод. В Си для ввода элементов массива через клавиатуру предлагается функция scanf(), а для вывода на экран - функция printf(). Следует, однако, добавить, что среди стандартных функций ввода/вывода существуют и другие способы ввода/вывода массивов. Один из таких способов ввода будет рассмотрен ниже.
Рассмотрим
ввод двумерного массива с помощью
клавиатуры подробнее. Для этого нам понадобится
использовать два цикла, первый из которых
для определенности назовем циклом по
строкам, а второй цикл, вложенный в первый, -
циклом по столбцам. Понятно, что для компьютера
порядок перебора элементов безразличен,
однако для "придания вводу массива
больших человеческих черт" будет использован
указанный выше порядок, т. е. сначала вводятся
элементы первой строки, затем второй,
далее третьей и т. д. - точно так же как
это делается при написании обычного текста.
Кроме того, для определенности примем,
что в обозначении массива a[i][j] (так же,
как в математике) значение первой переменной
i будет соответствовать номеру строки,
а второй переменной j - номеру столбца. В качестве
примера ввода и вывода элементов массива
может служить следующая программа:
#include <stdio.h>
#include
<stdlib.h>
int main()
{