АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ

Некоммерческое акционерное общество

АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ

Кафедра инженерной кибернетики

 

 

АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ

Методические указания к выполнению лабораторных работ  для студентов специальности

 5В074600 – Космическая техника и технологии

 

Алматы 2013

 

 

СОСТАВИТЕЛИ: Омарова Г.А.,Сауанова К.Т., Методические указания к лабораторным работам по курсу «Алгоритмизация и программирование» для студентов специальности 5В074600 – Космическая техника и технологии. - Алматы: АУЭиС, 2013.- 44с.

 

Методические указания предназначены для изучения основ алгоритмизации и программирования на языке Си/Си++.

Ил.-5, табл.-6, библиогр.-9

 

Рецензент: канд.техн.наук., профессор Байкенов А.С.

 

Печатается по плану издания некоммерческого акционерного общества «Алматинский  универсистет энергетики и связи» на 2013 г.

 

© НАО “Алматинский университет энергетики и связи”, 2013 г.

Содержание

 

Введение

4

1 Лабораторная работа №1. Алгоритм линейной структуры

5

2 Лабораторная работа №2. Алгоритм ветвления

9

3 Лабораторная работа №3. Циклические алгоритмы

12

4 Лабораторная работа №4. Обработка одномерных массивов

15

5 Лабораторная работа №5. Строки

18

6 Лабораторная работа №6. Многомерные массивы

21

7 Лабораторная работа №7. Функции

24

8 Лабораторная работа №8. Указатели

27

9 Лабораторная работа №9. Структуры

30

10 Лабораторная работа №10. Файлы

35

Приложение А

40

Приложение Б

41

Приложение В

42

Список литературы

43

 

 

Введение

 

Методические указания  к лабораторным занятиям по курсу «Алгоритмизация и программирование» содержат  описания лабораторных работ по данному курсу. Выполнение приведенных лабораторных работ в полном объеме способствует закреплению и углублению знаний и развитию навыков использования средств языков  Си/Си++.

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

В каждой лабораторной работе приводятся краткие теоретические сведения по темам лабораторных работ, варианты заданий и примеры разработки программ на языке Си/Си++.

Выполнение приведенных лабораторных работ в полном объеме  способствует закреплению и углублению знаний и развитию навыков использования средств языков  Си/Си++.

 

1 Лабораторная работа №1.  Алгоритм линейный структуры

 

Цель работы: изучение среды Турbo C++ и структуры программы, написанной  на языке Си/Си++; изучение правил записи выражений, операторов присваивания, процедур ввода и вывода данных.

 

1.1  Варианты  заданий  (см. таблицу 1.1)

 

Таблица 1.1 – Варианты заданий

№  варианта

задание

1

Y=

2

Y=

3

Y=

4

Y=

5

Y=

6

Y=

7

Y=

8

Y=

9

Y=

10

Y=)

11

Y=

12

Y=

13

Y=

14

Y=

15

 

Y=

 

 

1.2 Методические указания к выполнению лабораторной работы

 

 Изучение среды Турbo C++.

 Для создания программы в среде Турbo C++ входим во вкладку FILE-NEW (см. рисунок 1).

 

 

Рисунок 1 – Создание нового файла

 

После набора исходного текста программы запускаем ее на компиляцию (см. рисунок 2).

 

 

Рисунок 2  - Запуск программы на компиляцию

 

Во время компиляции выявляются синтаксические и логические ошибки.

После успешного завершения компиляции запускаем программу на выполнение (см. рисунок 3).

 

 

Рисунок 3  - Запуск программы на выполнение

 

 В диалоговом окне вводим данные (см. рисунок 4).

 

 

Рисунок 4 - Ввод данных

 

          Для просмотра результатов вычисления переходим в пользовательское окно (см. рисунок 5).

 

 

 

Рисунок 5  - Просмотр результата

 

          Общая структура программы на С/С++:

 

          #include <имя библиотеки 1>

          #include <имя библиотеки 2>

                    ...

          #include "имя подключаемого файла 1"

          #include "имя подключаемого файла 2"

                    ...

          // прототипы функций (заголовки)

          // глобальные идентификаторы (типы, переменные и т.д.)

         

          void main()

          {

            // описание переменных

            // раздел операторов             

          }

         

          // реализация функций

 

Общий вид оператора присваивания:

y = x;

где y- переменная, x - выражение.

Выражение x может содержать константы, переменные, названия функций, знаки операций и скобки. Если выражение не содержит скобок, то операции выполняются в порядке  приоритета (см.                                                                           приложение А).

          Описание функций ввода-вывода:

-   фунция форматированного вывода printf():

printf(<управляющая строка>, <список переменных>);

-   функция putchar() – записывает в стандартный поток вывода.

int putchar(int character);

- функция puts()-записывает символьную строку в стандартный поток данных.

          Например:                      

          puts("Привет");

- функция форматированного ввода scanf(), позволяющая ввести информацию с клавиатуры:

scanf(<управляющая строка>, <список адресов переменных>);

- функция ввода строки gets(), считывающая символьную строку из стандартного входного потока и помещает ее по адресу, заданному указателем:

сhar *gets ( char *f);

- функция getchar(), считывающая символ из стандартного входного потока:

 int getchar (void);

          Описание математических функций содержится во включаемых файлах math.h и stdlib.h (см. приложение А ).

          Пример.  Вычислить следующее выражение:

 

,

при x=2.444, y=0.0869, z=-130.0  должно быть получено: -0.49871.

 

Текст  программы может иметь следующий вид:

#include <stdio.h>

#include <conio.h>

#include <math.h>

#define x 2.444

#define y 0.00869

#define z -130.0

 

void main(void)

{

 double rezult,dop,a,b,c;

    clrscr( ); /* ОЧИСТКА ЭКРАНА */

      dop=fabs(y-x);

       a=pow(x,y+1)+exp(y-1);

       b=1+x*fabs(y-tan(z));

      c=0.5*pow(dop,2)-pow(dop,3)/3;

      rezult=a/b*(1+dop)+c;

    printf("\a\n ОТВЕТ:  rezult=%lf, Press any key...", rezult);

  getch( );  /* ЗАДЕРЖКА ДО НАЖАТИЯ ЛЮБОЙ КЛАВИШИ */

}

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

-  скриншот результата программы.

 

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

1.  Структура простейшей программы на Си.

2.  Напишите формат и пример операции форматированного вывода (форматированного ввода) на экран.

3. Напишите формат и пример операции форматированного ввода с клавиатуры.

4.    Перечислите управляющие символы, используемые в программе в форматной строке.

