Главная страница

Шпаргалка по языку СИ. Конспект Лекций «программирование На Языке Высокого Уровня Си» П. Конспект лекций для студентов высших учебных заведений, обучающихся по специальности 230102. 65 Автоматизированные системы обработки информации и управления


Скачать 1.25 Mb.
НазваниеКонспект лекций для студентов высших учебных заведений, обучающихся по специальности 230102. 65 Автоматизированные системы обработки информации и управления
АнкорШпаргалка по языку СИ
Дата26.05.2022
Размер1.25 Mb.
Формат файлаpdf
Имя файлаКонспект Лекций «программирование На Языке Высокого Уровня Си» П.pdf
ТипКонспект лекций
#550544
страница15 из 15
1   ...   7   8   9   10   11   12   13   14   15
#include
#include
#include
#include
#include
// таблица из учебника по вычислительной математике
float x[6] = {1.5, 1.54, 1.56, 1.60, 1.63, 1.70};
float y[6] = {3.873, 3.924, 3.950, 4.00, 4.037, 4.123};
/* Функция, вычисляющая коэффициенты Лагранжа
x - аргумент функции
n - степень многочлена (или число x-ов)
i - номер узла
*/
float L(float xp, int n, int i)
{
// числитель и знаменатель
float Chesl;
float Znam;
Chesl = 1;
Znam = 1;
int k;
// вычисление числителя
for (k = 0; k != n; k++ )
{
if (k == i) continue;
// убираем множитель x - x(i)
Chesl *= xp - x[k];
}
// вычисление знаменателя
for (k= 0; k!= n; k++)
{
if (x[i] == x[k]) continue;
// убираем, а то ноль в знаменателе
Znam *= x[i] - x[k];
}
return Chesl / Znam;
}
int main()
{
212

// вычисляем степень полинома
int n = sizeof(y) / sizeof(float);
// начальное значение
float R = 0;
// произвольная точка для проверки
float px = 1.55;
// вычисляем значение интерполяционного многочлена в точке должно
получиться 3. 937075
for (int i = 0; i != n; i++)
{
R += y[i] * L(px,n,i);
}
printf("Результат : %f \n",R);
system ("pause");
}
Результат выполнения программы
Результат : 3.937075
Пример 17. Алгоритм вычисление квадратного корня по алгоритму
Ньютона.
Для вычисления квадратного корня в этом примере использован метод
Ньютона. Рассмотрены машинно-зависимый и машинно-независимый варианты.
Перед применением алгоритма Ньютона область определения исходного числа сужается до [0.5,2] (во втором варианте до [1,16]). Второй вариант машинно- независим, но работает дольше.
Вообще, это не самый быстрый вариант, но один из самых быстрых.
Основная проблема заключается в том, что нет универсального машинного представления чисел с плавающей точкой, поэтому разделение числа на мантиссу и двоичную экспоненту как составляющих его компьютерного представления нельзя записать единым образом. Имено поэтому подключено описание математической библиотеки, из которой, впрочем, используются только frexp() и ldexp(). Конкретная реализация этих функций очень проста, но машинно-зависима. При разделении числа на мантиссу и экспоненту, мантисса оказывается в пределах [0.5,1). Если при этом экспонента нечетная, мантисса умножается на 2, тем самым область определения становится [0.5,2). К мантиссе применяется алгоритм Ньютона с начальным приближением 1. Окончательный результат получается с помощью применения ldexp() с половинным значением экспоненты.
213

Для машинно-независимого варианта выделение экспоненты заменяется серией последовательных делений исходного значения на 16, пока аргумент не станет определяться на интервале [1,16]. Если исходный аргумент был меньше 1, то перед серией делений обращаем его. Алгоритм Ньютона применяется с начальным приближением 2. Окончательный результат получается серией последовательных умножений на 4 и дальнейшим обращением, если аргумент обращался.
Сам алгоритм Ньютона для вычисления a = Sqroot(x) представляет быстро сходящуюся (при хорошем начальном приближении) серию итераций: a
i
+1=0.5*(a i
+x/a i
), где i

