4372

Программирование на языках высокого уровня, лабораторный практикум

Книга

Информатика, кибернетика и программирование

Программирование на языках высокого уровня, включающей алгоритмизацию задач и изучение подмножества языка Си в средах программирования Borland C++ и Microsoft Visual C++, а также в приобретении практических навыков работы с персональным компьютером.

Русский

2015-01-14

305.5 KB

35 чел.

Введение

Цель данных лабораторных работ состоит в закреплении теоретических основ первой части курса "Программирование на языках высокого уровня", включающей алгоритмизацию задач и изучение подмножества языка Си в средах программирования Borland C++ и Microsoft Visual C++, а также в приобретении практических навыков работы с персональным компьютером.

Все работы проводятся в лаборатории, оборудованной персональными компьютерами под управлением ОС MS Windows. Студенты, впервые приступающие к работе, обязаны пройти инструктаж по технике безопасности и расписаться в соответствующем журнале. К выполнению лабораторных работ допускаются только студенты, получившие допуск преподавателя после собеседования об основных возможностях среды "Far manager", интегрированной среды программирования "Borland C++" и "MS Visual Studio" и имеющие полностью готовые к вводу в ЭВМ варианты программ.

ПОРЯДОК ВЫПОЛНЕНИЯ ЛАБОРАТОРНЫХ РАБОТ

1. До начала занятия в компьютерном классе студент должен ознакомиться с заданием на лабораторную работу. Выбрать алгоритм для решения задачи, составить описывающую его блок-схему, и написать программу на алгоритмическом языке Си для решения задачи соответствующего варианта. (Номер варианта задается преподавателем.) Программа должна удовлетворять следующим основным требованиям:

а) массовость, т.е. должна быть работоспособной, без изменения текста программы, для любых значений параметров задачи, удовлетворяющих заданным ограничениям (например на размеры матриц);

б) дискретность, т.е. должна состоять из блоков, в каждом из которых решается самостоятельная "подзадача" (например, ввод исходного значения переменной, ввод массива с консоли, выдача матрицы на терминал). Для обеспечения читаемости программы всячески поощряется использование имен, переменных, отражающих их функциональное назначение в программе (использовать т.н. "венгерскую нотацию", например, line -- для номера строки матрицы, matr -- для двумерного массива и т.п.), дополнительных пробелов, табуляции, пустых строк, комментариев (при необходимости) и т.п. для разделения функционально самостоятельных блоков программы, выделения вложенных циклов и т.д. для улучшения читаемости текста программы;

в) должна быть защищена от неправильного ввода исходных данных. Для обеспечения этого, вводу параметров с консоли должны предшествовать текстовые приглашения, а после их ввода, для контроля правильности, они должны выводиться на консоль. Рекомендуется включать в программу блоки контроля значений вводимых параметров на их соответствие "физике" решаемой задачи, допустимому интервалу значений данного параметра, с выдачей соответствующих диагностических сообщений;

г) вывод должен сопровождаться соответствующими пояснениями; цифровую информацию необходимо располагать в удобном для восприятия виде (матрицы, например, распечатывать в виде таблиц с соответствующим числом столбцов и строк).

Специфические требования к программам указаны в заданиях.

2. Получить у преподавателя численные данные для двух контрольных примеров, составить два файла исходных данных для их ввода в программу с использованием операторов DOS для переназначения потоков ввода-вывода: "<" и ">": Например, организовать перенаправление экранного вывода программы Lab1_1.exe в файл dest_1.txt можно следующим образом:

"C:\STUDENT\>Lab_1.exe > dest_1.txt [Enter]"

3. Загрузить систему программирования, набрать текст программы и, отладив ее, выполнить задание, подготовить к печати результат программного ввода-вывода.

4. Оформить отчет по лабораторной работе.

ОФОРМЛЕНИЕ ОТЧЕТОВ

Отчеты следует оформлять либо в тонкой тетради, либо в папке на печатных листах формата А4. Допускаются отчеты, как в рукописном, так и машинописном исполнении.

Каждый отчет должен содержать:

  1.  формулировку задачи;
  2.  описание используемых алгоритмов;
  3.  блок-схему для выбранного алгоритма;
  4.  численные данные конкретных примеров;
  5.  распечатку файлов исходных данных, текста программы и результатов ее работы (приклеить в сложенном виде).

Для повышения продуктивности работы студентов в лаборатории, рекомендуется использовать съемные устройства (дискеты и flash-накопители) для хранения текстов рабочих программ. В таком случае допускается оформление отчета по лабораторной работе в виде одного файла, начинающегося с комментария, в котором помещается вся информация, перечисленная в пунктах 1) и 2) содержания отчетов, затем текст Си-программы и закомментированные результаты работы программы, в которых для контроля должны быть выведены и исходные данные задачи (это можно легко сделать при запуске программы перенаправив стандартный ввод на файл с исходными данными input.dat, а вывод в - файл с исходным текстом вашей программы:

 "D:\progr.exe>progr.cpp"

Лабораторная работа №1

Знакомство со средой разработки Borland C++3.1. Создание и отладка простых консольных приложений на языке Си.

Лабораторная работа состоит из двух частей:

  1.  Изучение последовательности выполнения операций при выполнении процесса компиляции и сборки программы.
  2.  Составление простых программ на Си, их запуск и отладка в интегрированной среде разработки (IDE). В данной части студенты должны выполнить следующие задания

Первая часть выполняется студентами в компьютерном классе под руководством преподавателя. Вторую часть они начинают делать в классе и завершают ее самостоятельно дома. По второй части лабораторной работы студенты сдают отчет.

Задания к первой части работы:

  1.  Знакомство с основными программами пакета BorlandC++.
  2.  Создание, отладка и запуск простых консольных программ под управлением интегрированной среды разработки (IDE) BorlandC++ 3.1.

Студентам предлагается набрать, отладить и запустить под управлением IDE Borland С++ следующие программы. Изучить основные окна и команды используемой IDE, сообщения об ошибках и предупреждения. Ниже следуют кода программ (листинги), подлежащие компиляции и запуску.

Листинг 1.

int main(void) { }

Листинг 2.

int main(void)

{

return 0;

}

Листинг 3.

int main(void)

{

printf("\n\tHello, World!\a");

return 0;

}

Листинг 4.

#include <stdio.h>

int main(void)

{

printf("\n\tHello, World!\a");

return 0;

}

Листинг 5.

#include <stdio.h>

#include <conio.h>

char msg1[40]="\n\tHello, World!\n";

char msg2[40]="\n\tThis is a sample of C-program.\n";

char msg3[40]="\n\tPress ane key to continue.\n";

void ShowMsg(char* );


Листинг 5 (
продолжение).

void DrawLine(int);

int main(void)

 {

    clrscr();

    ShowMsg(msg1);

    DrawLine(45);

    ShowMsg(msg2);

    DrawLine(45);

    ShowMsg(msg3);

    getch();

    clrscr();

    return 0;

 }

void ShowMsg(char* msg)

 {

    puts(msg);

 }

void DrawLine(int len)

 {

    int i;

    for(i=0; i<len; i++)

      putch('*');

 }

Задания ко второй части работы:

1. Напишите программу, запрашивающую у пользователя фамилию, имя и отчества(например: "What is your name?", или "Здравствуй, как тебя зовут?") и выводящую полученные данные в приветствии (например: "Hello, Ivanov Andrei Petrovich", или "Здравствуй, Иванов Иван Иванович.").

2. Напишите программу, печатающую целые числа в различных форматах (десятичном, восьмеричном, шестнадцатеричном), с различными флагами, с различной шириной поля.

3. Напишите программу, печатающую значения с плавающей точкой в разных форматах (обычная десятичная и экспоненциальная форма записи), с разными флагами, с разной шириной поля и точностью.

4. Напишите программу, вычисляющую площадь прямоугольника.

5. Напишите программу, переводящую значения веса из фунтов в килограммы.

6. Напишите программу, вычисляющую сумму вкладу (исходные данные: сумма вклада, процентная ставка и время размещения вклада).

7. Напишите программу, вычисляющую площадь круга.

8. Напишите программу, вычисляющую площадь кольца.

9. Напишите программу, определяющую принадлежность точки с указанными координатами кругу, для которого заданы координаты центра и радиус.

10.  Индивидуальное задание, выполняемое по вариантам, указанным в табл.1. Необходимо составить блок-схему алгоритма и написать программу на языке Си для вычисления значений переменных Y и Z по заданным формулам.

Требования, предъявляемые к разрабатываемым программам:

  1.  массовость, программа должна быть работоспособной без изменения текста программы, для любых значений параметров задачи, удовлетворяющих заданным ограничениям;
  2.  дискретностью, программа должна состоять из блоков, в каждом из которых решается самостоятельная "подзадача". Для обеспечения читаемости программы рекомендуется использовать имена переменных, отражающие их функциональную нагрузку;
  3.  программа должна быть защищена от неправильного ввода данных, то есть, в логику работы программы должен быть заложен механизм анализа допустимости вводимых данных;
  4.  в начале работы программа должна выводить служебное сообщение, описывающее ее назначение (логотип программы), например:

"Нижегородский государственный технический университет"

"Лабораторная работа №1. Задание 1."

"Выполнил студент группы _____  .____________. "

или

"Nizhniy Novgorod Technical University"

"Study work number 1. Task number 1."

"Performed student __________ ________________"

  1.  вывод информации, равно как и запрос на ввод данных должен сопровождаться соответствующими пояснениями.

Программу реализовать с использованием команд форматного ввода-вывода IO (Input/Output) printf(), scanf(). Программа должна выполнять следующие действия: 1) вывести приглашение для ввода значений переменных; 2) произвести проверку корректности вводимых значений; 3) вывести результаты вычислений.