5.  Перечислите спецификаторы формата, используемые в программе в форматной строке.

6.  Напишите формат и пример операции поточного вывода на экран.             

7. Напишите формат и пример операции форматированного ввода с клавиатуры.

8.  Перечислите директивы препроцессора.

 

2 Лабораторная работа №2. Алгоритмы ветвления

 

Цель работы: приобретение навыков программирования разветвленных алгоритмов.

 

2.1 Варианты  заданий (см. таблицу 2.1)

 

Таблица 2.1 – Варианты заданий

№  варианта

задание

1

2

3

4

5

6

7

8

9

Окончание таблицы 2.1

10

11

12

13

14

15

 

 

 

2.2    Методические указания к выполнению лабораторной работы

 

Условный оператор. Условный оператор является средством ветвления.

Синтаксис описания условного оператора имеет 2 формы:

1) if (логическое выражение)  оператор 1;

 

2)  if (логическое выражение)  оператор 1;

 else  оператор 2 ;

Условный оператор работает по следующему алгоритму. Вначале вычисляется условное выражение <условие>. Если результат есть TRUE (ИСТИНА), то выполняется <оператор1>, а <оператор2> пропускается; если результат есть FALSE (ЛОЖЬ), наоборот, <оператор1> пропускается, а выполняется <оператор2>. Если при этом часть условного оператора, начиная со слова else, отсутствует, то управление немедленно передается оператору, следующему за условным.

 Оператор варианта (выбора).Для выбора одного из вариантов решения задачи используют оператор выбора. Синтаксис описания оператора выбора:

       switch (выражение)

       {

         case константа1:последовательность операторов; break;

         case константа2:последовательность операторов; break;

        case константаN:последовательность операторов; break;

        default:последовательность операторов; break;

}

Оператор варианта работает следующим образом: сначала вычисляется выражение в скобках за ключевым словом switch. Затем просматривается список меток (case константа1 и т. д.) до тех пор, пока не находится метка, соответствующая значению вычисленного выражения. Далее происходит выполнение соответствующей последовательности операторов, следующих за двоеточием. Если же значение выражения не соответствует ни одной из меток оператора switch, то выполняется последовательность  операторов, следующая за ключевым словом default.

          Условная  (тернарная) операция( ? : ).

Служит  для определения одного из операндов.

          Синтаксис : <операнд1> ? <операнд2>:<операнд3> ;

          Пример.

 x= a >b ? a: b;

 

Даны два числа: a и b, не равные нулю!

Вычислить:

Тестовый пример: a=10; b=5; .

Вариант текста С-программы:

/*Пример (использование оператора if) */

 

#include <stdio.h>

#include <conio.h>

    void main( )

      /* Пример условного оператора if */

       {

            float a,b,c;

               puts(“\n введите а и b:“);

               scanf(“%f%f”, &a, &b);

                   if (a>=b)    c=a/b;

                         else c=b/a;

     printf(“\n c=%f”, c);

  getch();

        }

Отчет на  лабораторную работу должен содержать:

-   задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

- скриншот результата программы.

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

1.    Какова может быть вложенность операторов ветвления?

2.    Напишите формат и пример тернарной операции.

3.    Напишите формат и пример условного оператора в полной форме.

4.    Напишите формат и пример условного оператора в краткой форме.

5.    Напишите формат и пример оператора выбора.

6.    Для чего предназначена  директива препроцессора #include?

7.    Для чего предназначена  директива препроцессора #define?

8.    Как происходит подключение стандартных библиотек?

 

3 Лабораторная работа №3. Циклические алгоритмы

 

Цель работы: приобретение навыков программирования алгоритмов циклических структур.

 

3.1 Варианты   заданий (см. таблицу 3.1)

 

Таблица 3.1 – Варианты заданий

№  варианта

задание

1

1. 

2

2.

3

4

5

6

7

8

9

 

Окончание таблицы 3.1

10

11

12

13

14

15

 

 

3.2 Методические указания к выполнению лабораторной работы

 

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

Оператор цикла  с параметром FOR имеет такую структуру:

for (выражение 1; выражение 2; выражение 3 ) оператор;

где

- выражение 1 – установление начального значения переменной-параметра цикла (инициализация);

- выражение 2 – проверка условия на продолжение  цикла;

- выражение 3 – изменение параметра цикла (коррекция параметра);

- оператор – простой или составной оператор языка.

          Оператор цикла с постусловием (do-while).

Синтаксис записи оператора:

do <тело_цикла> while (условие);

do, while – зарезервированные слова;

тело_цикла - произвольный оператор (или набор операторов);

условие – логическое выражение.

Тело  цикла обязательно выполнится  хотя бы один раз, после чего вычисляется значение выражения_условия. Операторы тела цикла повторяются до тех пор, пока верно условие.

           Оператор цикла с предусловием (while).

Синтаксис записи оператора:

while (условие) тело_цикла;

где while – зарезервированное слово.

Если «условие» имеет значение  true, то выполняется тело цикла, после чего вычисляется снова значение условие  и его проверка повторяется. Цикл выполняется до тех пор, пока условие принимает значение «истинно» (т.е. отлично от нуля). Когда же условие примет значение «ложно», программа передаст управление следующему оператору программы.

Пример.

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

Текст программы может иметь вид:

#include <stdio.h>

#include <conio.h>

#include <math.h>

#define n 10    // задали число слагаемых

 

void main(void)

{

  float s; int k;

    clrscr( ); // ОЧИСТКА ЭКРАНА

      puts("\n ЛАБОРАТОРНАЯ РАБОТА N3 - ОПЕРАТОРЫ ЦИКЛА  ");

      puts("\n ===========================================\n");

       s=0;

          for (k=1; k<=n; k++)

            {

              s=s+1.0/k;

              printf(" \t\n k=%d s=%f  1.0/k=%f", k, s, 1.0/k);

            }

      puts("\n");

   printf("\a\n ОТВЕТ:  s=%f, Press any key...",s);

  getch( );  /* ЗАДЕРЖКА ДО НАЖАТИЯ КЛАВИШИ ENTER */

}

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

- скриншот результата программы.

 

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

1. Какой процесс называется ”циклическим”?

2. Чем отличается оператор цикла с предусловием от оператора цикла с параметрами?

      3. Как происходит подключение стандартных библиотек?

4.Поясните понятие «Вложенный цикл».

5. Какое значение должно быть выполнено для работы оператора цикла с постусловием (истина или ложь)?

6. Какую роль играет операция «запятая» для оператора  цикла for?

6. В чем отличие операторов цикла с предусловием от постусловия?