номер итерации.
#include
#include
#include
#include
#include
/* для одинарной точности нужны 4 итерации */
#define ITNUM 4
/*
Разложение квадратного корня аргумента в мантиссу и экспонент (быстрый
алгоритм):
float Sqroot (float x);
Вычисление квадратного корня без использования внешних фукнций (медленнее, но
машинно-независим):
float Sqroot1 (float x);
В случае некорректного промежутка (x<0.) фукнции возвращают 0 и не генерят
ошибку.
*/
/* вариант с использованием внешних фукнций разложения/объединения на [0.5,1]
*/
float Sqroot (float x)
{
int expo, i;
float a, b;
if (x <= 0.F) return (0.F);
/* разложение x в мантиссу на промежутке [0.5,1) и экспонент.
Машинно-зависимые операции представлены вызовами функций. */
x = frexp (x, &expo);
/* нечетный экспонент: умножаем мантиссу на 2 и уменьшаем экспонент, делая его
четным.
Теперь мантисса в промежутке [0.5,2.) */
if (expo & 1)
{
x *= 2.F;
expo--;
}
/* начальное приближение */
a = 1.F;
214

for (i = ITNUM; i > 0; i--)
{
b = x / a;
a += b;
a *= 0.5F;
}
/* делим экспонент на 2 и объединяем результат.
Фукнция ldexp() противоположна frexp. */
a = ldexp(a, expo / 2);
return (a);
}
/* Вариант без использования библиотек. Промежуток уменьшен до [1,16].
Используется 16 повторяющихся делений. */
float Sqroot1 (float x)
{
int sp = 0, i, inv = 0;
float a, b;
if (x <= 0.F) return (0.F);
/* аргумент меньше 1 : инвертируем его */
if (x < 1.F)
{
x = 1.F / x;
inv = 1;
}
/* последовательно делим на 16 пока аргумент не станет <16 */
while (x > 16.F)
{
sp++;
x /= 16.F;
}
/* начальное приближение */
a = 2.F;
/* Алгоритм Ньютона */
for (i = ITNUM; i > 0; i--)
{
b = x / a;
a += b;
a *= 0.5F;
}
while (sp > 0)
{
sp--;
a *= 4.F;
}
/* инвертируем результат для инвертированнго аргумента */
if (inv) a = 1.F / a;
return (a);
}
int main()
{
float x;
printf ("Введите число : ");
scanf ("%f", &x);
printf ("\nРезультат с использованием стандартных библиотек : %f\n",
Sqroot(x));
printf ("Результат без использования стандартных библиотек : %f\n",
Sqroot1(x));
system ("pause");
}
215

Результат выполнения программы
Введите число : 35
Результат с использованием стандартных библиотек : 5.916080
Результат без использования стандартных библиотек : 5.916080
Приложение 3. Лабораторные работы
Лабораторная работа №1
Задание 1. Необходимо прочитать значения трех вещественных переменных a, b, h. И вычислить последовательность значений функции f(x)=x2+x+4 на отрезке [a;b], с шагом h>0.
Задание 2. Разработать программу для поиска корней квадратного уравнения.
Лабораторная работа №2
Задание 1. Ввести с клавиатуры 3 целых числа. Определить и выдать на экран те числа, которые попадают в диапазон от 2 до 5. Если число попадает на границу интервала, то сообщить об этом.
Задание 2. Дан ряд действительных чисел. Получить минимальное и максимальное число. Количество и сами числа вводятся пользователем.
Задание 3. Пусть D- закрашенная часть плоскости на рисунке. Вычислить значение функции U, если
Задание 4. Дано натуральное число N типа int. Вывести в столбик это число.
216
(
)
2 1 ,
,
,
xесли x y
D
U
x yвпротивномслучае




=

+



Лабораторная работа №3
Задание 1. Используя массив, посчитать степень числа 2 от 0 до 20 и вывести на экран результаты в следующем виде:
2^0 = 1
2^1 = 2
2^2 = 4