Для вычислений можно использовать математические функции, входящие в состав стандартной библиотеки языка Си, описываемые в файле math.h.

sin(x), cos(x), tan(x) – тригонометрические функции вычисления значений синуса, косинуса и тангенса от заданного значения угла, соответственно (значение x задается в радианах);

asin(x), acos(x), atan(x) – обратные тригонометрические функции arcsin x, acrcos x, arctan x соответственно;

exp(x), sinh(x), cosh(x) – экспонента и гиперболические функции;

log(x) – логарифм натуральный от x, log10(x) – логарифм десятичный от x;

sqrt(x) –корень квадратный из x, причем x≥0, fabs(x) – абсолютное значение x;

ceil(x) – наименьшее целое, большее чем x;

floor(x) – наибольшее целое, меньшее чем x;

pow(x,y) – возведение x в степень y.

Аргументы и значения, возвращаемые всеми математическими функциями, имеют тип double.

Таблица1. Варианты индивидуальных заданий

1.

при a=0.01

 x=0.12

9.

при a=2.53

x=0.7

2.

при a= -5.1

x=4.78

10.

при a=0.75

 x=0.14

3.

при a=2.8

 x=1.29

11. 

при a=1.5

x=3.3

4.

при a= -3.4

x=2.75

12.

при a=0.6

x=0.3

5.

при a= 0.34

x=0.02

13.

при a=-3

x=0.6

6.

при a=2.50

x=3.11

14.

при a=0.35

x=-0.78

7.

при a=2.48

x=0.21

15. Y=

при x=1

a=2.3

8.

при a=0.35

x=0.21

16. Y=2a x+ ln|x+a3|

Z=

При x=2.1

a= 0.2

Контрольные вопросы для собеседования:

  1.  Структура простой консольной программы на языках С и С++.
  2.  Этапы создания программы. Создание исполняемой программы на языке Си.
  3.  Базовые типы данных, машинное представление данных. Модификаторы типов данных.
  4.  Идентификаторы. Объявление и инициализация переменных.
  5.  Область видимости переменных.
  6.  Использование функций printf(), scanf().
  7.  Спецификации форматов ввода-вывода функций printf(), scanf().

ЛАБОРАТОРНАЯ РАБОТА N 2

Массивы. Табличное представление данных

Задание. Написать программу - консольное приложение, работающую в текстовом режиме, обеспечивающую запрос у пользователя ввод значений элементов массива и "табличное" отображение введенных данных в окне приложения. Обеспечить хранение вводимых данных в виде элементов массива. Тип элементов массив взять из табл. 2.

Дополнительные требования к программе:

  1.  каждая переменная при вводе должна располагаться в отдельной строке;
  2.  элементы массива выводятся на экран в виде таблицы, каждая строка которой не должна превышать 80 символов (ширина экрана консольного приложения составляет 80 символов);
  3.  элементы матрицы выводятся построчно, отображаемые данные выравниваются в столбцах;
  4.  в программе должно использоваться максимально возможное количество различных форматов вывода данных функцией printf( ) для целых и вещественных переменных и элементов массивов. То есть, в случае обработки целых чисел диапазон вводимых значений должен быть соразмерен максимальному значению числа типа int , для чисел с плавающей точкой до трех знаков "после запятой".

Методические указания

Перед составлением программы нужно проанализировать задание и определить содержание и последовательность выполнения элементарных действий, необходимых для решения поставленной задачи. Обратить внимание на то, чтобы спецификации формата ввода-вывода переменных в функциях scanf( ) и printf( ) соответствовали типам вводимых (выводимых) переменных.

Таблица2. Параметры создаваемого массива в зависимости от номера варианта

Идентификаторы типа элементов массивов

Идентификаторы типа элементов массивов

Тип данных

Размерность

Тип данных

Размерность

int

float

int

float

1

-

+

4*4

16

+

-

8*2

2

-

+

3*5

17

+

-

8*3

3

-

+

5*3

18

+

-

2*8

4

-

+

2*6

19

+

-

3*8

5

-

+

6*2

20

+

-

9*2

6

+

-

4*3

21

+

-

2*9

7

+

-

3*4

22

+

-

5*5

8

+

-

3*6

23

+

-

4*4

9

+

-

6*3

24

+

-

5*4

10

+

-

4*5

25

+

-

8*2

11

-

+

5*4

26

+

-

8*3

12

-

+

7*2

27

+

-

2*8

13

-

+

7*3

28

+

-

3*8

14

-

+

3*7

29

+

-

4*5

15

-

+

2*7

30

+

-

5*4

Пояснение. Знак плюс "+" в графе типа данных означает использование соответствующего типа данных при объявлении статического массива.

Замечание. Для вариантов с 25 по 30 данные вводятся в 8-ричной системе счисления, а при выводе отформатированной таблицы отображаются в 16-ричной.

Для удовлетворения требования массовости программы необходимо:

  1.  обеспечить возможность размещения исходных числовых массивов максимально допустимой, по условию задачи, длины в блоках памяти, зарезервированных для хранения массивов;
  2.  при каждом использовании программы производить ввод и вывод только тех элементов зарезервированного блока памяти, которые соответствуют элементам вводимого числового массива с конкретно заданными размерами. Для этого необходимо в операторах циклов ввода--вывода данных использовать конкретные размеры массивов, получаемые с консоли в процессе выполнения программы.

При формировании файлов исходных данных необходимо помнить, что функция scanf() при вводе данных сравнивает содержимое своей строки формата и строки файла ввода, и успешный ввод осуществляется лишь в случае, если имеющаяся в них текстовая информация совпадает. В файле исходных данных не должно быть "лишней" текстовой информации (пояснений о соответствии той или иной группы цифр конкретной переменной), если этой текстовой информации нет в строке формата функции scanf( ).

Вопросы для собеседования

  1.  Какие спецификации форматов ввода-вывода данных имеют функции scanf() и printf()? Каким образом организовывать ввод данных для поддержки программной обработка неправильно введенных данных?
    1.  Перенаправление потоков ввода-вывода. Как можно сформировать файл с исходными данными? Потоковые функции для работы с текстовыми файлами fprintf() и fscanf(), их использование для файлового ввода-вывода.
    2.  Как объявляются переменные и массивы на Си, способы доступа к элементам массива? Понятие приведенного индекса для многомерного массива. Особенности адресной арифметики.
    3.  Как вывести результат работы программы в файл?

ЛАБОРАТОРНАЯ РАБОТА N 3

Нелинейные и циклические алгоритмы

Задание. Составить алгоритм и написать программу – консольное приложение, выполняющую набор действий, заданный соответствующим вариантом. Программа должна работать в текстовом режиме, обеспечивать процедуры запроса и ввода данных, сопровождающиеся соответствующими пояснениями. В случае, когда в программе выполняются действия над массивами данных, программный диалог должен начинаться с запроса на ввод размерностей соответствующих массивов с проверкой на корректность введенных данных. Далее должен быть реализован запрос на выбор способа подготовки данных: ручной ввод, либо "автоматическая" программная генерация с использованием функции rand(), с последующей "адаптацией" сгенерированных данных к требованиям программы. При генерации вещественных значений ограничиться тремя цифрами после плавающей точки.

Замечание. В данной лабораторной работе действия выполняются только над статическими массивами. В заданиях, касающихся действий над матрицами, в качестве представления матриц использовать массивы соответствующих размерностей.

Задания.

1. Для заданного натурального числа n < 0xFFFF найти все четные цифры его представления в десятичной системе счисления и вывести на печать заданное число в десятичной системе счисления и найденные цифры или сообщение, если таких цифр нет.

2. Для массива вещественных чисел X[L]={x[i] | i=} (L<100) и вещественных чисел p и t найти произведение и сумму членов последовательности x[0], x[1], ... x[L-1] удовлетворяющих неравенству p < f( x[i] ) < t, где

3. Ввести массив целых чисел A[L] (L<=40). Распечатать каждый элемент исходного массива в отдельной строке в десятичной и в двоичной системах счисления.

4. Ввести целочисленный массив A[L][C], (L<=20, C<=10). Работая с элементами двумерного массива, как с элементами матрицы, переставить местами столбцы с номерами k и l, а затем строчки с номерами l и p. Напечатать исходную и полученную матрицу.