7. Какую роль играет переменная-счетчик?

8. Можно ли использовать вложенность  цикла с предусловием в цикл с постусловием?

 

4 Лабораторная работа №4.  Обработка  одномерных массивов

 

Цель работы: приобретение навыков программирования при решении задач с использованием одномерных  массивов.

 

           4.1 Варианты  заданий

 

1. Дан массив размера N. Вывести его элементы в обратном порядке. 

2. Дан массив размера N. Вывести вначале его элементы с четными1|нечетными2 индексами, а затем — с нечетными1|четными2. 

3. Дан целочисленный массив A размера 10. Вывести номер первого1|последнего2 из тех его элементов A[i], которые удовлетворяют двойному неравенству: A[1] < A[i] < A[10]. Если таких элементов нет, то вывести 0. 

4.  Дан целочисленный массив размера N. Преобразовать его, прибавив к четным1|нечетным2 числам первый3|последний4 элемент. Первый и последний элементы массива не изменять. 

5. Дан целочисленный массив размера N. Вывести вначале все его четные1|нечетные2 элементы, а затем — нечетные1|четные2. 

6. Поменять местами минимальный и максимальный элементы массива размера 10. 

7. Заменить все положительные1|отрицательные2 элементы целочисленного массива размера 10 на значение минимального3|максимального4. 

8. Дан массив размера 10. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами. 

9. Дан массив размера N. Осуществить циклический сдвиг элементов массива влево1|вправо2 на одну позицию. 

10. Дан массив размера N и число k (0 < k < 5, k < N). Осуществить циклический сдвиг элементов массива влево1|вправо2 на k позиций. 

11. Проверить, образуют ли элементы целочисленного массива размера N арифметическую1|геометрическую2 прогрессию. Если да, то вывести разность1|знаменатель2 прогрессии, если нет — вывести 0. 

12. Дан массив ненулевых целых чисел размера N. Проверить, чередуются ли в нем [четные и нечетные]1|[положительные и отрицательные]2 числа. Если чередуются, то вывести 0, если нет, то вывести номер первого элемента, нарушающего закономерность. 

13. Дан массив размера N. Найти количество его локальных минимумов1|максимумов2. 

14. Дан массив размера N. Найти максимальный1|минимальный2 из его локальных минимумов1|максимумов2. 

15. Дан массив размера N. Определить количество участков, на которых его элементы монотонно возрастают1|убывают2. 

 

      4.2 Методические указания к выполнению лабораторной работы

          Массив – это структура данных, состоящая из фиксированного числа компонент одного типа. К компонентам массива обеспечен доступ при помощи указания индексов компонент. Описание типа массива задается следующим образом:

тип  имя_масссива [размер];

Количество индексов «размер» определяет размерность массива.

          Заполнение массива значениями  с клавиатуры:

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

                    scanf (“%d”, &A[i]);

          Вывод на экран значений элементов массива:

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

printf (“%d ”, A[i]);

Пример.

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

Текст программы может быть следующим:

#include <stdio.h>

#include <ctype.h>

#include <conio.h>

 

void main(void)

{

   int a[4]={-1,-20,4,100};   // обьявление массива a

     int i,index,zam,max,kp,ko;

       clrscr();

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

              printf("%d  ",a[i]);

                         max=a[0]; kp=0; ko=0;

                for (i=1; i<=3; i++)

                    {

                      if (a[i]>max)

                         {

                           max=a[i]; index=i;

                           }

                    }

       zam=a[0]; a[0]=max; a[index]=zam;

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

          {

            if (a[i]<0) ko=ko+1;

                     else kp=kp+1;

          }

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

      printf("%d  ",a[i]);/* вывод элементов массива */

           printf("\n  положительных элементов массива: %d \n",kp);

                   printf(" \n  отрицательных  элементов массива: %d",ko);

  getch();

}

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

-  скриншот результата программы.

 

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

1.    Заполните массив float x[15] [15] случайными числами из диапазона

0-1;     

2.    Опишите массив А, содержащий 10 элементов целого типа.

3.    В каком случае размерность массива можно явно не указывать?

4.    Пусть объявлен массив int m[6]={5, 3, 2}; Чему равен элемент m[4]?

5.    Чему равно нижнее значение индекса?

6.  Какую роль играет переменная-счетчик?

7.  Что такое массив?

8.  Какими операторами можно ввести массив?

 

5 Лабораторная работа №5. Строки

 

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

 

          5.1 Варианты заданий

 

1. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина L кратна 2,  то удаляются все числа, которые делятся на 2.

2. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина L четная,  то удаляются 2 первых и 2 последних символа.

3. Выяснить, имеются ли среди символов S1...Sn некоторой строки все буквы, входящие в слово DOS.

4. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина L нечетная, то удаляется символ, стоящий посередине строки.

5. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в  строке длиной К символов каждого второго символа ! на $.

6. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод".  Составить программу для замены в строке длиной К символов всех пробелов на символ $.

7. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина L>10, то удаляются все цифры.

8. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина L кратна 3,  то удаляются все числа, делящиеся на 3.

9. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина  L кратна 5,  то подсчитывается количество скобок всех видов.

10. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина L кратна 4, то первая часть строки меняется местами со второй.

11. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина L=10, то удаляются все A...Z.

12. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина  L >15, то удаляются все a…z.

13. В строке символов поменять местами символы на четных и нечетных позициях.

14. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и если длина L >6, то выделяется подстрока в { } скобках.

15. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие  клавиши "Ввод". Программа должна определить длину введенной  строки L и если длина

 

5.2 Методические указания к выполнению лабораторной работы

 

Строка – это массив, элементы которого являются символы.

Основные действия над строками и символами реализуются с помощью описываемых ниже стандартных  функций (см. таблицу 5.1):

 

Таблица 5.1 – Прототипы функций

синтаксис

описание

1

size_t strlen (const char *s)

возвращает длину в байтах строки s, не включая '\0'

2

char * strcat (char *st, const char *src)

присоединяет строку src в конец строки st

3

char * strcpy (char *st, const char *src)

копирует строку src в место па­мяти, на которое указывает st

4

char * strncat (char *st, const char *src, size_t maxlen)

присоединяет maxlen символов строки src в конец строки st

5

char * strncpy (char *st, const char *src, size_t maxlen)

копирует maxlen первых символов строки src в место памяти, на которое указывает st

6

char * strstr (char *st, const char *s2)

отыскивает первое вхождение строки s2 в строку st

7

int strcmp (const char *st, const char *s2)

