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