5. Ввести массив целых чисел A[L] (L<=40), вывести его на экран монитора. Преобразовать каждое число исходного массива в число равное сумме цифр, представляющих исходное число в десятичной системе счисления. Вывести получившийся массив на консоль.

6. Для вещественного числа α и целого K (K<=10) сформировать и напечатать массив значений с плавающей точкой B[K][K]:

.

7. Для вектора a[L] и матрицы b[L][L] сформировать и распечатать вектор c[L] из элементов c[i]

i=1...L; L<=10.

8. Для матрицы A[L][L], (L<=20) поменять местами столбцы с максимальным и минимальным элементами и распечатать полученную матрицу или вывести соответствующее сообщение, если они расположены в одном столбце.

9. Для матрицы A[L][L] значений с плавающей точкой, (L<=15) найти индексы (номера строк и столбцов) максимального и минимального элементов и распечатать их.

10. Массив вещественных чисел A[L], (L<=60) упорядочить по возрастанию и вывести на консоль исходный и полученный массивы.

11. Для заданного массива A[L], (L<=60) вещественных чисел и числа δ вычислить массивы x[L] и y[L], где y[i]=sin(x[i]),

.

Сумму бесконечного сходящегося ряда вычислять приближенно с относительной точностью δ.

12. Для заданного массива A[L], (L<=60) вещественных чисел и чисел p и t найти произведение и число элементов последовательности A[i], которые удовлетворяют неравенству p< A[i] < t, а для оставшихся элементов определить, сколько среди них положительных и отрицательных элементов.

13. Для заданного массива A[L], (L<=60) вещественных чисел упорядоченных по возрастанию сформировать массив y[L-1], где

.

Определенный интеграл требуется вычислять методом прямоугольников с разбиением интервала [x[i], x[i+1]] на m частей, где m - задано.

14. Для заданного массива A[L], (L<=200) вещественных чисел и числа b найти и напечатать значение и номер минимального из чисел A[i]>b. Вывести сообщение, если все A[i]< b.

15. Для заданного массива A[L], (L<=60) положительных вещественных чисел сформировать массив b[L] и сумму , где i=1…L:

16. Задан массив x[L], (|x[i]|<1, L<=60). Найти максимальный элемент массива A[L], состоящего из элементов  . Вычисления суммы элементов ряда проводить с абсолютной точностью δ.

17. Для L-мерного вектора X и C-мерного вектора Y (L<=30, C<=50) сформировать C-мерный вектор B из элементов

.

18. Для заданного массива A[L], (L<=60) вещественных чисел найти максимальный и минимальный элементы и поменять их местами. Распечатать исходный и полученный массивы, значения максимального и минимального элементов и их индексы в исходном массиве.

19. Для заданных матриц A[L][C], B[C][K], D[K][L], (L<=10, C<=10, K<=10) определить след (т.е. сумму элементов главной диагонали) матрицы R=A×B×D.

20. Поменять местами элементы массива A[L], (L<=60), равноотстоящие от его концов. Распечатать исходный и полученный массив, значение его максимального элемента и значения соответствующих ему индексов в исходном и преобразованном массиве.

21. Распечатать таблицу значений функции

для x изменяющегося в интервале [d,c) с шагом hx, а y - с шагом hy в интервале [l,p). x и y - независимые переменные. Таблица должна быть выведена так, чтобы в каждой строке располагались значения, соответствующие фиксированному значению y и разным значениям x, а в каждом столбце -фиксированным значениям x и разным значениям y.

22. Для заданной матрицы A[L][L], (L<=15) поменять местами минимальный элемент главной диагонали и максимальный элемент побочной диагонали. Вывести на печать полученную матрицу, найденные максимальный и минимальный элементы и их индексы в исходной матрице.

23. Для заданной матрицы A[L][C], (L<=15, C<=10) сформировать вектор D из номеров столбцов исходной матрицы, в которых содержатся только положительные элементы. Напечатать общее количество положительных элементов исходной матрицы, элементы вектора D и его размерность или соответствующие сообщения, если таких столбцов нет или все элементы матрицы отрицательны.

24. Для заданных матриц a[L][L] и b[L][L] (L<=15) сформировать и напечатать матрицу c[L][L] из элементов

25. Для заданной матрицы A[L][C], (L<=15, C<=10) и числа P сформировать вектор D из номеров строк, значение наибольшего элемента которых меньше P. Вывести на консоль матрицу, вектор и его размерность.

26. Для заданной матрицы A[L][C], (L<=15, C<=10) определить и распечатать сумму максимальных элементов ее строк.

27. Для заданной матрицы A[L][C], (L<=15, C<=10) определить и распечатать минимальный из элементов, у которых сумма индексов строки и столбца делится на целое число div без остатка. Вывести соответствующее сообщение, если таких элементов нет.

28. Для заданной целочисленной матрицы A[L][C], (L<=15, C<=10) сформировать вектор B, состоящий из четных элементов матрицы A, и вектор C - из нечетных элементов исходной матрицы и распечатать матрицу, вектора и, при необходимости, сообщение, если один из векторов пустой.

Методические указания

В условиях задач использованы обозначения: A[i][j], B[i][j], C[i][j] - элементы i-й строки j-го столбца матриц A, B, C соответственно.

Приближенный расчет суммы сходящегося бесконечного ряда вида S(x)=r0(x)+r1(x)+r2(x)+ ... с абсолютной точностью δ означает вычисление . При расчете с относительной точностью δ сумма ограничивается элементом rn(x), который удовлетворяет неравенству |rn(x)/Sn(x)|≤δ.

При отладке программ рекомендуется не выводить на консоль промежуточные результаты, а "отслеживать" их значения с использованием средств внутреннего отладчика интегрированной среды Borland C++ (все имеющиеся для этого возможности предоставляются программисту в пунктах подменю Run и Debug главного меню среды IDE).

Вопросы для собеседования

  1.  Что такое оператор управления? Какие операторы управления определены в языке Cи и как они используются?
  2.  Какие операции определены в Си? Приоритет и ассоциативность выполнения операций в выражениях на языке Си .
  3.  Как объявляются массивы в Си-программах? Что такое индексное выражение и для чего они используются?
  4.  Каким образом элементы многомерных массивов располагаются в памяти ЭВМ? Что такое "приведенный индекс" и для чего он нужен?
  5.  Что такое "выражение" и "оператор", как эти понятия определяются в языке Си.
  6.  Как определяется тип переменной и тип выражения? Операции явного и неявного приведения типа.


ЛАБОРАТОРНАЯ РАБОТА N 4

Синтез и использование функций, указатели,

динамическое управление памятью

Для выполнения данной лабораторной работы требуется решить одну из предложенных ниже задач, учитывая следующие дополнительные требования:

  1.  все математические функции, указанные в условиях задач, необходимо синтезировать самостоятельно без привлечения библиотечных модулей;
  2.  массивы, используемые в программе, должны быть динамическими;
  3.  программа должна быть работоспособна для любых входных матриц, общий размер которых N×M≤300.

Программа должна работать в текстовом режиме, обеспечивать процедуры запроса и ввода данных, сопровождающиеся соответствующими пояснениями. В случае, когда в программе выполняются действия над массивами данных, программный диалог должен начинаться с запроса на ввод размерностей соответствующих массивов с проверкой на корректность введенных данных. Далее должен быть реализован запрос на выбор способа подготовки данных: ручной ввод, либо "автоматическая" программная генерация с использованием аналога функции rand(), реализованного по алгоритму линейного конгруэнтного генератора (ЛКГ), с последующей "адаптацией" сгенерированных данных к требованиям программы. При генерации вещественных значений ограничиться тремя цифрами после плавающей точки.

Замечание. В заданиях, касающихся действий над матрицами, в качестве представления матриц использовать динамические массивы соответствующих размерностей.

Задания.

1. Ввести массив натуральных чисел A[N] размера N≤40, вывести его на экран монитора. Написать функцию, преобразующую натуральное число в число, равное сумме цифр, представляющих исходное число в M-ичной системе счисления. Вывести на консоль в десятичной системе счисления исходный массив, предварительно заменив в нем четные числа на сумму цифр их четверичного, а нечетные - пятеричного представления.

2. Вычислить и напечатать таблицу значений функции

и ее максимальное значение при x[a,b] с шагом h. Вычисление f(x) для одного значения аргумента определить в отдельной функции.

3. Ввести массив натуральных чисел a[N] размера N≤40 (все числа a[i]<10000), вывести его на экран монитора. Написать функцию, преобразующую натуральное число в число, равное произведению цифр, представляющих исходное число в M-ичной системе счисления (1<M≤9). Вывести на консоль в десятичной системе счисления исходный массив, предварительно заменив в нем числа, все цифры M-ичного представления которых отличны от нуля, на произведение цифр их четверичного представления, а остальные оставив без изменений.

4. Вычислить и напечатать таблицу значений функции