сравнивает две строки в лекси­кографическом порядке с учетом различия прописных и строчных букв; возвращает значение меньше нуля, если st располагается в упорядочен­ном по алфавиту порядке раньше, чем s2, и больше нуля, если наоборот. Функция возвращает нуль, если строки идентичны

8

char *strchr (char * S1, char ch)

 

поиск в строке S1 первого вхождения символа ch

9

int strncmp (char * S1, char * S2, int maxlen)

 

 возвращает 0, если S1==S2, возвращает < 0, если S1 < S2 и возвращает > 0, если S1 > S2

сравнивается только первые maxlen символов двух строк

10

char *strlwr (char * S)

 

переводит всю строку S в нижний регистр (в строчые. буквы)

11

char *strupr (char * S)

 

переводит всю строку S в верхний регистр (прописные. буквы)

12

char *strset (char * S, char ch)

заполняет всю строку S символами ch

13

char *strrev (char * S)

инвертирует все буквы в строке S

(зеркально переворачивает)

14

char *strpbrk (char * S1, char * S2)

 

просматривает строку S1 до тех пор, пока в ней не встретится символ, содержащийся в строке S2

 

          Пример.

           В  программе  значение строки формируется с клавиатуры, а затем введенная строка распечатывается в обратном порядке:

#include <stdio.h>

#include <string.h>

#include <conio.h>

 

void main(void)

{

   char s[100];   // обьявление символьного массива

    int i, k;

      clrscr();

      puts(" Введите исходную строку");

       gets(s);

          k=strlen(s);

          puts(" ...   РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ ......\n");

            for (i=k; i>=0; i--)

              printf("%c",s[i]);

              /* вывод элементов массива в обратном порядке */

      printf("\n Press any key...");

    getch();

  }

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

-  скриншот результата программы.

 

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

1.    Что означает нуль-терминатор?

2.    Какими переменными инициализируются строки?

3.    Как инициализируются строки?

4.    Как обратиться к элементу строки?

5.    Как происходит подключение стандартных библиотек.

6.    Что такое строка?

7.    Чем отличие стоки от одномерных массивов?

8.    Какая стандартная библиотека отвечает для работы со строками?

 

6 Лабораторная работа №6. Многомерные массивы

 

Цель работы: приобретение навыков программирования при решении задач с использованием многомерных  массивов.

 

6.1 Варианты заданий

1. Дано число k (0 < k < 11) и матрица размера 4 x 10. Найти сумму и произведение элементов k-го столбца данной матрицы. 

2. Дана матрица размера 5 x 9. Найти суммы элементов всех ее четных1|нечетных2 строк3|столбцов4. 

3. Получить целочисленную квадратную матрицу, элементами  диагоналей которой являются упорядоченные числа  по возрастанию.

 

1

 

 

 

1

 

2

 

2

 

 

 

3

 

 

 

4

 

4

 

5

 

 

 

5

 

4. Дана действительная квадратная матрица порядка 2n. Получить новую матрицу, переставляя 1 и 2 ее блоки :

 

  

 

1

 

2

 
 

 

 

 


                                         

 

 5. Дана действительная квадратная матрица порядка n. Найти наименьшее из значений элементов, расположенных в заштрихованной части матрицы.

 

    

 


                                                    

                 

 

 

 

6. Дана матрица размера 5 x 10. Преобразовать матрицу, поменяв местами минимальный и максимальный элемент в каждой строке1|столбце2. 

7. Дана матрица размера 5 x 10. Найти минимальное1|максимальное2 значение среди сумм элементов всех ее строк3|столбцов4 и номер строки3|столбца4 с этим минимальным1|максимальным2 значением. 

8. Дана матрица размера 5 x 10. Найти минимальный1|максимальный2 среди максимальных1|минимальных2 элементов каждой строки3|столбца4. 

9. Дана целочисленная матрица размера 5 x 10. Вывести номер ее первой1|последней2 строки3|столбца4, содержащего равное количество положительных и отрицательных элементов (нулевые элементы не учитываются). Если таких строк3|столбцов4 нет, то вывести 0. 

10. Дана матрица размера 5 x 10. Вывести номер ее первой1|последней2 строки3|столбца4, содержащего только положительные элементы. Если таких строк3|столбцов4 нет, то вывести 0. 

11. Дана целочисленная матрица размера M x N. Различные строки (столбцы) матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках (столбцах). Найти количество строк1|столбцов2, похожих на первую3|последнюю4 строку1|столбец2. 

12. Дана целочисленная матрица размера M x N. Найти количество ее строк1|столбцов2, все элементы которых различны. 

13. Дана целочисленная матрица размера M x N. Вывести номер ее первой1|последней2 строки3|столбца4, содержащего максимальное количество одинаковых элементов. 

14. Дана квадратная матрица порядка M. Найти сумму элементов ее главной1|побочной2 диагонали. 

15. Дана квадратная матрица порядка M. Найти суммы элементов ее диагоналей, параллельных главной1|побочной2 (начиная с одноэлементной диагонали A[1,M]1|A[1,1]2). 

16. Дана квадратная матрица порядка M. Вывести минимальные1|максимальные2  из элементов каждой ее диагонали, параллельной главной3|побочной4 (начиная с одноэлементной диагонали A[1,M]3|A[1,1]).

 

  6.2 Методические указания к выполнению лабораторной работы

 

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

Описание типа массива задается следующим образом:

тип  имя_масссива [размер1] [размер2]… [размерn];

          Пример. 

//ввод и вывод массива

           ...

for (i=0; i<N; i++)                            // заполнение

          for (j=0; j<N; j++)                  // двумерного массива

                  scanf (“%d”, &A[i][j]); // значениями  с клавиатуры:

 

for (i=0; i<N; i++)                             // вывод

          for (j=0; j<N; j++)                    // на экран значений

                       printf (“%d ”, A[i][j]); // элементов массива

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

-  скриншот результата программы.

 

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

1.  Как описывается двумерный массив?

2.  Какими методами можно проинициализировать массив?

3.  С помощью каких  операторов  можно ввести элементы массива?

4.  В каком случае размерность массива можно явно не указывать.

5. Есть ли стандартная библиотека для работы с массивами?

6. С помощью каких  операторов  можно вывести элементы массива?

7. Что такое многомерный массив?

8. Можно ли присваивать элементы одного массива другому?

 

7 Лабораторная работа №7. Функции

 

Цель работы: познакомиться с механизмом составления и организации взаимодействия пользовательских функций языка Си/Си++.

 

   7.1 Варианты  задания