2^20 = 1048576
Задание 2. Ввести с клавиатуры 10 целых чисел в массив A. Переписать их в массив B. При этом если число в массиве A отрицательно, то в массив B на соответствующее место заносить 0. Вывести A и B.
Задание 3. Ввести нечетные размеры матрицы А и ввести значения элементов массива. Переписать их в массив В. При этом поститать сумму элементов главной диагонали и произведение элементов обратной диагонали.
Вывести А, В, сумму и произведение.
Задание 4. Ввести число N – порядок квадратной матрицы.
Последовательно по строкам ввести с клавиатуры все элементы матрицы.
Вывести матрицу на экран и сообщить, какой элемент является минимальным и его координаты, а какой максимальным и его координаты.
Лабораторная работа №4
Задание 1. Ввести с клавиатуры натуральное число N. С помощью цикла вычислить:
1.
2
N
2.
N!
3.
2 1
1 1
N
i
П
i
=


+




4.
(
)
2 2
2 2 , Nкорней
+
+
+

K
Задание 2. Ввести с клавиатуры действительное число A и натуральное число N. Вычислить с помощью цикла:
1.
A
N
217

2.
2 1
1
N
N
i
A

=

Задание 3. Получить целочисленную квадратную матрицу с любой размерностью, элементами которой являются числа 1, 2, … , расположенные в матрице по спирали.
Лабораторная работа №5
Задание 1. Вычислить факториал числа, используя рекурсивную процедуру.
Задание 2. Даны два вектора A и B. Найти сумму их минимальных и сумму их максимальных элементов, используя две процедуры: поиск минимального элемента и поиск максимального элемента вектора.
Задание 3. Составить процедуру, результатом работы которой является истинное значение, если символ, передаваемый в процедуру, является буквой, и ложное значение в противном случае. В программе эту процедуру использовать в цикле и выдавать сообщение на экран о нажатых клавишах (т.е. если нажата буква, сообщать ИСТИНА, цифра – ЛОЖЬ).
Задание 4. Составить процедуру, позволяющую определить позицию самого правого вхождения заданного символа в исходный массив строк. Если строка не содержит символа, результатом работы процедуры является значение
«–1».
Лабораторная работа №6
Задание 1. Пусть даны натуральные числа m и n. Используя алгоритм
Евклида найти НОД и НОК.
Задание 2. Вывести на экран все числа Фибоначчи от 1 до N. Где N вводится с клавиатуры.
Задание 3. Вычислить НОД, используя не рекурсивный алгоритм.
Примечание.
Алгоритм Евклида о нахождении НОД.
218

Пусть m и n одновременно неравные 0 целые неотрицательные числа и пусть m ≥ n. Тогда если n = 0, то НОД (n,m) = m; если n ≠ 0, то для чисел m, n, r
(где r – остаток от деления m на n) выполняется равенство НОД(m,n) = НОД(n,r).
Числа Фибоначчи: U
0
=0, U
1
=1, U
i
= U
i
-1 + U
i
-2.
Лабораторная работа №7
Задание 1. Необходимо чтобы информация, набираемая на клавиатуре, записывалась в файл с именем a.txt.
Задание 2. Дан текстовый файл с записанным в него текстом. Необходимо ввести с клавиатуры строку символов и выдавать на экран номер позиции в текстовом файле, начиная с которой эта подстрока в нём встречается, и соответствующее сообщение, если этой подстроки нет.
Задание 3. Ввести с клавиатуры целые числа. Записать их в файл. В конце файла записать сумму этих чисел и их среднее арифметическое.
Задание 4. Ввести с клавиатуры вещественные числа и вывести в файл эти числа. В конце вывести среднее геометрическое этих чисел.
Задание 5. Дан файл, в котором находятся 6 вещественных чисел, которые представляют собой координаты трех вершин треугольника. Выдать на экран, какого типа этот треугольник (равносторонний, равнобедренный, прямоугольный, тупоугольный, остроугольный), углы треугольника и могут ли эти три точки являться вершинами треугольника.
Лабораторная работа №8
Задание 1. Разработать программу копирования нетипизированного файла.
Задание 2. Используя структуры разработать программу сложения и умножения комплексных чисел.
Задание 3. Дан файл f, компоненты которого являются целыми числами.
Получить файл g, образованный из файла f исключением повторных вхождений одного и того же числа.
Задание 4. Создать файл, в котором содержались бы данные о студентах.
Необходимо ввести данные с клавиатуры, записать их в файл, вывести
219
содержимое из файла на экран и удалить любую информацию о каком либо студенте по его фамилии.
Лабораторная работа №9
Используя структур и указатели, а также функции динамического распределения памяти, реализовать программу для алгоритма Дейкстра. Учесть ошибки ввода.
Лабораторная работа №10
Программа по созданию двухсвязного списка студентов содержащего следующую информацию о них:

Фамилия;

Стипендия;

Группа;

Номер зачетной книжки;
Разработать следующие функции и процедуры:
1. Функция создания списка.
2. Процедура вставки узла после текущего.
3. Процедура удаления текущего узла (учесть, что текущий узел может совпадать с головой списка, с хвостом списка, быть единственным элементом в списке).
4. Процедура обхода и вывода списка на экран.
5. Процедура добавления узла в голову списка, в хвост, перед текущим узлом.
6. Процедура поиска данных в списке по фамилии, стипендии, группе, номеру зачетной книжки (учесть возможность поиска по стипендии с условиями >, <, =).
7. Функции или процедуры, позволяющий сохранять введенный список в файле и считывать данные из файла в новый список.
8. Организовать текстовое меню, позволяющее пользователю осуществлять любые из указанных выше действий.
220

Лабораторная работа №11
Разработать программу создания и отображения генеалогического дерева.
Реализовать:
1. Процедуру ввода узлов дерева.
2. Процедуру удаления поддеревьев.
3. Процедуры обхода дерева: префиксным способом, инфиксным способом, суффиксным способом.
4. Процедуру записи структуры дерева в файл и чтения структуры дерева из файла.
5. Функцию сравнения поддеревьев.
Лабораторная работа №12
Разработать программу игры «Змейка». На игровом поле случайным образом выводятся знаки $. Случайным образом определяется точка начала игры. Вверху экрана отображается счет (количество собранных $), в начале игры определяется уровень сложности 1, 2, 3 (время игры).
Список литературы
Основная
1. Брайан Керниган, Деннис Ритчи. Язык программирования C: Вильямс, 2009 г. – 304 с.
2. Громов Ю.Ю.,Татаренко С.И. Программирование на языке СИ: Учебное пособие. –
Тамбов,1995.- 169 с.
3. Попов Д.И. Программирование на языке высокого уровня Паскаль: конспект лекций
/ Д.И.Попов. – М.: МГУП, 2009. – 202 с.
4. Семакин И.Г., Шестаков А.П. Основы программирования.–М: Academia, 2007–423с.
Дополнительная
1.
Скляров В.А. Программирование на языках Си и Си++.- М.: Высшая школа, 1996.
2.
Дейкстра Э.В. Дисциплина программирования. М.: Мир, 1978, 275 с.
3.
Керниган Б.В., Плоджер Ф.Д. Элементы стиля программирования. М.: Радио и связь, 1984, 304 с.
4.
Подбельский В.В., Фомин С.С. Программирование на языке Си. Учеб. пособие.- М.: Финансы и статистика, 2000.
5.
Павловская Т.А. C/C++, Программирование на языке высокого уровня.- СПб.: Питер, 2005.
6.
Касаткин А.И. Профессиональное программирование на языке Си. Системное программирование.- Минск: Высшая школа,
1993.
7.
Касаткин А.И. Профессиональное программирование на языке Си. Управление ресурсами.- Минск: Высшая школа, 1993.
Web – ресурсы:
1.
http://msdn.microsoft.com
2.
http://www.citforum.ru
3.
http://www.codenet.ru
4.
http://ru.wikipedia.org
5.
http://www.cyberguru.ru
221
1   ...   7   8   9   10   11   12   13   14   15


написать администратору сайта