и ее минимальное значение при x[a,b) с шагом h. Вычисление f(x) для одного значения аргумента определить в отдельной функции.

5. Вычислить и напечатать таблицу значений функции

и таблицу тех ее значений, которые по модулю не превышают 2, при x[a,b] с шагом hx, y[c,d] с шагом hy. Вычисление f(x,y) для одной пары значений аргументов определить в отдельной функции.

6. Вычислить и напечатать таблицу значений функции

и сумму ее значений для всех пар аргументов при x[a,b) с шагом hx, y[c,d) с шагом hy. Вычисление f(x,y) для одной пары значений аргументов определить в отдельной функции.

7. Вычислить и напечатать таблицу значений функции

и определить, является ли она монотонной на интервале [a, b] при дискретном увеличении аргумента от x=a с шагом h. Вычисление f(x) для одного значения аргумента определить в отдельной функции.

8. Вычислить и напечатать таблицу значений функции

и ее максимальное по модулю значение для x[a, b) при дискретном увеличении x с шагом h. Вычисление f(x) для одного значения аргумента определить в отдельной функции.

9. Для матриц a и b размерности N×M и M×L соответственно вычислить и напечатать {|a|min, Ia, Ja}, {|b|min, Ib, Jb} - значения и индексы минимальных по модулю элементов матриц a и b, а также значения переменных K=(Ia+Ib) - (Ja+Jb), β=max{|a|min,|b|min}. Вычисление значения и индексов минимального по модулю элемента матрицы определить в отдельной функции.

10. Заданы матрицы a и b с размерами N×M и M×L соответственно. Вычислить и напечатать {|a|min, Ia, Ja}, {|b|min, Ib, Jb} - значения и индексы минимальных по модулю элементов матриц a и b, а также значение β=min{Ia-Ib, Ja-Jb, max{|a|min, |b|min}}. Вычисление значения и индексов минимального по модулю элемента матрицы определить в отдельной функции.

11. Заданы матрицы A, B и C с размерами N×M, M×L и L×K соответственно. Вычислить и напечатать значения их минимальных элементов amin, bmin, cmin и переменной β=max{|amin|, |bmin|, |cmin|}. Вычисление минимального элемента матрицы оформить в виде функции.

12. Заданы матрицы A, B и C с размерами N×M, M×L и L×K соответственно. Вычислить и напечатать значения их максимальных элементов amax, bmax, cmax, и переменной β=min{|amax|, |bmax|, |cmax|}. Вычисление минимального элемента матрицы оформить в виде функции.

13. Заданы матрицы A, B и C с размерами N×M, M×L и L×K соответственно. Вычислить и напечатать значения переменных

Алгоритм вычисления правых частей этих выражений оформить в виде функции.

14. Заданы матрицы A, B и C с размерами N×M, M×L и L×K соответственно. Вычислить и  напечатать значения переменных

.

Процедуры вычисления правых частей этих выражений оформить в виде функций.

15. Заданы матрицы B и C с размерами N×M и M×M соответственно. Написать функции умножения и сложения двух матриц. Вычислить и напечатать матрицу R=B×C+B.

16. Для матрицы A, с размерами N×M написать функции умножения матрицы на скаляр и вычисления суммы элементов матрицы. Вычислить и напечатать значения Sa - суммы элементов матрицы A, и B=A/Sa.

17. Заданы матрицы A и B с размерами N×M и M×L. Написать функции умножения двух матриц и транспонирования матрицы. Вычислить и напечатать матрицу R=(A×B)T.

18. Для матрицы A, с размерами N×M, и M-мерного вектора D={d1, d2, … ,dM} написать функцию формирования N×M-мерной матрицы Q, элементы которой вычисляются по формуле Q[i][j]=A[i][jD[j]. Написать функцию сложения двух матриц. Вычислить и напечатать матрицу R=A+Q.

19. Заданы матрицы A, B и C с размерами N×M, M×L и L×K соответственно. Написать функции умножения двух матриц и вычисления следа квадратной матрицы. Вычислить и напечатать матрицу R=A×B×C и ее след.

20. Заданы матрицы A и C с размерами N×M и L×L соответственно. Написать функции умножения матрицы на скаляр и вычисления следа квадратной матрицы. Вычислить и напечатать Slc - след матрицы C и матрицу R=A×Slc.

21. Заданы матрицы A, B и C с размерами N×M, M×K и K×N соответственно. Написать функции умножения матрицы на скаляр и вычисления минимального значения элемента матрицы. Вычислить и напечатать Amin и Bmin – минимальные элементы матриц A и B, а также матрицу R=C×|Amin - Bmin|.

22. Написать функцию поиска максимального значения произвольной стандартной функции одного аргумента при дискретном изменении аргумента на интервале [A,B] с шагом h (имя конкретной стандартной функции должно передаваться в созданную функцию как параметр). Определить и вывести соответствующее сообщение, какая из функций: f1(x)=arctg(x), f2(x)=cos(x), f3(x)=sin(x), f4(x)=(ex-e-x)/2 имеет наибольшее значение на интервале x[A,B] с шагом h.

23. Написать функцию расстановки элементов одномерного массива в порядке убывания их значений. Используя эту функцию, преобразовать исходную N×M - мерную матрицу A в матрицу B, каждая строка которой состоит из элементов соответствующей строки исходной матрицы, упорядоченных по убыванию их значений.

Методические указания

В условиях задач выражение вида "x[A,B] с шагом h" означает, что переменная x изменяется дискретно с шагом h в интервале [A,B], начиная от его левой границы;

max{α, β, …, γ} - функция, принимающая значение максимальной из перечисленных в скобках переменных.

Следует помнить, что элементы любого массива, в том числе и многомерного, обычно располагаются в оперативном запоминающем устройстве ЭВМ в одном непрерывном блоке ячеек памяти, размер которого вычисляется в ходе выполнения программы из конкретных значений размерностей заданного массива.

Таким образом, любой массив в памяти всегда хранится в виде одномерной последовательности значений, и обеспечение произвольного доступа к его элементам является обязанностью программиста. По соглашению, принятому для Си-программ, элементы многомерных массивов заносятся в память последовательно, начиная с элемента, имеющего нулевые индексы в порядке увеличения на единицу сначала младшего (первого справа) индекса от нуля до его максимального значения при нулевых значениях других индексов, затем элементы, второй индекс справа которых равен единице, а более старшие - нулевые и т.д. Для матрицы это соответствует построчной записи ее элементов в память ЭВМ. Произвольный доступ к элементу трехмерного массива a[i][j][k], i=0...I-1, j=0...J-1, k=0...K-1 возможен с использованием "приведенного индекса" - величины, равной смещению ячейки памяти, в которой хранится значение данного элемента a[i][j][k] относительно начала массива. Для a[i][j][k] приведенный индекс равен: i×J×K+j×K+k. Приведенная ниже программа иллюстрирует ввод целочисленных значений матрицы размера line×col  в динамически запрашиваемую область памяти и вывод на монитор ее значений строчками по col элементов в каждой, а также отдельного элемента matr[l][c] с использованием приведенного индекса:

#include<stdio.h>

#include<conio.h>

#include<alloc.h>

#include<process.h>

int main(void)

{

  int *matr, *matr_ptr, line, col, l=1, c=2;

  printf("Введите кол-во <строк> <столбцов> матрицы:");

  scanf("%d %d",&line,&col);

  int size=line*col;

  char *diagn_mes="Ошибка распределения памяти.\n";

  if((matr=(int *)malloc(size*sizeof(int)))==NULL)

     {

         printf("%s", diagn_mes); getch(); abort();

     }

  matr_ptr=matr;

  for(int i=0;i<size;i++)

     {

         printf("Введите элемент matr[%d][%d]: ",i/col, i%col);

         scanf("%d",matr_ptr++);

     }

  printf("Исходная матрица:");

  for(i=0, matr_ptr=matr; i<size; i++)

     {

         if(!(i%col)) printf("\n");

         printf(" %5d",*matr_ptr++);

     }

  printf("\nЭлемент matr[l=%d][c=%d]:%d", l, c, matr[l*col+c]);

  return 0;

}

Для того, чтобы эта программа считала данные из файла, а не с консоли, при ее запуске нужно перенаправить поток ввода на файл исходных данных (source.dat), используя оператор переназначения стандартного устройства ввода DOS `<` (пример запуска: D:\>progr.exe < source.dat). При этом файл исходных данных должен состоять из разделенных пробельными символами целых чисел, первое из которых - количество строк исходной матрицы, второе - количество столбцов, и далее - построчно элементы матрицы, начиная с нулевого элемента нулевой строки. Например, для (2×3) матрицы

файл исходных данных должен состоять из последовательности чисел:

2 3

4 5 6 7 8 9 .

Вопросы для собеседования

  1.  Что такое указатель и какие операции над указателями определены? Каким образом производится объявление, инициализация указателя? Правила адресной арифметики.
  2.  Каким образом определяется тип переменной - указателя? По каким правилам выполняются арифметические операции с переменными-указателями?
  3.  Что такое индексное выражение, приведенный индекс, для чего они нужны и как используются?
  4.  Какие операции с распределением памяти ЭВМ и как можно выполнить в процессе исполнения программы (динамически)?
  5.  Что такое функция в Си-программе? Что такое прототип и определение функции?
  6.  Что такое формальные и фактические аргументы функции?
  7.  Какие фактические параметры при вызове функции могут соответствовать формальному аргументу, являющемуся: а) идентификатором статического массива; б) указателем на функцию; в) идентификатором переменной одного из базовых типов?
  8.  Можно ли разные формальные аргументы функции обозначать одинаковыми идентификаторами? А фактические?
  9.  Перечислите все возможные способы передачи информации из программы в вызываемую функцию и обратно.