1. Даны массивы А(5,5), В(5,5), С(5,5). Найти минимальное произведение ненулевых элементов, расположенных в нечетных строках этих массивов.

2. Даны отрезки a,b,c,d. Для каждой тройки этих отрезков, из которых можно построить треугольник, вычислить площади треугольников. Площадь треугольника , где .

3. Даны  массивы А(4,4), В(4,4), С(4,4). Найти произведение минимальных элементов двух массивов.

4. Даны  массивы A(5,5), B(5,5), C(5,5). Найти произведение минимальных элементов, расположенных выше побочной диагонали в этих массивах.

5. Даны  массивы A(5,5), B(5,5), C(5,5). Поменять местами максимальные и минимальные элементы.

6. Дано натуральное число N (N > 99). Определить число сотен в нем.

7. Даны три массива А(5,5), В(5,5), С(5,5). Поменять местами строки со столбцами местами, если  хобя бы один элемент строки будет нулевым.

8. Дано натуральное число N (N > 10000). Определить сумму цифр первых K разрядов числа N (K  4).

9. Даны натуральные числа n,m. Получить произведение m последних цифр числа n.

10. Даны натуральные числа n,m. Найти наибольший общий делитель n и m (наименьшее общее кратное n и m), используя алгоритм Евклида.

Пусть n и m – одновременно не равные нулю целые неотрицательные числа  и  пусть m  n. Тогда,  если n = 0, то NOD (n,m) = m, и если n ≠ 0, то для чисел m, n, r, где r остаток от деления m на n, выполняется равенство NOD (m,n) = NOD (n,r). Например, NOD (15,6) = =NOD (6,3) = NOD (3,0) = 3.

11. Даны натуральные числа a,b,c,d. Вычислить f(a)·f(b)+f(c)f(d), где

     

12. Дано натуральное число N. Удалить из записи числа N цифры 0 и 5, оставив прежним порядок остальных цифр. Например, из числа 59015509 должно получиться число 919.

13. Дано натуральное число N. Получить все такие натуральные K, что N делится на K2 и не делится на K3.

14. Даны натуральные целые числа n и m, вычислить A(n,m), где

    

15. Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу (как, например, 153=13+53+33 ). Получить все числа Армстронга, состоящие из двух, трех и четырех цифр.

 

7.2 Методические указания к выполнению лабораторной работы

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

<тип_результата > имя(<список формальных параметров>)
{
тело функции ;
}

   где <имя> - имя  функции (правильный идентификатор);

          <тип_результата> - тип возвращаемого функцией результата.

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

Пример.

/* Программа запрашивает элементы целочисленного массива размером 3Х3 и передает сформированный массив в пользовательскую функцию, которая подсчитывает сумму его положительных значений */

#include <stdio.h>

#include <conio.h>

void summa(int a1[ ][3]);

void main(void)

 {

   int a[3][3];

    int i,j;

     clrscr();

      printf("\n Введите девять  целых чисел \n");

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

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

              {

                 printf("\n a[%d][%d]=", i, j);

                 scanf("%d", &a[i][j]);

              }

              summa(a);

 }