ЛАБОРАТОРНАЯ РАБОТА N 5

Строки и операции над ними. Использование функций обработки текстовых данных

Задания. Источник данных и результат работы программы – текстовый файл. Для кодирования текса используется кодовая таблица DOS. Составить программу, обрабатывающую файл согласно заданному алгоритму.

1. Для двух заданных различных символов, значения кодов которых хранятся в переменных типа char X и Y ,задаваемых пользователем, определить, сколько раз в тексте встречается буква, определенная значением кода, хранящимся в X. Везде, в обрабатываемом тексте, заменить эту букву буквой, определенной значением кода, хранящимся в переменной Y.

2. В заданном тексте везде заменить слово А1 на слово А2 (длины слов в общем случае не совпадают).

3. Составить триады из символов текста, расположенных в нечетных позициях. Обрабатываются только отображаемые символы.

4. По заданному тексту сформировать список слов, состоящих только из букв русского либо латинского алфавита. Для русских букв используется кодировка Кириллица-DOS. Упорядочить полученный список слов по алфавиту. Количество имен в списке заранее не известно.

5. Удалить текст, содержащийся в обрабатываемом файле, начиная с первой встретившейся буквы ‘М’ до третьей по счету буквы ‘М’. Вывести текст после преобразования и номера позиций начала и конца удаленной части в исходной строке. В обрабатываемом файле содержится текст на русском языке в кодировке Кириллица-DOS.

6. Удалить из текста заданное слово. Вывести обработанный текст и номера позиций начала удаленного слова в исходном тексте.

7. Вставить слово в текст между двух заданных. Вывести обработанный текст и номера позиций начала и конца вставленного слова в новом тексте.

8. Для текста на русском языке определить количество гласных и согласных букв.

9. Поменять местами фрагменты текста ограниченные позициями M1, M2 и N1, N2. На этапе проектирования программы следует учесть допустимость ситуации, когда разности M2-M1 и N2-N1 могут не совпадать.

10. Вывести из текста на консоль слова, начинающиеся и заканчивающиеся на одну и ту же букву.

11. Вывести из текста на консоль слова, у которых в i-й позиции располагается одна и та же буква. В исходном тексте поменять местами первую пару таких слов и вывести результат на консоль.

12. Упорядочить слова текста по алфавиту относительно символов, заключенных между 3-й и 6-й позициями каждого слова. Вывести на консоль полученный текст и колонку из соответствующих словам пар символов – для облегчения проверки правильности сортировки.

13. Переформатировать заданный текст в новые строки, считая признаком конца строки в исходном тексте символ "\%".

14. В заданном тексте определить частоту, с которой в нем встречаются различные буквы и построить гистограмму распределения частот. В начале каждой строки гистограммы вывести символ и соответствующую ему частоту в процентах.

15. Разбить исходный текст на строки длиной не более 50 символов. Перенос осуществлять на местах расположения пробельных символов (не разделяя слова на части).

16. В тексте, содержащем менее 50 непробельных символов, равномерно расставить пробелы между словами так, чтобы его длина равнялась 50 символам.

17. Проверить общую сбалансированность разнотипных скобок в тексте. Скобки считаются сбалансированными, если каждой закрывающей скобке данного типа предшествует открывающая скобка этого же типа и для каждого типа скобок количество открывающих и закрывающих скобок равны.

18. В заданном тексте удалить заключенную в круглые скобки часть (вместе со скобками) и вывести результат на консоль.

19. Определить количество слов в тексте и поменять местами первое и пятое слова.

20. Указать минимальное количество первых букв, по которым можно различить слова из данного набора.

21. Текст задан следующим образом: первые символы – десятичное целое, задающее длину первого слова. Без пробелов, после первого слова - цифры, задающие длину второго слова и т.д. Все слова начинаются не с цифр. По запросу вывести на консоль заданный текст и N-е слово.

22. Напечатать самое длинное слово из заданного текста. Разделители слов - пробельные символы.

23. Исходные данные – файл, содержащий текст на русском языке. Определить, какой процент слов в тексте содержит удвоенную согласную. Разделители слов - пробельные символы.

24. Определить, сколько раз в тексте встречается заданное слово. Разделители слов - пробельные символы.

25. Программа, обратная фильтрации лишних пробелов. В заданном тексте каждый пробельный символ заменить двумя.

26. Исходные данные – файл, содержащий текст на русском языке. Определить, сколько слов в тексте содержат один слог, два слога, 3 слога и т.д.

27. Исходные данные – текстовый файл. Удалить из текста строку, номер которой вводится пользователем по запросу. Строки разделены пробельными символами и заканчиваются разделительными символами. Вывести результат работы программы на консоль.

28. В тексте, состоящем из нескольких строк, обеспечить возможность вставки между заданной своим номером строкой и следующей за ней, пустой строкой и ввода в нее символов.

29. Исходные данные – файл, содержащий текст на английском языке. Определить, какие символы и сколько раз встречаются в тексте.

30. В тексте убрать лишние пробелы и разделительные символы, оставив между словами только по одному пробелу

Методические указания

1. Для всех задач объем исходного текста заранее не известен. При организации ввода текста признак окончания ввода – символ конца файла EOF (комбинация клавиш "Ctrl+Z", UNIX/POSIX стандарт работы с файлами).

2. Действия с фрагментами текста рекомендуется производить как с элементами строковых массивов.

3. Для преобразования текста в максимальной степени использовать библиотечные функции преобразования символьных данных.

Вопросы для собеседования

1. В каком виде символьная информация хранится в памяти ЭВМ.

2. Чем отличаются символьные массивы и строки. Как производится создание и инициализация строки.

3. По каким правилам выполняется лексикографическое сравнение символьных массивов?

4. Характеристика операций над символьными данными, обеспечиваемых библиотечными функциями С и алгоритмы их работы:

strlen( ) - определение длины строки;

strset( ) - заполнение строки заданным символом;

strnset( ) – заполнение части строки заданным символом;

strcpy( ) – копирование строки в строку;

strcat( ) – соединение (конкатенация) строк;

strcmp( ) – сравнение двух строк;

strtok( ) – поиск и выделение лексических единиц в строке;

strchr( ) – поиск заданного символа в строке;

strpbrk( ) – поиск первого вхождения символа из шаблона в строке

strspn( ) – определение длины начальной части строки-шаблона, которой нет в исследуемой строке;

strstr( ) – поиск подстроки в строке (по образцу).

Для указанных функций по алгоритмам составить программную реализацию.

ПРИЛОЖЕНИЕ 1.

Форматированный вывод данных

Функция printf( ) (прототип содержится в файле stdio.h) обеспечивает форматированный вывод. Ее можно записать в следующем формальном виде:

int рrintf("управляющая строка", аргумент _1, аргумент _2,...);

Управляющая строка содержит компоненты трех типов: обычные символы, которые просто копируются в стандартный выходной поток (выводятся на экран дисплея); спецификации преобразования, каждая из которых вызывает вывод на экран очередного аргумента из последующего списка; управляющие символьные константы.

Каждая спецификация преобразования начинается со знака % и заканчивается некоторым символом, задающим преобразование. Между знаком % и символом преобразования могут встречаться другие знаки в соответствии со следующим форматом:

% [признаки] [ширина_поля] [точность] [F|N|h|l|L] c_n 

Все параметры в квадратных скобках не являются обязательными. На месте параметра c_n (символ преобразования) могут быть записаны:

с - значением аргумента является символ;

d или i - значением аргумента является десятичное целое число;

е - значением аргумента является вещественное десятичное число в экспоненциальной форме вида 1.23e+2;

Е - значением аргумента является вещественное десятичное число в экспоненциальной форме вида 1.23E+2;

f - значением аргумента является вещественное десятичное число с плавающей точкой;

g (или G) - используется, как е или f, и исключает вывод незначащих нулей;

о - значением аргумента является восьмеричное целое число;

s - значением аргумента является строка символов (символы строки выводятся до тех пор, пока не встретится символ конца строки или же не будет, выведено число символов, заданное точностью);

u - значением аргумента является беззнаковое целое число;

х - значением аргумента является шестнадцатеричное целое число с цифрами 0,..., 9, а, b, с, d, е, f;