void summa(int a1[ ][3])

  {

    int i,j,s;

      puts("             ФУНКЦИЯ summa        ");

       puts("----------------------------------");

     /* ВЫЧИСЛЕНИЕ СУММЫ ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ МАССИВА */

           s=0;

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

              {

                printf("\n");

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

                     {

                                 if (a1[i][j]>0)

                                       {

                                          s=s+a1[i][j];

                                       }

 

                     }

              }

 printf("\a  СУММА ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ\

 МАТРИЦЫ =%d, Press any key... ",s);

 getch();

}

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

-  скриншот результата программы.

 

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

1.    Чем функция пользователя отличается от стандартной функции ?

2.    Какие способы передачи аргументов в функцию?

3.    В чем заключается отличие  локальных и глобальных переменных?

4.    Для чего и каким образом применяется оператор return ?

5.    Может ли функция вызывать сама себя?

6.    Для чего нужны формальные переменные?

7.    Как происходит активизация функции?

8.    Что такое прототип функции?

 

8 Лабораторная работа № 8. Указатели

 

Цель работы: познакомиться с механизмом организации взаимодействия работы указателей с массивами.

 

8.2 Варианты заданий

 

1.    Если у массива А(10) есть элемент, равный В, то переменной Х присвоить значение, равное сумме всех положительных четных элементов, предшествующих первому по порядку такому элементу, иначе переменной Х присвоить 0.

2.    Если у массива А(10) есть элемент, равный квадрату последнего элемента, то все элементы, следующие за ним, возвести в квадрат, иначе вывести массив без изменения.

3.    Переменной Х присвоить 1, если элементы массива В(10) образуют возрастающую последовательность и значение 0 в противном случае.

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

5.    По двум заданным одномерным массивам формируется третий, содержащий в начале элементы первого, а в конце – элементы второго массива.

6.    По двум заданным одномерным массивам формируется третий, содержащий попарно максимальные числа.

7.    Построить упорядоченный массив А(20) из элементов массивов В(10) и С(10). Массивы В(10) и С(10) предварительно упорядочены по возрастанию.

8.    Дан массив А(40). Упорядочить элементы массива по убыванию.

9.    Дан массив А(50). Определить количество отрицательных элементов, расположенных на четных позициях, и сумму положительных элементов, расположенных на нечетных позициях.

10. Дан массив А(50). Каждый пятый элемент массива возвести в пятую степень.

11. Дан массив А(20). Найти минимальный элемент массива, упорядочить элементы, расположенные до этого элемента по убыванию.

12. Дан массив А(30). Если среди элементов массива  есть элемент равный некоторому числу М, то переменной Х присвоить произведение ненулевых элементов, расположенных до этого элемента, в противном случае переменной Х присвоить 0.

13. Найти сумму и количество положительных элементов, предшествующих первому нулевому элементу.

14. Дан массив А(50). Найти сумму и количество нечетных положительных элементов, следующих за первым по порядку нулевым элементом.

15. Дан массив А(50). Найти максимальное количество подряд идущих положительных четных элементов.

 

8.2 Методические указания к выполнению лабораторной работы

Указатель –особый вид переменной, которая хранит адрес элемента памяти. Определение указателя:

 type * variable_name;

где type  - тип данных указателя;

       *  - звездочка, определяющая тип «указатель»;

      variable_name  - имя переменной.

Пример.

int х, *point ;  // переменная целого типа и указатель на целый тип

Существует унарная операция, неразрывно связанная с указателями, - это операция взятия адреса: &.

Пример.

point=&x; // в point записывается адрес переменной х

где point – указатель;

       x – переменная.

Связь между указателями и массивами.

При обработке массива удобно использовать указатель на массив. Любой доступ к элементу массива, осуществляемый операцией индексирования, может быть выполнен  и при помощи указателя.

Пример.

 … int m[10];

 *(m+10) // обращение к 10-му элементу

Если х – есть указатель и определен как int  * x, то в результате присваивания:

x= &m[0];

x будет указывать на нулевой элемент массива m, т.е. будет содержать адрес элемента m[0] .

Между именем массива и указателем, имеющим значение адреса массива имеется существенное различие. Указатель – это переменная, а имя массива – это указатель-константа.

Пример.

/* Связь  указателя с одномерным массивом */

#include<stdio.h>

#include<conio.h>

 

void main()

{

    int  i,  a[5],  *pa,  s=0;

               clrscr();

 pa=a; //pa=&a[0];

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

          {scanf("%d",pa);

                      s+=*pa;

                               pa++;

           }

  pa-=5;

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

          {    printf("%d ",*pa);

            pa++;

          }

  printf("\n s=%d",s);

  getch();

}

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

-  скриншот результата программы.

 

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

1.    Приведите пример связи указателя с одномерным массивом.

2.    Приведите пример связи указателя с матрицей.

3.    Заполните массив float x[15] [15] случайными числами из диапазона

0..1 с помощью указателя;

4.    Имя массива может использоваться, как адрес нулевого элемента массива?

5.    Может ли указатель менять адрес переменной?

6.    Какой тип может иметь переменная типа указатель?

7.    В чем отличие указателя и имени массива?

 

9 Лабораторная работа №9. Структуры

 

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

 

      9.1 Варианты заданий

 

1.    Даны сведения о студентах группы: ФИО студента, дата рождения студента, место рождения студента. Вывести список группы по убыванию года рождения студента.

2.    Даны сведения о результатах аттестации: ФИО студента, название пяти предметов и баллы, полученные по каждому предмету. Вывести фамилии студентов, аттестованных по всем предметам.

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

4.    Даны сведения о книгах, поступивших в библиотеку: ФИО автора, название книги, название издательства, год издания, дата поступления книги в библиотеку. Вывести сведения о книгах, изданных издательством “Мир”, которые поступили в библиотеку за последние пять лет.

5.    Даны сведения о результатах сессии: ФИО студента, названия четырех предметов и  оценки, полученные по каждому предмету. Вывести список группы по убыванию общего балла.

6.    Условие предыдущей задачи сохраняется. Требуется вывести фамилии студентов, общий балл  которых отличается не более чем на 2 балла от максимального общего балла.

7.    Условие предыдущей задачи сохраняется. Вывести фамилии студентов, балл по определенному предмету которых превышает средний балл по предмету на 0.5 балла.

8.    Даны сведения об экспорте товаров: название страны, импортирующей товар, наименование товара и объем поставляемой партии в штуках. Найти страны, в которые экспортируется данный товар и общий объем его экспорта.

9.    Условие предыдущей задачи сохраняется. Вывести сведения об экспорте товаров по убыванию объема экспорта определенного товара.

10.Условие предыдущей задачи сохраняется. Вывести сведения об экспорте товаров в определенные страны.

11.Даны сведения о студентах потока: ФИО студента, название группы, год рождения. Вывести сведения об однофамильцах потока.

12.Условие предыдущей задачи сохраняется. Требуется вывести сведения об однофамильцах определенной группы.

13.Даны сведения о сотрудниках фирмы: ФИО сотрудника, год рождения, адрес, номер телефона. Вывести сведения о сотрудниках, возраст которых не превышает средний возраст сотрудников.

14.Даны сведения об автомобиле: ФИО владельца, стоимость, марка и номер автомобиля. Найти количество автомобилей каждой марки.

15.Условие предыдущей задачи сохраняется. Требуется вывести сведения об автомобилях по возрастанию стоимости автомобиля.

 

9.2 Методические указания к выполнению лабораторной работы

 

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

          Определение структуры состоит из двух шагов:

- объявление шаблона структуры;

- определение переменных типа объявленного шаблона.

          Синтаксис объявления шаблона структуры:

struct имя_шаблона

{ тип 1 имя_переменой1 ;

   тип 2 имя_переменой2 ;  

  тип n  имя_переменойn ;

};                     

     где      struct-  зарезервированное слово, определяющее структуру;

                 имя_шаблона - правильный идентификатор имени шаблона;

                 тип ,  имя_переменой – поле структуры, где задается тип и имя поля.

Пример.

struct person

          { char name [50];

              char sex;

                int vozrast;

             } ;

          Если в программе используется один экземпляр структуры, то имя такой структуры можно опустить.

Пример. 

struct

          { int chisl;

              char sex;

                int vozrast;

             } ;                   

 

          Описание структуры-переменной производится следующим образом:

struct имя_шаблона имя_переменной;

Пример. 

struct  student aisu_12_1k [15];

Описание шаблона можно совмещать с определением структурной переменной.

Пример. 

struct student

          { char name [50];

              char gruppa[10];

                int kurs;

             } aisu_12_1k [15], aisu_12_2k [15], ;  aisu_12_1r [15];                   

 

Для организации доступа к полям структуры используется  составное имя, в котором используется:

1)    прямой доступ к элементу (оператор «.»).

Синтаксис: имя_переменной_структуры.имя_поля;

Пример. 

aisu_12_1r [5].kurs=1;                    

2)    доступ по указателю (оператор «->»)

Синтаксис: имя_указателя->имя_поля;

(*имя_указателя).имя_поля;

Пример. 

….

point->kurs=1;

или

                (*  point) . kurs=1;

….

Полем структуры может быть элемент  типа структура.

Пример. 

struct ozenka

          { char disziplina [50];

              int ball;

             } ;

         struct student

          { char name [50];

              char gruppa[10];

   struct ozenka;

                int kurs;

             } aisu_12_1k [15], aisu_12_2k [15], ;  aisu_12_1r [15];    

…              

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

          Пример.

/* Создается массив данных о студентах группы. Определить средний балл за сессию и отсортировать список по сумме баллов */

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

#include <string.h>

typedef struct _student

{ char fio[80];

       int mark[5];

    } student ;

 

void main()