X - значением аргумента является шестнадцатеричное целое число с цифрами 0,..., 9, А, В, С, О, Е, F;

р - значением аргумента является указатель;

n - применяется в операциях форматирования. Аргумент, соответствующий этому символу спецификации, должен быть указателем на целое. В него возвращается номер позиции строки (отображаемой на экране), в которой записана спецификация %n.

Необязательные параметры в спецификации преобразования:

  •   признак минус (-) указывает, что преобразованный параметр должен быть выравнен влево в своем поле;
  •   признак плюс (+) требует вывода результата со знаком;
  •   строка цифр, задающая минимальный размер поля (ширина поля). Здесь может также использоваться символ *, который тоже позволяет задать минимальную ширину поля и точность представления выводимого числа;
  •   точка (.), отделяющая размер поля от последующей строки цифр;
  •   строка цифр, задающая максимальное число выводимых символов или же количество цифр, выводимых справа от десятичной точки в значениях типов float или double (точность);
  •   символ F, определяющий указатель типа far;
  •   символ N, определяющий указатель типа near;
  •   символ h, определяющий аргумент типа  short int  (используется  вместе  с  символами преобразования d, i, о, u, х, Х);
  •   символ l, указывающий, что соответствующий аргумент имеет тип long (в случае символов преобразования d, i, о, u, х, X) или double (в случае символов преобразования е, Е, f, g, G);
  •   символ L, указывающий, что соответствующий аргумент имеет тип long double (используется вместе с символами преобразований е, Е, f, g, G);
  •   символ #, который может встречаться перед символами преобразования g, f, е  и перед символом х. В первом случае всегда будет выводиться десятичная точка, а во втором - префикс 0x перед соответствующим шестнадцатеричным числом.

Если после знака % записан не символ преобразования, то он выводится на экран. Таким образом, строка %% приводит к выводу на экран знака %.

Функция printf( ) использует управляющую строку, чтобы определить, сколько всего аргументов и каковы их типы. Аргументами могут быть переменные, константы, выражения, вызовы функций; главное, чтобы их значения соответствовали заданной спецификации.

При наличии ошибок, например, в числе аргументов или типе преобразования результаты будут неверными.

Среди управляющих символьных констант наиболее часто используются следующие:

\а - для кратковременной подачи звукового сигнала;

\b - для перевода курсора влево на одну позицию;

\f - для подачи формата;

\n - для перехода на новую строку;

\r - для возврата каретки;

\t - горизонтальная табуляция;

\v - вертикальная табуляция;

\\ - вывод символа \;

\' - вывод символа ' ;

\" - вывод символа ";

\? - вывод символа ?.

Например, в результате вызова функции:

printf("\tЭBM\n%d\n", i);

сначала выполняется горизонтальная табуляция (\t), т.е. курсор сместится от края экрана, затем на экран будет выведено слово ЭВМ, после этого курсор переместится в начало следующей строки (\n), затем будет выведено целое число i по формату %d (десятичное целое), и окончательно курсор перейдет в начало новой строки (\n).

Напечатать строку символов можно и так:

printf("Это строка символов");

Форматированный ввод данных

Функция scanf( ) (прототип содержится в файле stdio.h) обеспечивает форматированный ввод. Ее можно записать в следующем формальном виде:

int scanf("управляющая строка", аргумент_1, аргумент_2,...);

Аргументы scanf( ) должны быть указателями на соответствующие значения. Для этого перед именем переменной записывается символ &. Назначение указателей будет подробно рассмотрено далее.

Управляющая строка содержит спецификации преобразования и используется для установления количества и типов аргументов. В нее могут включаться:

  •  пробелы, символы табуляции и перехода на новую строку (все они игнорируются);
  •  спецификации преобразования, состоящие из знака %, возможно, символа * (запрещение присваивания), возможно, числа, задающего максимальный размер поля, и самого символа преобразования;
  •  обычные символы, кроме % (считается, что они должны совпадать с очередными неизвестными символами во входном потоке).

Рассмотрим символы преобразования функции scanf( ) (указываются после символа %):

с -м на входе ожидается появление одиночного символа;

d или i - на входе ожидается десятичное целое число и аргумент является указателем на переменную типа int;

D или l -м на входе ожидается десятичное целое число и аргумент является указателем на переменную типа long;

e или Е - на входе ожидается вещественное число с плавающей точкой;

f - на входе ожидается вещественное число с плавающей точкой;

g или G - на входе ожидается вещественное число с плавающей точкой;

о - на входе ожидается восьмеричное целое число и аргумент является указателем на переменную типа int;

О - на входе ожидается восьмеричное целое число и аргумент является указателем на переменную типа long;

s - на входе ожидается появление строки символов;

х - на входе ожидается шестнадцатеричное целое число и аргумент является указателем на переменную типа int;

Х - на входе ожидается шестнадцатеричное целое число и аргумент является указателем на переменную типа long;

р - на входе ожидается появление указателя в виде шестнадцатеричного числа;

n - применяется в операциях форматирования. Аргумент, соответствующий этому символу спецификации, должен быть указателем на целое. В него возвращается номер позиции (после ввода), в которой записана спецификация % n;

u - на входе ожидается беззнаковое целое число и аргумент является указателем на переменную типа unsigned int;

U - на входе ожидается беззнаковое целое число и аргумент является указателем на переменную типа unsigned long;

[ ] - сканирует входную строку для получения символов.

Перед некоторыми символами преобразования могут записываться следующие модификаторы:

F - изменяет указатель, заданный по умолчанию, на указатель типа far;

N - изменяет указатель, заданный по умолчанию, на указатель типа near;

h - преобразует аргумент к типу short int (может записываться перед  символами d, i, о, u, х);

l - преобразует аргумент к типу long int (может записываться перед символами d, i, o, u, x);

L - преобразует аргумент к типу long double (может записываться перед символами е, f, g).

Ввести целое число (int a;), символ (char b;) и вещественное число (float t;) можно так:

scanf("%d", &a);

scanf("%c", &b);

scanf("%d%c%f", &a, &b, &t);

Замечание. Функция scanf( ) осуществляет "чтение" данных из стандартного потока ввода stdin в соответствии со значениями спецификаторов, указанных в управляющей строке. Процесс "чтения" данных из потока синхронизирован с их извлечением. По организации механизма размещения данных stdin представляет собой дек, то есть очередь, реализованную по правилу "FIFO" (Fist Input Fist Output – первым пришел, первым вышел). Однако, если в потоке stdin нет данных нужного типа, функция scanf( ) не может их самостоятельно извлечь. Для очистки потока stdin используется функция fflush( ), объявленная в файле stdio.h. Поэтому организация ввода данных в формате должна быть реализована по следующей схеме:

int Flag;      // переменная, для чтения результата вызова

              // функции scanf()

int X1;        // инициализируемая переменная, значение которой,

              // например, должно быть в диапазоне от 0 до 10

do

  {

     printf("\nВведите значение целочисленной переменной X1:");

     Flag=scanf("%d",&X1);

     if(Flag==0||Flag==EOF)

       {

          printf("\a Ошибка ввода данных."

                 "\n-------------------------------"

                  "\n Повторная инициализации");

          fflush(stdin);

       }

     if(X1<0||X1>40)

       {

          printf("\nВводимое значение должно быть в диапазоне"

                 " от 0 до 40. Повторите ввод значения"

                 " переменной.");

          Flag=0;

       }

  }while(Flag==0||Flag==EOF);

ПРИЛОЖЕНИЕ 2.

Листинг 1. Создание в памяти компьютера динамического массива для хранения двумерного целочисленного массива и функции для транспонирования матрицы, соответствующей исходному массиву.

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#include <process.h>

int *A, *B;               /* Указатели на динамические массивы */

int numbRows, numbCols;   /* Размерности массивов */

char *exitMsg="Для завершения работы программы нажмите”

             “ на любую клавишу...";

/* .......Блок объявления пользовательских функций....... */

void transp(int *arr1, int *arr2, int nRows, int nCols);

void initSizeTable(void);

void CreateTable(void);

void inputCountTable(int *arr, int nRows, int nCols);

void displTable(int *arr, int nRows, int nCols);

/* ................Точка входа в программу............... */

int main(void)

 {

    clrscr();  /* Очистка экрана */

    initSizeTable();

    CreateTable();

    inputCountTable(A,numbRows,numbCols);

    clrscr();

    printf("\nИсходная матрица-массив %d*%d :",numbRows,numbCols);

    displTable(A,numbRows,numbCols);

    transp(A,B,numbRows,numbCols);

    printf("\nТранспонированная матрица-массив %d*%d :",

            numbCols,numbRows);

    displTable(B,numbCols,numbRows);

    printf(exitMsg);

    (void)getch();

    free(A);

    free(B);

    clrscr();

    printf("\nПравило хорошего тона: уходя уходи...");

    return 0;

 }

/* .......Блок определения пользовательских функций....... */

/*

    Функция транспонирования матрицы –

    целочисленного динамического массива:

    int *arr1 - указатель на исходную матрицу-массив,

    int *arr2 - указатель на транспонированную матрицу-массив.

*/

void transp(int *arr1, int *arr2, int nRows, int nCols)

 {

    int rows, cols;

    for(rows=0;rows<nRows;rows++)

for(cols=0;cols<nCols;cols++)

   *(arr2+cols*nRows+rows)=*(arr1+rows*nCols+cols);

 }

/*

    Функция для отображения двумерного массива в текстовом режиме

    на экране компьютера с формированием фона за отображаемыми    

    данными.

*/

void displTable(int *arr, int nRows, int nCols)

 {

    int rows, cols;

    int curX, curY;

    printf("\n");

    curX=wherex();

    curY=wherey();

    textbackground(LIGHTBLUE);

    for(int i=0; i<nRows; i++)

{

   for(int j=0; j<nCols*8; j++)

      {

  printf(" ");

      }

   printf("\n");

}

    gotoxy(curX,curY);

    for(rows=0; rows<nRows; rows++)

      {

  for(cols=0; cols<nCols; cols++)

     cprintf("%6d ",*(arr+rows*nCols+cols));

  printf("\n");

      }

    textbackground(BLACK);

 }

/* Инициализация глобальных переменных - размерностей массива */

void initSizeTable(void)

 {

    printf("Введите количество строк: ");

    scanf("%d",&numbRows);

    printf("Введите количество столбцов: ");

    scanf("%d",&numbCols);

 }

/* Выделение памяти для динамических массивов */

void CreateTable(void)

 {

    if((A=(int*)calloc(numbRows*numbCols, sizeof(int)))==NULL)

      {

  printf("\nОшибка при создании массива А.");

  printf("\nНет доступной оперативной памяти.");

  printf(exitMsg);

  (void)getch();

  exit(-1);

      }

    if((B=(int*)calloc(numbRows*numbCols, sizeof(int)))==NULL)

      {

  printf("\nОшибка при создании массива В.");

  printf("\nНет доступной оперативной памяти.");

  printf(exitMsg);

  (void)getch();

  exit(-1);

      }

 }

/* Инициализация значений двумерного массива, переданного по ссылке Пользователь может прервать ввод значений, нажав комбинацию клавиш Ctrl+Z */