{

int i.   j,  k,  size;

student st[100], * stp[100], * tmp;

 

   do

{

 cout <<  endl  << “введите количество студентов”;

             cin>> size;

} while (size<100);

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

 

          {fflush (stdin);

                    cout << “\nвведите фамилию студента: ”;  / /вводим данные

                              cin>> st[i].fio;            

                                                  cout << “\n введите его оценки ”;

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

cin>> st[i].mark[j];

                              stp[i]=&st[i];

          }

 

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

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

if (strcmp(stp[i]->fio,stp[j]->fio)>o)

{tmp=stp[i];

          stp[i]= stp[j];

                    stp[j]=tmp;

}

 

cout << “\n результат выполнения: “;

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

 

 

                        cout << stp[i]-> mark[j]<< “  ”;

         }

}

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

-  скриншот результата программы.

 

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

1.    Как описываются структуры в языке Си/Си++?

2.    Какого типа могут поля структуры?

3.    Как обратиться к полю?

4.    Как объявить массив из структур?

5.    Что такое структура?

6.    Какими  методами можно обращаться к полям структуры?

7.    Как вводятся поля структуры?

8.    Как выводятся поля структуры?

 

10 Лабораторная работа №10. Файлы

 

Цель работы: приобретение навыков программирования при решении задач с использованием типа файл.

 

    10.1 Варианты заданий

 

1.  Дан файл f, компоненты которого являются дейст­вительными числами. Найти:

   - сумму компонент файла f;          

   -  последнюю компоненту файла.

2. Дан файл f, компоненты которого являются дейст­вительными числами. Найти:

   - наименьшее из значений компонент с четными но­мерами;

   - разность первой и последней компонент файла.

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

4. Дан файл f, компоненты которого являются целыми числами. Записать в файл g все четные числа файла f, а в файл h — все нечетные. Порядок следования чисел сохраняется.

5. Дан символьный файл f. Записать в файл g ком­поненты файла f в обратном порядке.

6. Дан файл f, компоненты которого являются целыми числами. Никакая из компонент файла не равна нулю. Файл f содержит столько же отрицательных чисел, сколько и положительных. Используя вспомогательный файл h, переписать компоненты файла f в файл g так, чтобы в файле g:

-  не было двух соседних чисел с одним знаком;

-  сначала шли положительные, потом отрицательные числа.

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

8. Даны символьные файлы f и g. Определить, сов­падают ли компоненты файла f с компонентами файла g. Если нет, то получить номер первой компоненты, в кото­рой файлы f и g отличаются между собой. В случае, ко­гда один из файлов имеет n компонент (n ≥ 0) и повторяет начало другого (более длинного) файла, ответом должно быть число n+1.

9. Дан символьный файл f. Группы символов, раз­деленные пробелами (одним или несколькими) и не содер­жащие пробелов внутри себя, будем называть словами. Удалить из файла все однобуквенные слова и лишние пробелы. Результат записать в файл g.

10. Дан символьный файл f, содержащий сведения о сотрудниках учреждения, записанные по следующему образцу: фамилия _ имя _ отчество, фамилия _ имя _ отче­ство,  . . . Записать эти сведения в файле g, используя образцы:

-  имя _ отчество _ фамилия,    имя _ отчество _ фами­лия,  . . .;

-  фамилия _ и.o., фамилия _ и.о., . . .

11. Багаж пассажира характеризуется количеством вещей и общим весом вещей. Дан файл f, содержащий информацию о багаже нескольких пассажиров, информация о багаже каждого отдельного пассажира представляет собой соответствующую пару чисел. Найти число пассажиров, имеющих более двух вещей, и число пассажиров, количество вещей которых превосходит среднее число вещей. Определить, имеются ли два пассажира, багажи которых совпадают по числу вещей и различаются по весу  не более чем на 0,5 кг.

12. Сведения об ученике состоят из его имени и фами­лии и названия класса (года обучения и буквы), в котором он учится. Дан файл f, содержащий сведения об учениках школы. Выяснить, имеются ли однофамильцы в каком-нибудь классе. Собрать в файле g сведения об учениках 9-х и 10-х классов, поместив вначале сведения об учениках класса 9а, затем -9б и т. д., затем -10а, -10б и т. д.

13. Сведения об автомобиле состоят из его марки, номера и фамилии владельца. Дан файл f, содержащий сведения о нескольких автомобилях. Найти  фамилии владельцев и номера автомобилей данной марки и  количество автомобилей каждой марки.

14. Дан файл f, содержащий сведения об игрушках: указывается название игрушки (например, кукла, кубики, мяч, конструктор и т. д.), ее стоимость в копейках и воз­растные границы детей, для которых игрушка предназна­чена (например, для детей от двух до пяти лет). Получить следующие сведения:

-  цену самого дорогого конструктора, оформленную по образцу ... тенге ... тиын;

      - можно ли подобрать игрушку, любую, кроме мяча, подходящую ребенку 3 лет, и дополнительно мяч так, чтобы суммарная стоимость игрушек не превосходил 5 тенге?

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

-  занимает не более одной строки файла f;

-  может занимать произвольное число строк файла.

 

10.2 Методические указания к выполнению лабораторной работы

 

Под файлом понимается либо наименованная область внешней памяти ПК, либо логическое устройство - потенциальный источник или приемник информации. Файл представляет собой совокупность компонент одного типа. Типом компонентов может быть любой тип языка Си(Си++) кроме файлов. Различают 2 вида файлов: текстовые и бинарные. Указатели на файлы необходимо объявлять. Синтаксис объявления такого указателя следующий:

FILE  *указатель на файл;

Пример.     

                   FILE *f;

Для работы с файлом необходимо сделать следующие шаги:

- открыть для доступа, т.е. создать и инициализировать область данных, которая содержит информацию о файле: имя, путь и т.д. 1шаг-открыть файл;   закрыть файл;

          - ввод файла;

          - вывод файла.

Для открытия файла используется функция f=fopen(“имя_файла”,”режим”);

Пример.

          FILE  *f;

f=fopen ("D:\LAB1.СPP", "w"); //открытие файла для записи

                                                         //Если соответствующий физический файл

                                                          // существует,он будет перезаписан

 

Для закрытия файла используется функция

fclose(имя_указателя);

Пример.

 fclose(f);

Ниже приводятся  стандартные  функции для организации работы с файлами:

 fgetс() - читает и возвращает символ из открытого файла.

Синтаксис:

int  fgets(FILE *fp);

fgets()  - считывает строку из файла stream до тех пор , пока не будут считаны n-1  символов, либо символ перевода строки, либо достигнут конец файла. Возвращает указатель на  string, в случае ошибки или при достижении конца файла- NULL-указатель.

Синтаксис:

char * fgets(char *string, int n,FILE * stream);

fgetchov()  - читает и возвращает символ из файла stdin.

Синтаксис:

int  fgetchov(void);

ungetc ( ) - возвращает символ ch в файл. Следующая операция чтения символа из файла вернет этот символ.

Синтаксис:

int  ungetc(int ch, FILE *fp);

fputs( ) - записывает в файл код ch символа.

Синтаксис:

int fputs(int ch, FILE *fp)

gets ( ) - читает байты из файла stdin и записывает их в строку S до тех пор, пока не встретит символ ' \n ', который заменяется на нуль-терминатор.

Синтаксис:

int  gets (char  *S);

fgets ( ) - извлекает байты из файла, описываемого fp, и записывает их в строку S до тех пор, пока не встретит символ ' \n ' или пока не будет считано m байтов.

Синтаксис:

int  fgets (char  *S int m, FILE  *fp);

fputs ( ) - записывает в файл байты из строки S до тех пор, пока не встретится нуль-терминатор, который в файл не переносится и на символ ' \n ' не заменяется.

Синтаксис:

int fputs (char  *S, FILE  *fp);

puts ( ) - записывает в файл stdout байты из строки S до тех пор, пока не встретится нуль-терминатор, который в файл переносится и заменяется на символ ' \n '.

Синтаксис:

                    int puts (char  *S);

freаd ( ) - считывает n блоков по size байт каждый из файла fp в область памяти, на которую указывает указатель ptv (необходимо заранее отвести память под считываемый блок).

Синтаксис:

int freаd (void *ptv, int size, int n, FILE *fp);

fwrite ( ) - записывает n блоков по size байт каждый из области памяти, на которую указывает ptv, в открытый файл fp.

Синтаксис:

int fwrite (void *ptv, int size, int n, FILE *fp);

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

Синтаксис:

int fprintf (void *ptv, format-string [, argument ...]);

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

Синтаксис:

int fscanf (void *ptv, format-string [, argument ...]);

fseek ( ) - перемещает указатель, соответствующий потоку stream, на новое место расположения, отстоящее от origin на offset байтов.

Синтаксис:

int fseek (stream, offset, origin);

Отчет на  лабораторную работу должен содержать:

-  задание по варианту;

- листинг программы, записанного по правилам языка Си/Си++ (все значения для вычисления ввести с клавиатуры);

-  составить блок-схему данного алгоритма;

-  скриншот результата программы.

 

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

1.    Укажите правила открытия файла в языке С.

2.    Укажите правила открытия файла в языке С.

3.    Основные положения работы с файлами прямого доступа

4.    Какие четыре шага необходимы для работы с файлами?

5.    Для чего используются  режимы при открытии файла?

6.    Какие типы файлов бывают?

7.    Напишите синтаксис форматированного ввода в файл.

8.    Напишите синтаксис форматированного вывода в файл.

 

 

 

 

Приложение А

 

Таблица А.1 - Описание операций (операции расположены по убыванию приоритета)

операция

описание

()

вызов функции

[]

выделение массива

.

обращение к полям и методам через сам объект

->

обращение к полям и методам через ссылку на объект

!

логическое отрицание

~

побитовое отрицание

-

изменение знака

++

инкремент

--

декремент

&

взятие адреса (&a)

*

обращение по адресу (a*)

(тип)

преобразование типа

sizeof()

размер в байтах

*

умножение

/

деление

%

остаток от деления

+

сложение

-

вычитание

меньше

больше

<=

меньше равно

>=

больше равно

==

равно

!=

не равно

&

поразрядное логическое И

^

поразрядное исключающее ИЛИ

|

поразрядное логическое ИЛИ

&&

логическое И

||

логическое ИЛИ

?:

условная операция

=

операция присваивания

,

операция запятая

+=   -=   *=   /=   <<=   >>=   &=   |=   ^=

бинарные операции

 

 

Приложение Б

 

Таблица Б.1  - Описание математических функций

Функция

Математическое

обозначение

Обозначение

Абсолютное значение

|x|

fabs(x)

Косинус

cos x

cos(x)

Синус

sin x

sin(x)

Тангенс

tg x

tan(x)

Экспонента 

ех

exp(x)

 Возведение в степень

ху

pow(x,y)

Степенная функция

10n

pow10(n)

Логарифм натуральный

ln x

log(x)

Логарифм десятичный

log x

log10(x)

Корень квадратный

sqrt(x)

 

 

Приложение В

 

Таблица В.1 -  Тип доступа к файлу

 

 

Режим

 

Описание

R

 

Файл открывается только для чтения. Если нужного файла на диске нет, то возникает ошибка

W

 

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

 

A

 

Файл открывается для дозаписи в его конец новой информации

 

r+

 

Файл открывается для редактирования его данных. Возможны и запись, и чтение информации

 

         w+

 

Файл открывается для редактирования его данных. Возможны и запись, и чтение информации

 

a+

 

То же, что и для a, только запись можно выполнять в любое место файла. Доступно и чтение файла

 

t

 

Файл открывается в текстовом режиме. Указывается поле r, w, a, r+, w+, a+

b

 

Файл открывается в двоичном режиме. Указывается поле r, w, a, r+, w+, a+

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Список литературы

 

1 Керниган Б., Ритчи Д. Язык программирования Си . Пер. с англ., 3-е      изд., испр. - СПб.:      "Невский Диалект", 2001. - 352 с.

2  Борисенко В.В. Основы программирования.  http://www.intuit.ru/department/se/pbmsu/

3 Поляков К. Программирование на языке Си, 2009. http://kpolyakov.narod.ru

4 Бусько В.Л, Корбит А.Г., Коренская И.Н., Убийконь В.И..    Лабораторный практикум по программированию. Ч.2: Основы программирования на алгоритмическом языке. - Мн.: БГУИР, 2001.-62 с.

5 Жоголев Е. А. Лекции по технологии программирования. – МГУ.:, 2000  http://sp.cmc.msu.ru/info/3/techprog.htm.

6 Ерёмин Е.А., Шестаков А.П. Примерные ответы на профильные билеты.  2007 http://comp-science.narod.ru/Bilet/bil6.htm

7 Павловская Т.А. C/C++. Программирование на языке высокого уровня: учебник для студентов вузов, обучающихся по направлению "Информатика и вычислительная техника" / Т.А. Павловская - СПб.: Питер, 2005.- 461 с.

8 Культин Н. Б. C/C++ в задачах и примерах. - СПб.: БХВ-Петербург, 2005. - 430 с.

9 Подбельский В.В. Язык СИ++: учебное пособие.  - М.:     Финансы и статистика, 2003. - 560 с.

 

Сводный план 2013г., поз 70