void inputCountTable(int *arr, int nRows, int nCols)

 {

    printf("\nИнициализация значений массива:\n");

    printf("Замечание: чтобы прервать ввод данных”

            “ нажмите Ctrl+Z\n");

    printf("Неинициализированные значения будут заполнены”

           нулями.\n");

    for(int rows=0; rows<nRows; rows++)

for(int cols=0; cols<nCols; cols++)

   {

      printf("Введие значение А[%d][%d]: ",rows,cols);

      if(scanf("%d",(arr+rows*nCols+cols))==EOF)

      {

  printf("\nДосрочный выход из блока ввода данных...");

  goto END;

      }

   }

END: printf("\nВвод данных окончен. Нажмите любую клавишу для”

           “ продолжения...");

    (void)getch();

 }

Листинг 2. Программная реализация генератора псевдо-случайных чисел (ГПСЧ), подчинённых нормальному закону распределения; табличное постраничное отображение смоделированных данных, их сортировка и отображение упорядоченной по возрастанию последовательности.

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#include <process.h>

#include <math.h>

long int X1, X2;

float Mo, SKO;

FILE *out, *out1;

double Ravn1(void);

double Ravn2(void);

double Norm(void);

void StrSel(double *A, int nn);

void DispArr(double *A, int nn);

void fileRes(FILE *a, double *A, int nn);

char *msg1="\nПолучение выборки ПСЧ, подчиненных нормальному “

          “закону распределения";

char *msg2="ОШИБКА: нет доступной свободной оперативной памать!\n"

  "Перегрузите работающую DOS-сессию, из которой запускается”

      “ программа.";

char *msgExit="Для завершения работы программы нажмите любую”

             “ клавишу...";

char *msgRes="\n\tРабота программы завершена."

     "\n\tВыходные данные моделирования сохранены в текстовых”

         “ файлах: "\n\tВ файле GAUS_RES.TXT - полученная “

         “последовательность ПСЧ, "\n\tа в файле GAUS_RES1.TXT”

         “ отсортированные в порядке возрастания \n\t значений “

         “для дальнейшей обработки и построения гистограммы.\n";

int main(void)

 {

    int n;         /* Количество генерируемых значений */

    double  *arr;  /* Указатель на динамический массив данных */

    int    i;

    clrscr();

    printf(msg1);

    printf("\n");

    for(i=0;i<80;i++) putch('*');

    printf("\n\Введите объем выборки (целое положительное число”

           “ не более 100): ");

    scanf("%d",&n);

    if((arr=(double*)calloc(n,sizeof(double)))==NULL)

      {

   printf("\n%s",msg2);

   printf("\n%s",msgExit);

   (void)getch();

   exit(-1);

      }

    //arr1=arr;

    if((out=fopen("gaus_res.txt","w+"))==NULL)

      {

  puts("\n\tОШИБКА: Не удалось создать файл для “

           “результатов...\n");

  printf("Вывод данных будет осуществляться только на “

             экран!\n");

      }

    if((out1=fopen("gaus_res1.txt","w+"))==NULL)

      {

  puts("\n\tОШИБКА: Не удалось создать файл для “

           “результатов...\n");

  printf("Вывод данных будет осуществляться только на “

             “экран!\n");

      }

    printf("\n\tВведите значение для инициализации ГПСЧ, “

           “Х1[0]:");

    scanf("%ld",&X1);

    printf("\n\tВведите значение для инициализации ГПСЧ, “

           “Х2[0]:");

    scanf("%ld",&X2);

/* Блок формирования результатов  */

    printf("\nИнициализация параметров распределения\n");

    for(i=0;i<80;i++) putch('*');

    printf("Введите значения математического ожидания Мо: ");

    scanf("%f",&Mo);

    printf("Введите значение среднего квадратичного отклонения “

           “СКО: ");

    scanf("%f",&SKO);

/* Формирование "нормальной" последовательности */

    for(i=0;i<n;i++)

      {

   *(arr+i)=Norm();

      }

    getch();

    clrscr();

    printf("Полученная последовательность:\n");

    for(i=0;i<n;i++)

      {

  fprintf(out,"\n A[%d] : %7.2f",i,*(arr+i));

      }

    DispArr(arr,n);

    if((fclose(out))!=NULL)

      {

  puts("\n\tCannot close file results");

      }

    printf("\n\tДля продолжения нажмите любую клавишу.");

    getch();

    clrscr();

    printf("\n\tДанные, упорядоченные по возрастанию:");

    (void)getch();

    StrSel(arr,n);

    DispArr(arr,n);

    if((fclose(out1))!=NULL)

      {

  puts("\n\tCannot close file results");

      }

    free(arr);

    printf(msgRes);

    printf("\n\t%s",msgExit);

    (void)getch();

   // clrscr();

    return 0;

 }

/* ************************************************************ */

double Ravn1(void)

 {

    X1=(430*X1+2531)%11979;

    return X1/11979.;

 }

double Ravn2(void)

 {

    X2=(430*X2+2531)%11979;

    return X2/11979.;

 }

double Norm(void)

 {

    return (Mo+SKO*sqrt(-2*log(Ravn1()))*cos(2*M_PI*Ravn2()));

 }

/* Функция сортировки методом Прямого выбора */

void StrSel(double *A, int nn)

 {

    int i,j,k;

    double x;

    for(i=0;i<nn-1;i++)

      {

  x=*(A+i); k=i;

  for(j=i+1;j<nn;j++)

    if(*(A+j)<x)

      {

  k=j; x=*(A+k);

      }

    *(A+k)=*(A+i); *(A+i)=x;

}

 }

void DispArr(double *A, int nn)

 {

/* Данные отображаются постранично в виде таблицы из 5 столбцов */

    int page,index=0,i,j;

    page=nn/100+1;

    while(page>0)

      {

  clrscr();

  for(i=0;i<5;i++)

     {

 for(j=0;j<20;j++)

    {

       if(index>=nn) break; /* Вывод окончен */

       gotoxy(i*16+1,j+2);

       printf("%3d %.2f",index,*(A+index));

       index++;

    }

 if(index>=nn) break;

     }

  gotoxy(2,23);

  printf("Для продолжения нажмите любую клавишу...");

  (void)getch();

  page--;

      }

    printf("\nДанные выведены полностью. Нажмите любую клавишу”

           “ для продолжения.");

    (void)getch();

    clrscr();

 }

void fileRes(FILE *a, double *A, int nn)

 {

/* Данные отображаются постранично в виде таблицы из 5 столбцов */

    int page,col,blok,numbPage=0,index=0,i,j;

    page=nn/100+1;

    while(page>1)

      {

    for(i=0;i<20;i++)

     {

 for(j=0;j<5;j++)

    {

       index=numbPage*100+j*20+i;

       fprintf(a,"%3d %.2f",index,*(A+index));

    }

 fprintf(a,"\n");

 //if(index>=nn) break;

     }

  numbPage++;

  page--;

      }

  /* Формирование неполной страницы... */

     blok = nn-index; /* Вычисляем, сколько элементов осталось

                         вывести...*/

     col=blok/20;

     if(blok%20>0) col++;

     for(i=0;i<20;i++)

     {

 for(j=0;j<5;j++)

    {

       index=numbPage*100+j*20+i;

       if(index>=nn)continue;

       fprintf(a,"%3d %.2f",index,*(A+index));

    }

 fprintf(a,"\n");

 //if(index>=nn) break;

     }

 }


ПРИЛОЖЕНИЕ 3

Контрольные вопросы по курсу

«Программирование на языке высокого уровня».

Программирование на языке Си (ANSI C99). 1-й семестр.

  1.  Обобщенная структура ЭВМ. Фон Неймановская архитектура ЭВМ.
  2.  Принцип программного управления.
  3.  Структура машинной команды.
  4.  Основные этапы решения задач на ЭВМ.
  5.  Понятие алгоритма. Виды алгоритмов.
  6.  Кодирование информации. Позиционные системы счисления.
  7.  Перевод чисел в позиционных системах счисления.
  8.  Арифметические операции в позиционных системах счисления.
  9.  Машинное представление данных. Прямой и обратный дополнительный код.
  10.  Представление чисел в формате с фиксированной запятой. Представление чисел с плавающей запятой.
  11.  Классификация языков высокого уровня по назначению.
  12.  Отладка программы.
  13.  Восходящее и нисходящее программирование.
  14.  Общая структура консольного приложения на языке Си (DOS-программа). Логическая структура программного модуля. Достоинства и недостатки языка Си.
  15.  Базовые конструкции языка Си.
  16.  Базовые типы данных. Модификаторы.
  17.  Идентификаторы. Правила составления идентификаторов.
  18.  Ключевые слова.
  19.  Переменные, область видимости и время жизни. Объявление и инициализация переменных.
  20.  Классы памяти.
  21.  Пространство имен.
  22.  Объявления.
  23.  Константы. Константное выражение.
  24.  Выражения. Как определяется тип переменной и тип выражения.
  25.  Операции. Приоритет операций. Учет переполнения при операциях побитового сдвига.

Задача: int x=32767; x*=2; x/=2; Каково значение переменной x в случае

16-разрядной реализации Си.

  1.  Особенности использования операции sizeof().
  2.  Преобразование типов. Использование операции приведения типа.
  3.  Операторы языка Си.
  4.  Форматный ввод-вывод в языке Си, функции printf() и scanf(). Спецификации форматного ввода-вывода. Управляющие escape последовательности.
  5.  Массивы. Объявление, инициализация, доступ к элементам массива. Индексное выражение. Приведенный индекс массива.
  6.  Указатели. Инициализация указателя, операция обращения по адресу.
  7.  Каким образом определяется тип переменной-указателя? По каким правилам выполняются арифметические операции с переменными указателями.
  8.  Связь указателей и массивов. Массивы указателей и указатель на указатель.
  9.  Структура программы и модификаторы типа указателей в ОС MS DOS. Модели памяти.
  10.  Указатели и динамические переменные. Резервирование памяти в куче.
  11.  Функции. Объявление, определение и вызов функции. Способы передачи параметров в функции.
  12.  Функции с переменным числом параметров.
  13.  Библиотечные функции.
  14.  Параметры и возвращаемое функцией main() значение.
  15.  Рекурсия. Рекурсивные функции. Применение рекурсий.
  16.  Указатель на функцию.
  17.  Препроцессор языка Си. Директивы препроцессора. Макроопределения (макросы). Условная компиляция.
  18.  Строки и операции над ними.
  19.  Сортировка данных. Внутренняя сортировка: сортировка методом прямого включения, сортировка методом прямого выбора, сортировка методом прямого обмена (сортировка методом пузырька).
  20.  Быстрые методы сортировки: метод Шелла, сортировка с помощью дерева (пирамиды), быстрая сортировка Хоара (сортировка разделением).
  21.  Процесс взаимодействия системы с клавиатурой в ОС MS-DOS. Функции языка Си для работы с клавиатурой.

список рекомендуемой литературы

  1.  Шилдт, Г. Полный справочник по С / Г. Шилдт , 4-е издание : [пер. с англ.] - М,: Издательский дом "Вильямс", 2002.
  2.  Культин, Н.Б. C/C++ в задачах и примерах / Н.Б. Культин. - СПб.:БХВ-Петербург, 2001.
  3.  Березин, Б.И. Начальный курс С и С++ / Б.И. Березин, С.Б. Березин. - М,: ДИАЛОГ_МИФИ, 1996.
  4.  Подбельский, В.В. Программирование на языке Си: учеб. пособие / В.В. Подбельский, С.С Фомин. - М.: Финансы и статистика, 1998.
  5.  Климова, Л.М. С++. Практическое программирование. Решение типовых задач / Л.М. Климова. – М.: КУДИЦ-ОБРАЗ, 2001.
  6.  Гуденко, Д.А. Сборник задач по программированию / Д.А. Гуденко, Д.В. Петроченко. – СПб.: Питер, 2003.


 

А также другие работы, которые могут Вас заинтересовать

48727. Анализ и диагностика финансово-хозяйственной деятельности предприятии ОАО «КБ «Вымпел» и оценки эффективности его работы в условиях рыночной экономики 123.96 KB
  Содержанием АФХД является глубокое и всестороннее изучение экономической информации о функционировании анализируемого субъекта хозяйствования с целью принятия оптимальных управленческих решений по обеспечению выполнения производственных программ предприятия, оценки уровня их выполнения, выявления слабых мест и внутрихозяйственных резервов.
48728. Принципы организации производственного процесса 68.92 KB
  Главной задачей, стоящей перед работниками остается своевременное, качественное и полное удовлетворение народного хозяйства и населения в перевозках и повышение экономической эффективности работы отрасли.
48729. Історія України. НАВЧАЛЬНО-МЕТОДИЧНИЙ ПОСІБНИК 482.09 KB
  Вивчення історії України має не тільки пізнавальне, а й виховне значення, в якому закладено глибокий гуманістичний зміст. Зокрема, одним із головних завдань викладання вітчизняної історії є виховання у студентської молоді почуття патріотизму, громадянської свідомості, виховання майбутніх спеціалістів, яким належить утверджувати державність України.
48730. Методы локализации неисправностей на аппаратуре СВ и РМ 91 KB
  БИВ блок индикатора вспомогательный. Задана внешнее проявление неисправности на экране ЭЛТ БИВ отсутствует изображение. Отследим тракт прохождения сигнала при выводе цифровой информации на экране БИВ. Наша неисправность выражается как отсутствие изображения на экране БИВ.
48731. Проектирование ОКС №7 на городской телефонной сети с УВС и УИС 788.5 KB
  Рисунок 1 – Схемы организации резервного обходного маршрута для направления нормального пучка А→В при пункте назначения F В зависимости от количества возможных маршрутов резервирования для направления нормального пучка А→В возможны варианты: один резервный маршрут. Если резервный маршрут для направления пучка А→В совпадает с нормальным маршрутом из табл. Резервные маршруты совпадают с нормальными маршрутами за исключением одного звена для которого организован резервный маршрут который выбирается из таблицы 11. В данную таблицу вносится...
48732. ПРОЕКТИРОВАНИЕ АНАЛОГОВО-ЦИФРОВОГО ПРЕОБРАЗОВАТЕЛЯ С USB ВЫХОДОМ 1.37 MB
  Расчет аналоговой части АЦП Расчет цифровой части АЦП Микросхема АЦП Фильтр нижних частот Заключение Библиографический список Введение Аналогоцифровой преобразователь АЦП представляет собой устройство обеспечивающее преобразование аналогового сигнала в цифровой код который передается в микропроцессорную систему.
48733. Организация производства асфальта с полимерными добавками 317.5 KB
  Таблица 1. Европа Япония Китай Канада по достоинству оценили физикотехнические свойства асфальта с полимерными добавками и используют его повсеместно Таблица 2. Таблица 2. Проведем анализ внешней и внутренней среды предприятия чтобы выявить сильные и слабые стороны ООО СМУ АБЗ Таблица 3.
48734. Проектирование электрической сети для электроснабжения потребителей цнлюлозно – бумажной промышленности 1.35 MB
  По заданному расположению источника питания и потребителей электроэнергии составляем схемы электрической сети. Находим расстояние между районной электрической станцией РЭС и подстанциями, и между подстанциями.
48735. Проектирование электрической сети 1.54 MB
  Главным потребителем электроэнергии является промышленность. За последние 10 лет в структуре энергобмена страны более чем в два раза увеличилась доля электроэнергии, потребляемой на потенциально-бытовые нужды