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

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

кафедра «Информационные системы»

 

 

 

ЯЗЫКИ И ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ

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

(для студентов всех форм обучения  специальности

 5B060200 -Информатика)

  

 

Алматы 2012

Составитель: А.Г. Ни. Языки и технология программирования. Методические указания к выполнению лабораторных работ (для студентов всех форм обучения  специальности 5B060200 -Информатика). – Алматы: АИЭС, 2012. – 54 с.

 

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

          Методические указания предназначены для студентов всех форм обучения  специальности 5B060200 –Информатика.

          Ил.5, библиогр. – 6 назв. 

 

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

 

          Печатается по плану издания НАО «Алматинского университета энергетики и связи» на 2012 г.

  

 

© НАО «Алматинский университет энергетики и связи», 2012 г.

Содержание

 

Введение

4

1

Общие указания к выполнению лабораторных работ

6

1.1

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

6

1.2

Требования к оформлению отчета

7

1.3

Требования к защите

7

2

Варианты заданий к лабораторным работам

8

2.1

Лабораторная работа №1. Программирование линейных алгоритмов

8

2.2

Лабораторная работа №2. Программирование разветвляющихся алгоритмов

14

2.3

Лабораторная работа №3. Программирование циклических алгоритмов

20

2.4

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

25

2.5

Лабораторная работа №5. Матрицы и указатели

32

2.6

Лабораторная работа №6. Программирование с использованием функций. Рекурсивная функция

41

2.7

Лабораторная работа №7. Работа со строками и файлами

47

Заключение

52

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

53

Приложение А. Образец титульного листа 

54

 

 

Введение

 

Предлагаемые методические указания к выполнению лабораторных работ по дисциплине “Языки и технология программирования” разработаны в помощь первокурсникам специальности 5B060200 –Информатика для приобретения практических навыков программирования на языке С.

Язык программирования С называют “языком системного программирования”, поскольку на нем удобно писать компиляторы и операционные системы. Однако, он столь же удобен и для написания больших прикладных программ в самых разных областях применения. Язык C предлагает широкий ассортимент типов. Фундаментальные типы включают в себя символьный, а также целый и вещественный (с плавающей точкой) нескольких различных размеров. Кроме того, существует целая иерархия производных типов данных, создаваемых с помощью указателей, массивов, структур и объединений.

В языке С имеются все основные управляющие конструкции, необходимые для написания хорошо структурированной программы: группировка операторов в блоки, принятие решения по условию (if-else), выбор одного из нескольких возможных вариантов (switch), циклы с проверкой условия завершения в начале (while, for) и в конце (do), а также принудительный выход из цикла (break). Язык С  доказал свою высочайшую эффективность и выразительность для самого широкого круга приложений.

Основная цель, которая ставиться студенту при выполнении задания – приобретение навыков построения блок-схем и практического программирования, эффективного использования операторов языка С, а также анализа полученных результатов.

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

Лабораторные работы включают в себя по два задания: А и В, отличающиеся по уровню сложности. При выборе первого задания студент при защите может получить максимальный балл равный 80 %, при защите второго задания – 100 %. К  защите  второго задания студент допускается только при условии защиты  первого задания на максимальный балл. При выполнении лабораторных заданий студент должен также показать умение использовать знания, полученные при изучении дисциплин, входящих в комплекс пререквизитов:

- информатика;

- алгебра;

- геометрия;

            - алгоритмы и структуры данных.

Задания к лабораторным работам разработаны таким образом, чтобы студенты могли бы использовать навыки, полученные при выполнении их, при изучении дисциплин, входящих в комплекс постреквизитов, частности, дисциплины «Объектно-ориентированное программирование».

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

 В настоящей работе также разработаны общие требования к выполнению  и защите лабораторной работы. 

 

1 Общие указания к выполнению лабораторных работ

 

1.1 Методические рекомендации по выполнению лабораторных работ

 

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

Каждая лабораторная работа состоит из 2-х задач и включает следующие виды работ:

- анализ условия задачи и выработка подхода к ее решению;

- пошаговая разработка алгоритма решения и его описание;

- обоснование алгоритма;

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

- выбор и обоснование представления для входных, выходных и промежуточных данных;

- кодирование алгоритма, т. е. его запись на языке Си;

- выбор набора тестов, на которых будет проверяться программа;

- отладка программы и демонстрация правильной ее работы на выбранном наборе тестов.

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

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

Главные соображения, которыми должен руководствоваться студент при выборе представления данных:

1) естественность внешнего представления исходных данных, их привычность для человеческого восприятия. То же самое касается и представления выходных данных. Польза от разработанной программы может быть сведена к минимуму, если для понимания напечатанного ответа от человека требуется дополнительная сложная работа, связанная с переводом данных ответа в понятия исходной формулировки задачи;

2) возможность построения эффективного алгоритма решения задачи.

Рекомендуемый вид экрана во время выполнения программы:

- наименование лабораторной работы;

- тема лабораторной работы;

- номер варианта;

- приглашение к вводу исходных данных;

- ввод исходных данных;

- результаты работы программы;

- группа и ФИО автора программы.

Контрольный пример также должен быть просчитан с помощью Microsoft Excel. Результаты проведенного тестирования должны быть представлены в виде скриншота экрана с результатами решения контрольного примера.  

 

1.2 Требования к оформлению отчета

 

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

а)  №  лабораторной работы, тема;
          б)  цель работы  и условия задания; 
          в)  схема алгоритма решения задачи:

1) математическая модель задачи;

2)  блок схема алгоритма;

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

В Приложении А приведен образец титульного листа. 

 

1.3 Требования к защите

 

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

Каждая лабораторная работа включает в себя два задания А и В, отличающиеся по уровню сложности. При выборе первого задания студент при защите может получить максимальный балл равный 80 %, при защите второго задания – 100 %. К  защите  второго задания студент допускается только при условии защиты  первого задания на максимальный балл.

Для каждой лабораторной работы назначается день защиты согласно силлабусу дисциплины. За каждый просроченный день  отнимается 1 % от общего балла, полученного студентом при  защите лабораторной работы.

2 Варианты заданий к лабораторным работам

 

2.1 Лабораторная работа №1. Программирование линейных алгоритмов

 

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

Общие сведения.

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

Простейшая программа на языке  Си состоит из заголовка и тела основной функции main(). В заголовке указываются библиотечные файлы, содержащие функции, которые используются в программе. Основная часть программы на Си  начинается с оператора void main (), который указывает стартовую точку программы. Структура программы на языке  Си выглядит следующим образом:

# include  <stdio.h>

# include  <math.h>

                   void main()

                   { объявления локальных переменных, констант;

                     выражения;

                     функции;

                    операторы;

                   }

Функция форматированного вывода  printf().

Синтаксис функции:

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

где  <список переменных> - перечень идентификаторов переменных, значения которых необходимо вывести на экран;

      <управляющая строка> - строка, которая представляет собой заключенный в двойные кавычки список спецификаторов: %i – для ввода целых чисел со знаком, %u – для ввода целых беззнаковых целых, %f – для ввода дробных чисел, – для ввода символа, %s – для ввода строки.

Функция форматированного ввода scanf().

Синтаксис:

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

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

<список адресов переменных> – содержит перечисленные через запятую адреса переменных, вводимых функцией. Адрес переменной указывается символом & и далее идет идентификатор переменной, например, адрес переменной stud обозначается символами &stud.

В Си существует 5 базовых типов данных:

char - символьный тип; int - целый тип; float - тип данных с плавающей точкой; double - тип данных с плавающей точкой удвоенной длины; viod - пустой тип, не имеющий никакого значения.

Задание А.

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

Пример.

Задание: вычислить .

Математическая модель.

Разбиваем выражение на ряд более простых, вводя новые переменные

,

,

,

,.

Рисунок 2.1.1 - Блок-схема решения задания

 

Переводим блок-схему на язык С.

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

 

#include <stdio.h>/* подключение библиотечной функции*/

#include <math.h>

void main(void)

{ int x,y; /* объявление целых типов переменных*/

float dop,a,b,c, rezult; /* объявление переменных вещественного типа*/

scanf("%d",&x); /* ввод переменной х*/

scanf("%d",&y); /* ввод переменной у*/

      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("%lf", rezult);

    getch( );  /* задержка экрана до нажатия любой клавиши */

}

 

Доработаем программу, так чтобы она обладала некоторым интерфейсом.:

#include <stdio.h>

#include <math.h>

void main(void)

{

 int x,y;

float dop,a,b,c, rezult;

scanf("%d",&x);

scanf("%d",&y);

    puts(" ЛАБОРАТОРНАЯ РАБОТА N1 - ЛИНЕЙНАЯ ПРОГРАММА ");

    puts("============================================");

      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", rezult);

    printf (“Для завершения нажмите клавишу <Enter>”);

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

}

#include <stdio.h>

#include <math.h>

int main(void)

{

 int x,y;

float dop,a,b,c, rezult,z;

 puts(" ЛАБОРАТОРНАЯ РАБОТА N1 - ЛИНЕЙНАЯ ПРОГРАММА ");

    puts("============================================");

printf ("введите x\nx=");

scanf("%d",&x);

printf ("введите y\ny=");

scanf("%d",&y);

printf ("введите z\nz=");

scanf("%d",&z);

        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", rezult);

        printf (“Для завершения нажмите клавишу <Enter>”);

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

   return 0;

}

 

 

Результат выполнения программы:

 

ЛАБОРАТОРНАЯ РАБОТА N1 - ЛИНЕЙНАЯ ПРОГРАММА ============================================

введите x

x=2

введите y

y=3

введите z

z=1

ОТВЕТ:  rezult =6.849254

 

 

Варианты  задания А.

1. Y=.                 11. Y=.

2. Y= .                                  12. Y=.

3. Y= .                        13. Y=.

4. Y= .                                        14. Y=.

5. Y= .                         15. Y=).

6. Y=.                              16.Y=.

7. Y=  .                          17. Y=.

8. Y= .                     18. .        

9. .                    19..

10. .                    20..

 

Задание Б.

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

 

Варианты  задания Б.

1. Студент начал решать задачи данного урока программирования, когда электронные часы показывали h1 часов и min1 минут, а закончил, когда было h2 часов и min2 минут. Составьте программу, позволяющую определить, сколько времени студент решал эти задачи. (Будем считать, что задачи решались не дольше суток.)

2. Дано действительное число а. Не пользуясь никакими другими операциями, кроме умножения, получить: а) а4 за две операции; б) а6 за три операции; в) а7 за четыре операции;

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

4. Даны два числа. Найти среднее арифметическое их квадратов и среднее арифметическое их модулей. 

5. Скорость лодки в стоячей воде V км/ч, скорость течения реки U км/ч (U < V). Время движения лодки по озеру T1 ч, а по реке (против течения) — T2 ч. Определить путь S, пройденный лодкой. 

6. Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили удаляются друг от друга. 

7. Скорость первого автомобиля V1 км/ч, второго — V2 км/ч, расстояние между ними S км. Определить расстояние между ними через T часов, если автомобили первоначально движутся навстречу друг другу. 

8. Найти периметр и площадь прямоугольного треугольника, если даны длины его катетов a и b. 

9. Дана длина ребра куба. Найти площадь грани, площадь полной поверхности и объем этого куба. 

10. Найти длину окружности и площадь круга заданного радиуса R. В качестве значения Pi использовать 3.14.

 11. Найти площадь кольца, внутренний радиус которого равен R1, а внешний радиус равен R2 (R1 < R2). В качестве значения Pi использовать 3.14. 

12. Дана сторона равностороннего треугольника. Найти площадь этого треугольника и радиусы вписанной и описанной окружностей. 

13. Дана длина окружности. Найти площадь круга, ограниченного этой окружностью. В качестве значения Pi использовать 3.14. 

14. Дана площадь круга. Найти длину окружности, ограничивающей этот круг. В качестве значения Pi использовать 3.14. 

15. Найти периметр и площадь равнобедренной трапеции с основаниями a и b (a > b) и углом alpha при большем основании (угол дан в радианах). 

16. Найти периметр и площадь прямоугольной трапеции с основаниями a и b (a > b) и острым углом alpha (угол дан в радианах).

 17. Найти расстояние между двумя точками с заданными координатами (x1, y1) и (x2, y2).

18. Дана длина ребра куба. Найти объем куба и площадь его боковой поверхности.

19. Три сопротивления R1, R2, R3 соединены параллельно. Найти сопротивление соединения.

20. Дано действительное число а. Не пользуясь никакими другими операциями, кроме умножения, получить: а) а10 за четыре операции;; б) а13 за пять операций; в) а64 за шесть операций.

 

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

1) Каковы назначение и возможности системы С?

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

3) Как записываются операторы начала и конца программы?

4) Из каких разделов состоит программа на языке С?

5) В какой последовательности должны быть записаны разделы программы на языке С?

6) Как записываются операторы вывода на экран в С?

7) Каково назначение <управляющая строка>?

8) Перечислите базовые типы данных

 

2.2 Лабораторная работа №2 Программирование разветвляющихся алгоритмов

 

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

Общие сведения.

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

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

1) с использованием операторов перехода;

2) условного оператора;

3) оператора выбора.

Оператор перехода GOTO.

Оператор перехода имеет вид

           GOTO <метка>;

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

Условный оператор.

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

а) полная форма

         if (условие) оператор 1

              else оператор 2

б) сокращённая форма

         if (условие) оператор 1

где оператор 1, оператор 2 – любые операторы, включая условия и составные;  условие – в общем случае логическое выражение.

Если условие истинно, выполняется оператор 1, если ложно, то выполняется оператор 2.

Оператор выбора SWITCH CASE.

Оператор служит для выбора одного из помеченных вариантов действия (операторов), в зависимости от значения "параметра".

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

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

{

case константа 1:

        оператор 1;

        break;

…………………………    

case константа N:

        оператор Nbreak;

        default: оператор

}

где выражение – целочисленная переменная или соотношение;

       константаN: - метка в виде константы или константного выражения;

      default – метка на оператор, которая выполняется в том случае, если выражение не совпадает ни с одной константной меткой;         

       break  - оператор выхода из переключателя.

Задание А

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

Пример

Задание: Составить программу вычисляющую:

На рисунке 2.2.1 приведена блок-схема решения задания   

 

Рисунок 2.2.1 -Блок-схема решения задания

 

Переводим блок-схему на язык С

 

#include<stdio.h>

#include<conio.h>

#include<math.h>

void main()

{ int S,n;

float K;

printf("\n Введите данные");

printf("\n S=");

scanf("%d",&S);

printf("\n n=");

scanf("%d",&n);

if (fabs(n)<S && S<2*fabs(n))

K=sqrt(fabs(S*exp(2)-n*exp(-2))); else

if (S>=2*fabs(n))

K=sqrt(fabs(S*n)); else

printf("\n Нет решенния");

printf("\n Результат K=%f",K);

getch();

}

Результат выполнения программы.

 

Введите данные

S=7

n=1

Результат K=2.645751.

 

 

Варианты  задания А.

 

        

 

          

                         6.

 

7.           8.

 

 9.       10.

 

11.

 

 

12.13.  

 

14.15.         

 

16.   17.      

18.  19.     20.

 

Задание Б

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

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

1. Даны действительные положительные числа x, y, z. Выяснить, существует ли треугольник с длинами сторон x, y, z.

2. Даны действительные числа x, y. Если x, y отрицательны, то каждое значение заменить его модулем; если отрицательное только одно из них, то оба значения увеличить на 0.5; если оба значения не отрицательны и ни одно из них не принадлежит отрезку [0.5, 2.0], то оба значения уменьшить в 10 раз; в остальных случаях x, y оставить без изменения.

3. Определить и вывести на печать номер квадранта, в котором расположена точка М(x,y), x и y заданные вещественные числа.

4. Из величин, определяемых выражениями a=sinx, b=cosx, c=ln|x| при заданном х, определить и вывести на экран дисплея минимальное значение.

5. Напишите программу, которая определяет сумму двух чисел, если сумма больше 100, то полученный результат умножается на 2, если условие не выполняется, то результат умножается на 3.

6. Определить, какая из двух точек - M1(x1,y1) или M2(x2,y2) - расположена ближе к началу координат. Вывести на экран дисплея координаты этой точки.

7. Напишите программу, которая определяет минимальное число из введенной с клавиатуры последовательности отрицательных чисел.

8. Даны действительные числа a, b, c, x, y. Выяснить, пройдет ли кирпич с ребрами a,b,c в прямоугольное отверстие со сторонами x и y. Просовывать кирпич в отверстие разрешается только так, чтобы каждое из его ребер было параллельно или перпендикулярно каждой из сторон отверстия.

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

10. Напишите программу, которая определяет «нуль» и считает его количество из ряда введенных чисел.

11. Напишите программу, определяющую период суток. Если до 1200 – «утро», до 1800 – «день»,  до 000 – «вечер», до 600 – «ночь», с выдачей соответствующих запросов и сообщений.

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

13. Скорость передачи информации по сети изменяется в диапазоне от 14 кбит/сек до 58 кбит/сек. Напишите программу, определяющую наибольшую разницу  между средним значением скорости передачи и текущим значением,  с выдачей соответствующих запросов и сообщений.

14. Сможет ли шар радиуса R пройти в ромбообразное отверстие со стороной P и острым углом Q?

15. Написать программу, которая печатает True или False в зависимости от того, выполняются или нет заданные условия:

-  квадрат заданного трехзначного числа равен кубу суммы цифр этого числа;

-  среди цифр заданного трехзначного числа есть одинаковые.

16. Написать программу, которая бы запрашивала целое число и распечатывала любое его значение, кроме13. Если заданное число равно13, вместо него печатается число 77.

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

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

19. Определить, попадает ли точка M(x,y) в круг радиусом r с центром в точке (x0,y0).

20. Проверить, можно ли из четырех данных отрезков составить параллелограмм. Написать программу, определяющую попадает ли точка с координатами (x, y) в заштрихованную область.

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

1) Какие виды условного оператора вы знаете?

2) Как выполняются оператор выбора?

3)Какие операторы используются для программирования разветвлений?

4) Как выполняются операторы перехода?

5) Как записывается полная форма оператора перехода?

6) Как записывается сокращённая форма оператора перехода?

7) Для чего используется оператор break?

8) Для чего используется метка default?

2.3 Лабораторная работа №3 Программирование циклических алгоритмов

 

Цель работы: научиться разрабатывать  блок-схемы  и составлять программы. реализующих циклические алгоритмы, изучить циклические операторы for, while, do – while.

Общие сведения.

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

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

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

Циклы бывают:

1) c предусловием;

2) c постусловием;

3) с параметрами.

Операторы циклов  в языке С.

Оператор цикла  с предусловием:

while(условие)
                         {

     //операторы тела цикла

  }

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

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

do
{

     // операторы тела цикла

}while(условие);

Здесь тоже можно не писать операторные скобки,  если в цикле один оператор. Сначала выполняются операторы тела цикла,  потом проверяется логическое условие, и если оно ложно, то операторы цикла будут выполняться повторно, а если истинно, то будут выполняться операторы после цикла.

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

for(начало цикла; условие конца цикла; изменение шага цикла)

{

     //операторы тела цикла}

Циклы с параметром работают следующим образом: пока управляющая переменная (счетчик цикла - j) меньше(больше) какого-то значения n, то выполняются операторы цикла, при этом с каждым витком цикла управляющая переменная меняет свое значение на какое-то определенное число, называемое шагом цикла.

Вложенные циклы.

Цикл, как и все обычные операторы, может быть внутри другого цикла, и в этом случае пока не выполнятся внутренние (вложенные) операторы, внешние выполняться не будут.

Операторы управления циклом.

Оператор break.  Как только компилятор встречает оператор break, он сразу же заканчивает выполнения циклов не зависимо от количества оставшихся операторов и витков цикла, и начинает выполнять операторы, которые стоят сразу после цикла.

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

Пример

Задание: Составить программу вычисляющую:

.

На рисунке 2.3.1 приведена блок-схема решения задания   

Рисунок 2.3.1 -Блок-схема решения задания

 

Переводим блок-схему на язык С.

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

 

#include <stdio.h>

#include <math.h>

int main()

{int n, x, f, i;

float S;

printf ("\n Введите значение  n\n n=");

scanf ("%d", &n);

printf ("\n Введите значение  x\n x=");

scanf ("%d", &x);

S=0;

f=1;

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

{f=f*i;

S=S+(cos(i*x)/f);}

printf ("\n Сумма S=%f", S);

getch();

return 0;

}

Результат выполнения программы.

 

Введите значение  n

 n=4

Введите значение  x

 x=1

Сумма S=0.139995

 

Варианты  задания А.

 

Составить блок-схему и программу вычисления суммы

       1.   .                                          11.  .    

         

2. .                                    12. .

 

3.  .                                       13.   .

          

4.  .                                         14..    

                 5.  .                              15. .

 

6.   .                                  16. .

 

7.  .                                   17.  .     

                                                          

8.   .                                          18. .

 

9.   .                                             19..

 

 10. .                                                     20. .

 

Задание Б.

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

 

Варианты  задания Б.

1. Сколько можно купить быков, коров, телят, платя за быка 10 рублей, за корову 5 рублей, а за теленка 0,5 рублей, если на 100 рублей надо купить 100 голов скота. [Ответ: коров-9, бык-1,телят-90]

2. В компьютер вводятся по очереди координаты N точек. Определить, сколько из них попадет в круг радиусом R с центром в точке (а,в).

3. У гусей и кроликов вместе 24 лапы. Сколько может быть кроликов и гусей (указать все сочетания)

4. В компьютер вводятся по очереди данные о росте N учащихся группы. Определить средний рост учащихся группы

5. Одноклеточная амеба каждые три часа делится на 2 клетки. Определить, сколько амеб будет через 3,6,9,12,…,24 часа. [Ответ: 256]

6. Составьте программу вычисления степени числа А с натуральным показателем N . (Записать варианты программы с 3 видами циклов: for, while, dowhile)

7. Написать программу, которая вводит и суммирует любое количество целочисленных значений. Если введено число 999, то на экран выводится результат суммирования.

8. С помощью оператора WHILE написать программу, которая ищет произведение 10 произвольно введенных чисел и выводит его на печать.

9. Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый день он увеличивал норму на 10% нормы предыдущего дня. Какой суммарный путь пробежит спортсмен за 7 дней?

10. С помощью оператора WHILE напишите программу вывода всех четных чисел в диапазоне от 22 до 100 включительно.

11. Составить программу для вычисления значений функции F(x) на отрезке [a,b] с шагом h. Результат представить в виде таблицы, первый столбец которой- значения аргумента, второй- соотв. значение функции. F(x)=cosx+ctgx

12. С помощью оператора WHILE напишите программу, вычисляющую сумму квадратов чисел от 1 до введенного вами целого числа.

13. Напишите программу определения суммы всех нечетных чисел, кратных 3 в диапазоне от 1 до 99 включительно.

14. Составить программу поиска четырехзначных чисел, которые при делении на 133 дают в остатке 125, а при делении на 134 дают в остатке 111.

15. С помощью оператора цикла с постусловием напишите программу-фильтр, которая вводит любые символы, но комментирует только буквы русского алфавита. Завершение работы - по нажатию буквы ‘Я’.

16. Найти все двузначные числа, сумма цифр которых не меняется при умножении числа на 2,3,4,5,6,7,8,9.

17. Найти все трехзначные числа, сумма цифр которых равна данному целому числу.

18. Найти все трехзначные числа, средняя цифра которых равна сумме первой и второй цифр.

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

20. Найти все двузначные числа, сумма квадратов цифр которых делится на 17.

 

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

1) Как записывается и как работает оператор FOR?

2) Для организации каких циклов применим оператор FOR?

3) В чем отличие оператора WHILE от оператора  DO WHILE?                                                                  

4) Как программируются циклические алгоритмы с явно заданным числом повторений цикла?

5) Как программируются циклические алгоритмы с заранее неизвестным числом повторений цикла?

6) Напишите оператор цикла, который не выполняется ни разу.

7) В каких случаях используются операторные скобки?

8) Как работают операторы управления циклом?

 

 

 

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

 

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

Общие сведения.

Массивы - это последовательная группа ячеек памяти, имеющих одинаковое имя. Доступ к отдельным элементам массивов организуется посредством указания имени массива и порядкового номера (индекса) необходимого элемента. Индекс определяет положение элемента относительно начала массива.

При описании массива необходимо указать:

1) тип элементов;

2) имя массива;

3) размерность массива.

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

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

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

float   A[5],   B[25];

При описании можно инициализировать элементы массива заданными значениями.

   Например:

int   D[5]={23, 45, 32, 12, 88};

В языке Си элементы в массиве нумеруются, начиная с нуля, т.е. индекс первого элемента равен 0, а индекс последнего элемента – на единицу меньше размера массива.

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

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

Указатель объявляется следующим образом:

                            тип *<имя переменной>;

Указатели объявляются в списке переменных, но перед их именем ставится знак *. Указатель всегда  указывает на переменную того типа, для которого он был объявлен.

Унарная операция &, примененная к некоторой переменной, показывает, что нам нужен адрес этой переменной, а не ее текущее значение. Если переменная uk объявлена как указатель, то оператор присваивания uk=&x означает: "взять адрес переменной x и присвоить его значение переменной-указателю uk".

Унарная операция *. примененная к указателю, обеспечивает доступ к содержимому ячейки памяти, на которую ссылается указатель. Например, *uk можно описать словами как "то, что содержится по адресу, на который указывает uk".

Доступ к любому элементу массива может быть выполнен с помощью указателей. Если uk -указатель на целое, описанный как int *uk, то uk после выполнения операции uk=&a[0] содержит адрес a[0], а uk+i  указывает на i -й элемент массива. Таким образом, uk+i является адресом a[i]. Так как имя массива в программе отождествляется с адресом его первого элемента, то выражение uk=&a[0] эквивалентно такому: uk=a. Поэтому значение a[i] можно записать как *(a+i). Применив к этим двум элементам операцию взятия адреса, получим, что &a[i] и a+i идентичны.

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

#include <stdio.h>
main()
{
char *uk1,*uk2;
uk1=uk2="ЯЗЫКИ И ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ";
while(*uk2!='\0')
  putchar(*uk2++);
putchar('\n');
while(--uk2 >= uk1)
putchar(*uk2);
putchar('\n');
}

В самом начале указателям uk1 и uk2 присваивается начальный адрес строки "ЯЗЫКИ И ТЕХНОЛОГИЯ ПРОГРАММИРОВАНИЯ". Затем строка посимвольно печатается и одновременно указатель uk2 смещается вдоль строки. В конце вывода uk2 указывает на последний символ исходной строки. Во втором цикле while все тот же указатель uk2 начинает изменяться в обратном направлении, уменьшаясь до тех пор, пока он не будет указывать на нулевой элемент массива, обеспечивая выдачу строки в обратном порядке.

 

Задание А.

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

Пример. Дан массив А[n].Заполнить массив B[n] элементами массива А[n] , начиная с последнего и осуществить циклический сдвиг вправо на К позиций, где К-число положительных элементов.       

На рисунке 2.4.1 приведена блок-схема решения задания   

 

Рисунок 2.4.1 -Блок-схема решения задания

Программа может иметь следующий вид:

#include <stdlib.h>

# include <conio.h>

# include <stdio.h>

#define n 10

int main ()

{  int buf,j,pol,i,b[n], a[n];

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

         a[i]=rand()%10-5;pol=0;

   printf ("\n \n Сгенерированный массив a[n] \n");

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

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

  j=n-1;

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

    {b[j]=a[i];      j=j-1;

       if (a[i]>=0)pol++;}

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

printf ("\n \n вывод массива b[n] \n");

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

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

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

   { buf=b[n-1];

      for(j=n-1;j>0;j--)

      b[j]=b[j-1];      b[0]=buf;    }

    printf ("\n \n Сдвиг элементов массива b[n] на %d позиций \n", pol);

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

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

    printf ("\n");

  system("PAUSE");       

  return 0;}

 

Результат выполнения программы:

 

Сгенерированный массив a[n]

1  2  3 -4 -5 -1 -2 -3 -7 9

Число положительных элементов

 pol=4

вывод массива b[n]

9 -7 -3 -2 -1 -5 -4 3 2 1

Сдвиг элементов массива b[n] на 4 позиций

-4 3 2 1 9 -7 -3 -2 -1 -5

 

Варианты  задания АПри выполнении задания элементы массива генерировать с помощью генератора случайных чисел.

1. Дан массив A[N]. Заполнить массив В[N] элементами массива A[N] следующим образом: вначале заполнить  элементами с четными индексами, а затем — с нечетными. Осуществить циклический сдвиг вправо на k позиций, где k – число положительных элементов

2. Дан массив A[N]. Заполнить массив В[N] элементами массива A[N] следующим образом: вначале заполнить  элементами с |нечетными индексами, а затем —с четными. Осуществить циклический сдвиг вправо на k позиций, где k – число отрицательных элементов

3. Дан массив A[N]. Заполнить массив В[N] элементами массива A[N], которые удовлетворяют двойному неравенству: A[1] < A[i] < A[10]. Незаполненные элементы массива В[N] заполнить оставшимися элементами массива A[N]. Осуществить циклический сдвиг влево на k позиций, где k – число оставшихся элементов массива A[N].

4. Дан массив A[N]. Заполнить массив В[N] элементами массива A[N], которые удовлетворяют двойному неравенству: A[1] < A[i] или A[i]  < A[10]. Незаполненные элементы массива В[N] заполнить оставшимися элементами массива A[N]. Осуществить циклический сдвиг вправо на k позиций, где k – число оставшихся элементов массива A[N].

5. Дан целочисленный массив размера N. Преобразовать его, прибавив к четным числам первый элемент. Первый элементы массива не изменять. Осуществить циклический сдвиг вправо на k позиций, где k – число четных элементов

6. Дан целочисленный массив размера N. Преобразовать его, прибавив к нечетным числам первый элемент. Первый элемент массива не изменять. Осуществить циклический сдвиг вправо на k позиций, где k – число четных элементов

7. Дан целочисленный массив размера N. Преобразовать его, прибавив к четным числам последний  элемент. Последний элемент массива не изменять. Осуществить циклический сдвиг влево на k позиций, где k – число нечетных элементов

9. Дан целочисленный массив размера N. Преобразовать его, прибавив к четным числам первый  элемент. Первый элемент массива не изменять. Осуществить циклический сдвиг вправо на k позиций, где k – число нечетных элементов

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

11. Дан массив A[N]. Все положительные  элементы уменьшить на значение  минимального элемента. Осуществить циклический сдвиг вправо на k позиций, где k – число положительных элементов

12. Дан массив A[N]. Все отрицательные элементы увеличить на значение максимального элемента. Осуществить циклический сдвиг влево на k позиций, где k – число отрицательных элементов

13. Дан массив размера 10. Переставить в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами. Осуществить циклический сдвиг элементов массива влево на k позиций, где k – число элементов, расположенных между его минимальным и максимальным элементами

14. Дан массив размера N. Осуществить циклический сдвиг элементов массива влево на k позиций, где k – индекс минимального элемента. 

15. Дан массив размера N. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k – индекс максимального элемента. 

16. Дан массив A[N]. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k – целая часть среднего арифметического значения положительных элементов массива A[N].

17. Дан массив A[N]. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k – целая часть среднего арифметического значения отрицательных элементов массива A[N].

18. Дан массив A[N]. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k – целая часть среднего арифметического значения четных элементов массива A[N].

19. Дан массив A[N]. Осуществить циклический сдвиг элементов массива вправо на k позиций, где k – целая часть среднего арифметического значения нечетных элементов массива A[N].

20. Дан массив A[N]. Все отрицательные  элементы уменьшить на значение  минимального элемента. Осуществить циклический сдвиг вправо на k позиций, где k – число положительных элементов

 

Задание Б

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

 

Пример Дан массив А[n].Заполнить массив B[n] элементами массива А[n] , начиная с последнего и осуществить циклический сдвиг вправо на К позиций, где К-число положительных элементов.

 

#include <stdlib.h>

# include <conio.h>

# include <stdio.h>

#define n 10

int main ()

{  int buf,j,pol,i,b[n], *pa,*pb,*p, a[n];

 for (i = 0; i < n; i++)    a[i]=rand()%10-5;

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

pb=&b[9];

   printf ("\n \n Сгенерированный массив a[n] a[n] \n");

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

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

  pa=&a[0];

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

    {*pb=*pa;

     if (*pa>=0)pol++;

       --pb;

       ++pa;    }

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

printf ("\n \n вывод массива b[n] \n");

 pb=&b[0];

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

      printf ("%d ",*pb++);

     pb=&b[9];

     p=&b[0];

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

   { buf=*pb;

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

      *pb=*(--pb);

        *p=buf;     

       p=&b[0];

       pb=&b[9];      }

    printf ("\n \n Сдвиг элементов массива b[n] на %d позиций \n", pol);

    pb=&b[0];

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

     printf ("%d ",*pb++);

    printf ("\n");

  system("PAUSE");       

  return 0;

}

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

Варианты задания Б соответствуют вариантам  задания А данной лабораторной работы.

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

1) Каким образом определяются переменные типа массив?

2) Какие операторы языка Си  используются при обработке элементов массива?

3) Как осуществляется доступ к отдельному элементу одномерного массива с помощью указателя?

4) Каким образом выводятся элементы массива на экран?  

5) Какой результат унарной операции &?

6) Какой результат унарной операции *?

7) Выражение uk=&a[0] эквивалентно  uk=a?

8) Выражения &a[i] и a+i идентичны?

2.5 Лабораторная работа №5. Матрицы и указатели

 

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

Общие сведения.

Основные сведения, касающихся  описании массива и указателей даны в лабораторная работа №4. В языке СИ определены только одномерные массивы, но поскольку элементом массива может быть массив, можно определить и многомерные массивы, простейшей формой  которых является двумерный массив. Двумерные массивы называют также матрицами. При описании массива первый размер  определяет количество строк, а второй - количество столбцов. Двумерный массив int a[2][4]

а[0][0] a[0][l] a[0][2] a[0][3]

а[1][0] a[1][l] a[1][2] a[1][3]

Первый индекс - номер строки, второй индекс - номер столбца.

Рассмотрим пример программы, которая заполняет элементы матрицы случайными числами a[n][n] и осуществляет вывод данных в виде матрицы.

#include<stdio.h>

#include<stdlib.h>

#define n 10

void main()

{  int a[n][n],i,j,k,*pa,s1;

    pa=&a[0][0];

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

   {for(j=0;j<n;j++)

      {*pa=rand()%9; 

         printf("%d  ",*pa);  

         pa++;

      }   printf("\n");

   

  getch();

}

Задание А.

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

 

Пример задания А.      Дана целочисленная матрица размером 8 на 8. Найти:

1)     такие k, что k-я строка  матрицы совпадает с k-м столбцом;

2)     сумму элементов в тех строках, которые  содержат хотя бы один отрицательный элемент.

           

На рисунке 2.5.1 приведена блок-схема решения задания   

 

 

Рисунок 2.5.1 -Блок-схема решения задания

Программа может иметь следующий вид:

 

#include <stdio.h>

#include <stdlib.h>

#define m 8

#define n 8

int main()

{  int     matrix[n][m];    /* Объявляем матрицу nхm */

   int     i, j, p;  /* Счетчик и признак совпадения */ 

int  p1, iSumm; /* признак нахождение отрицательного элемента и переменная для    хранения суммы */

/* генератором случайных чисел заполняем матрицу */

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

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

      matrix[i][j]=rand()%10-1;

printf("\n   Сгенерированная матрица имеет вид:\n ");

 /* вывод матрицы */

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

   { for (j = 0; j < n; j++)

      printf(“%d  “,matrix[i][j]);

      printf("\n ");

    }

        printf("\n \t\t\tРЕЗУЛЬТАТ ПЕРВОЙ ЧАСТИ ЗАДАНИЯ");

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

      { p=1; 

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

       {         /* Сравниваем элемент i-й строки j-го столбца с элементом j-й строки i-го столбца. В случае их несоответствия присваиваем p значение нуль и прерываем цикл по j конструкцией break */

            if (matrix [i][j] != matrix [j][i])

            { p=0; 

                break;

            }

        }

    /* В случае p=1 выводим на экран  номер соответствующей строки */

        if (p==1) printf("\n k = %d ", i);

    }

if (p==0) printf("\n нет одинаковых строк и столбцов ");

printf("\n \t\t\tРЕЗУЛЬТАТ ВТОРОЙ ЧАСТИ ЗАДАНИЯ");

    printf("\n\n");

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

    {

        /* Присваеваем переменным исходные значения */

        iSumm = 0;

        p1=0;

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

        {   /* Суммируем значения элементов i-й строки */

                iSumm += matrix [i][j];

/* При нахождение хотя бы одного отрицательного элемента присваиваем p1=1, обозначающее необходимость вывода Суммы на экран */

           if (matrix [i][j] < 0) p1=1;             

        }

        /* В случае нахождения в строке хотя бы одного отрицательного элемента выводим на экран сумму элементов i-й строки */

    if (p1==1) printf("Сумма элементов строки  #%d = %d\n", i+1, iSumm);

    }

system("PAUSE");/* задержка экрана*/     

      return 0;

}

 

Результат выполнения программы:

 

Сгенерированная матрица имеет вид

2 7 2 7 1 4 0 3

1 0 7 6 0 -8 3 5

2 7 1 8 1 4 9 3

9 2 8 5 2 0 0 6

7 1 1 3 9 3 9 1

8 2 4 9 1 -6 4 9

0 3 9 0 9 4 8 8

1 8 3 2 8 2 8 0

 

                   РЕЗУЛЬТАТ ПЕРВОЙ ЧАСТИ ЗАДАНИЯ

Совпавшие строки и столбцы

k = 2

k = 6

                       

                   РЕЗУЛЬТАТ ВТОРОЙ ЧАСТИ ЗАДАНИЯ

Сумма элементов строки #1 = 14

Сумма элементов строки #5 = 31

 

Варианты  задания А.

1) Дана целочисленная прямоугольная матрица. Определить:

а) количество строк, не содержащих ни одного нулевого элемента;

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

 2) Дана целочисленная прямоугольная матрица.

а) Определить количество столбцов, не содержащих ни одного нулевого элемента.

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

 3) Дана целочисленная прямоугольная матрица. Определить:

 а) количество столбцов, содержащих хотя бы один нулевой элемент;

б) номер строки, в которой находится самая длинная серия одинаковых элементов.

4) Дана целочисленная квадратная матрица. Определить:

а) произведение элементов в тех строках, которые не содержат отрицательных элементов;

б) максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.

5) Дана целочисленная квадратная матрица. Определить:

а) сумму элементов в тех столбцах, которые не содержат отрицательных элементов;

б) минимум среди сумм модулей элементов диагоналей, параллельных побочной диагонали матрицы.

6) Дана целочисленная прямоугольная матрица. Определить:

а) сумму элементов в тех строках, которые содержат хотя бы один отрицательный элемент;

б) номера строк и столбцов всех седловых точек матрицы.

ПРИМЕЧАНИЕ:матрица А имеет седловую точку Аij, если Aij является минимальным элементом в i-й строке и максимальным в j-м столбце.

 7) Для заданной матрицы размером 8 на 8:

а) найти такие k, что k-я строка матрицы совпадает с k-м столбцом;

б) найти сумму элементов в тех строках, которые содержат хотя бы один отрица­тельный элемент.

 8) Характеристикой столбца целочисленной матрицы назовем сумму модулей его отрицательных нечетных элементов:

а) переставляя столбцы заданной матрицы, расположить их в соответствии с ростом характеристик;

б) найти сумму элементов в тех столбцах, которые содержат хотя бы один отрица­тельный элемент.

9) Соседями элемента Аij в матрице назовем элементы Аi-1,j-1. Аi-1,j, Аi-1,j+1, Аi,j-1, Аi,j+1, Аi+1,j-1. Аi+1,j, Аi+1,j+1Операция сглаживания матрицы дает новую матрицу того же разме­ра, каждый элемент которой получается как среднее арифметическое имеющих­ся соседей соответствующего элемента исходной матрицы.

а) Построить результат сглаживания заданной вещественной матрицы размером 10 на 10 .

б) В сглаженной матрице найти сумму модулей элементов, расположенных ниже главной диагонали.

 10) Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей.

а) подсчитать количество локальных минимумов заданной матрицы размером 10 на 10;

б) найти сумму модулей элементов, расположенных выше главной диагонали.

 11) Коэффициенты системы линейных уравнений заданы в виде прямоугольной матрицы.

а) с помощью допустимых преобразований привести систему к треугольному виду;

б) найти количество строк, среднее арифметическое элементов которых меньше заданной величины.

 12) Дана действительная квадратная матрица порядка n.

а) уплотнить заданную матрицу, удаляя из нее строки и столбцы, заполненные нулями;

б) найти номер первой из строк, содержащих хотя бы один положительный элемент.

 13) Дана действительная квадратная матрица порядка n.

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

б) найти номер последней из строк, содержащих хотя бы один ненулевой элемент.

14) Дана действительная квадратная матрица порядка n.

а) осуществить циклический сдвиг элементов квадратной матрицы размерности МхN вправо на k элементов таким образом: элементы 1-й строки сдвигаются в последний столбец сверху вниз, из него - в последнюю строку справа налево, из нее - в первый столбец снизу вверх, из него - в первую строку; для остальных элементов - аналогично;

б) найти сумму положительных элементов нечетных строк.

15) Дана целочисленная прямоугольная матрица.

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

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

16) Дана целочисленная прямоугольная матрица.

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

б) найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.

17) Дана квадратная вещественная матрица.

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

б) найти номер первой из строк, не содержащих ни одного положительного элемента.

18) Дана целочисленная прямоугольная матрица. Определить:

а) количество строк, содержащих хотя бы один нулевой элемент;

б) номер столбца, в которой находится самая длинная серия одинаковых элементов.

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

а) сумму элементов в тех строках, которые не содержат отрицательных элементов;

 б) минимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.

20) Дана целочисленная прямоугольная матрица. Определить:

а)       количество отрицательных элементов в тех строках, которые содержат хотя бы один нулевой элемент;

б)      номера строк и столбцов всех седловых точек матрицы.

         ПРИМЕЧАНИЕ: матрица A имеет седловую точку Aij если Аij  является минимальным элементом в i-й строке и максимальным в j-м столбце.

 

Задание Б.

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

 

Пример. Дана целочисленная матрица размером 8 на 8. Найти:

а) такие k, что k-я строка  матрицы совпадает с k-м столбцом;

б) сумму элементов в тех строках, которые  содержат хотя бы один отрицательный элемент.

 

Пример решения задачи:

#include <stdio.h>

#include <stdlib.h>

#define m 8

#define n 8

void main()

{  int     matrix[n][m];    /* Объявляем матрицу nхm */

   int     i, j, p;  /* Счетчик и признак совпадения */  

    int *mat; /* Объявляем указатель на матрицу matrix[n][m] */

mat=&matrix[0][0]; /* указателю mat присваиваем адрес нулевого элемента матрицы matrix[n][m] */

/* генератором случайных чисел заполняем матрицу */

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

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

      {*mat=rand()%10-1;

         mat++;

      }

mat-= n*m; /* указателю mat присваиваем первоначальный адрес */

printf("\n   Сгенерированная матрица имеет вид:\n ");

 /* вывод матрицы */

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

   { for (j = 0; j < n; j++)

         {printf(“%d  “,*mat);        

          mat++;

          }

      printf("\n ");

     }   

mat-= n*m;

printf("\n \t\t\tРЕЗУЛЬТАТ ПЕРВОЙ ЧАСТИ ЗАДАНИЯ");

printf("\n Совпавшие строки и столбцы ");

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

      { p=1; 

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

       {         /* Сравниваем элемент i-й строки j-го столбца с элементом j-й строки i-го столбца. В случае их несоответствия присваиваем p значение нуль и прерываем цикл по j конструкцией break */

            if (*(mat+i * m + j) != *(mat+j * m + i))

             { p=0; 

                break;

              }

         }

    /* В случае p=1 выводим на экран  номер соответствующей строки */

        if (p==1) printf("\n k = %d ", i);

     }

if (p==0) printf("\n нет одинаковых строк и столбцов ");

printf("\n \t\t\tРЕЗУЛЬТАТ ВТОРОЙ ЧАСТИ ЗАДАНИЯ");

mat=&matrix[0][0];

int  p1, iSumm;  /* признак нахождение отрицательного элемента и переменная для    хранения суммы */

    printf("\n\n");

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

    {

        /* Присваеваем переменным исходные значения */

        iSumm = 0;

        p1=0;

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

        {     /* Суммируем значения элементов i-й строки */

            iSumm += *mat;

/* При нахождение хотя бы одного отрицательного элемента присваиваем p1=1, обозначающее необходимость вывода Суммы на экран */

        if (*mat < 0) p1=1;   mat++;          

        }

        /* В случае нахождения в строке хотя бы одного отрицательного элемента выводим на экран сумму элементов i-й строки */

    if (p1==1) printf("Сумма элементов строки  #%d = %d\n", i+1, iSumm);

    }

system("PAUSE");/* задержка экрана*/     

      return 0;

}

 

Результат выполнения программы.

Результат решения имеет тот же вид, что и в задании А.

 

Варианты  задания Б. Варианты задания Б соответствуют вариантам  задания А данной лабораторной работы.

 

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

1) Каким образом определяются переменные типа массив?

2) Какие операторы языка Си  используются при обработке элементов массива?

3) Как осуществляется доступ к отдельному элементу матрицы с помощью указателя?

4) Каким образом выводятся элементы матрицы на экран?  

5) Какой результат унарной операции &?

6) Какой результат унарной операции *?

7) Выражение uk=&a[0][0]  эквивалентно  uk=a?

8) Выражения &a[i][j и a+i+j идентичны?

 

2.6 Лабораторная работа №6. Программирование с использованием функций. Рекурсивная функция

 

Цель работы: познакомиться с понятиями "функция", «рекурсивная функция» в языке программирования С, закрепить практические навыки программирования на примере реализации алгоритмов при помощи  функций, рекурсивных функций, научиться применять метод последовательной детализации в практическом программировании, применять функции при решении задач. 

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

Общие сведения.

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

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

Все функции распадаются на две большие категории: те, что программисты сами пишут и те, которые уже имеются в пакете компилятора С.  Первые называются функциями, определенными пользователем; вторые – библиотечными функциями.  Функциями удобно пользоваться, например, если необходимо обработать один и тот же код программы или когда большая задача, которую можно расчленить на конкретные маленькие или элементарные, простейшие задачи, которые часто возникают во многих реальных задачах.

Для объявления функции используется следующий синтаксис:

<тип> <имя функции> ([список параметров]) { <тело функции> }

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

Пример задания функции.

double square(double x)

{x = x*x;

return x;

}

int main()

{ double sq1, sq2, arg = 5;

   sq1=square(arg);

  sq2=square(3);

return 0;

}

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

Следует отметить, что работа функции завершается при вызове оператора return. Даже если после этого оператора будут находиться другие операторы, то они выполняться не будут.

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

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

#include <stdio.h>

void up_and_down(int );

int main(void)

{up_and_down(1);

return 0;

}

void up_and_down(int n)

{printf(“Уровень вниз %d  ”,n);

  if(n < 4) up_and_down(n+1);

  printf(“\n”);

  printf(“Уровень вверх %d\n”,n);

}

Результатом работы этой программы будет вывод на экран следующих

строк:

Уровень вниз 1 Уровень вниз 2 Уровень вниз 3 Уровень вниз 4

Уровень вверх 4 Уровень вверх 3 Уровень вверх 2 Уровень вверх 1

Полученный результат работы программы объясняется следующим образом. Вначале функция main() вызывает функцию up_and_down() с аргументом 1. В результате аргумент n данной функции принимает значение 1 и функция printf() печатает первую строку. Затем выполняется проверка и если n < 4, то снова вызывается функция up_and_down() с аргументом на 1 больше n+1. В результате вновь вызванная функция печатает вторую строку. Данный процесс продолжается до тех пор, пока значение аргумента не станет равным 4. В этом случае оператор if не сработает и вызовется функция printf(), которая печатает пятую строку «Уровень вверх 4». Затем функция завершает свою работу и управление передается функции, которая вызывала данную функцию. Эта функция up_and_down() с аргументом n=3, которая также продолжает свою работу и переходит к оператору printf(), который печатает 6 строку «Уровень вверх 3». Этот процесс продолжается до тех пор, пока не будет достигнут исходный уровень, т.е. первый вызов функции up_and_down() и управление вновь будет передано функции main(), которая завершит работу программы.

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

Переменные, объявляемые внутри функции, называются локальными переменными. Имя и значение локальной переменной известны только функции, внутри которой переменная объявлена.

В дополнение к локальным переменным C позволяет вашим программам объявлять глобальные переменные, которые известны на протяжении всей программы (глобально для всех функций). Глобальная переменная объявляется в начале исходного файла вне какой-либо функции.

 

Задание А.

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

 

Пример.

Дана целочисленная матрица размером 8 на 8. Найти:

а) такие k, что k-я строка  матрицы совпадает с k-м столбцом;

б) сумму элементов в тех строках, которые  содержат хотя бы один отрицательный элемент.

Блок-схема решения задачи дана в Лабораторной работе №5

 

Программа имеет следующий вид

#include <stdio.h>

#define m1 8

#define n1 8

/* Объявление прототипов функций */

void func(int *mat, int m, int n);

void func2(int *mat, int m, int n);

int main(int argc, char* argv[])

{int     i, j,matrix[n1][m1];

    /* Объявляем и инициализируем матрицу 8х8 */

/* генератором случайных чисел заполняем матрицу */

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

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

      matrix[i][j]=rand()%10-1;

printf("\n   Сгенерированная матрица имеет вид:\n ");

 /* вывод матрицы */

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

   { for (j = 0; j < n1; j++)

      printf(“%d  “,matrix[i][j]);

      printf("\n ");

    }

    func1(&matrix[0][0], 8, 8);

    func2(&matrix[0][0], 8, 8);

system("PAUSE");/* задержка экрана*/

    return 0;

}

void func1(int *mat, int m, int n)

int     i, j, p;  /* Счетчик и признак совпадения */ 

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

    {   p = 1;

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

        {

         /* Сравниваем элемент i-й строки j-го столбца с элементом j-й строки i-го столбца. В случае их несоответствия присваеваевам Флагу значение Ложь и прерываем цикл по j конструкцией break */

            if (mat[i * m + j] != mat[j * m + i])

            { p =0;

                break;

            }

        }

        printf("\n \t\t\tРЕЗУЛЬТАТ ФУНКЦИИ №1");

        /* выводим на экран  номер соответствующей строки */

        if (p==1) printf("i=%d ", i);

    } if (p==0) printf("\n нет одинаковых строк и столбцов ");

}

void func2(int *mat, int m, int n)

{

    int     i, j;    /* Счетчик и переменная для    хранения суммы */

int  p1, iSumm; /* признак нахождение отрицательного элемента и переменная для    хранения суммы */

    printf("\n\n");

 printf("\n \t\t\tРЕЗУЛЬТАТ ФУНКЦИИ №2\n");

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

    {        /* Присваеваем переменным исходные значения */

        p1 = 0;

        iSumm = 0;

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

        {/* При нахождение хотя бы одного отрицательного элемента присваиваем p1 = 1, обозначающее необходимость вывода Суммы на экран */

            if (mat[i * m + j] < 0) p1 = 1;

          /* Суммируем значения элементов i-й строки */

            iSumm += mat[i * m + j];

        }

        /* В случае нахождения в строке хотя бы одного отрицательного элемента выводим на экран сумму элементов i-й строки */

        if (p1) printf("Summ of elements of row #%d = %d\n", i, iSumm);

    }

}

Результат выполнения программы:

 

Сгенерированная матрица имеет вид

2 7 2 7 1 4 0 3

1 0 7 6 0 -8 3 5

2 7 1 8 1 4 9 3

9 2 8 5 2 0 0 6

7 1 1 3 9 3 9 1

8 2 4 9 1 -6 4 9

0 3 9 0 9 4 8 8

1 8 3 2 8 2 8 0

                        РЕЗУЛЬТАТ ФУНКЦИИ №1

Совпавшие строки и столбцы

k = 2

k = 6

                         РЕЗУЛЬТАТ ФУНКЦИИ №2

Сумма элементов строки #1 = 14

Сумма элементов строки #5 = 31

 

Варианты  задания А.

Варианты задания А соответствуют вариантам  задания А лабораторной работы №5

 

Задание  Б.

Выполнить упражнения из раздела «Лабораторная работа №3. Программирование циклических алгоритмов», используя рекурсивную функцию, вычисляющую факториал

 Задание: Составить программу вычисляющую:

 

.

 

Блок-схема решения задачи дана в Лабораторной работе №3.

Программа имеет следующий вид

 

#include <stdio.h>

#include <math.h>

    long   fact( int m)

   { if  (m<=1)   return (1);

     else  return (m * fact ( m -1 )); // функция fact вызывает саму себя

    } 

int main()

{

  int n, x, f, i;

float S;

printf ("\n Введите значение  n\n n=");

scanf ("%d", &n);

printf ("\n Введите значение  x\n x=");

scanf ("%d", &x);

S=0;

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

{

  f=fact(i);

   S=S+(cos(i*x)/ f);}

printf ("\n Сумма S=%f", S);

getch();

return 0;

Результат выполнения программы:

 

Введите значение  n

 n=4

Введите значение  x

 x=1

Сумма S=0.139995

 

Варианты  задания Б.

Варианты задания Б соответствуют вариантам  задания А лабораторной работы №3

 

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

1) Для чего нужны в программе процедуры и функции?

2) В чем отличие между процедурой и функцией?

3) Чем отличаются формальные и фактические параметры?

4) Чем отличаются параметры-значения и параметры-переменные?

5) Как объявляются глобальные и локальные переменные? Каково правило видимости этих переменных?

6) Почему при обращении к процедуре, аргумент, передаваемый параметру-переменной, может быть только переменной, а не константой или выражением?

7) Завершается ли работа функции при вызове оператора return?

8) Как называется функция, которая вызывает саму себя?

2.7 Лабораторная работа №7. Работа со строками и файлами

 

Цель работы: изучить базовые операции работы со строками и файлами.

Общие сведения.

В языке С нет специального типа данных для строковых переменных. Для этих целей используются массивы символов (тип char). Следующий пример демонстрирует использование строк в программе:

char str_1[100] = {‘П’,’р’,’и’,’в’,’е’,’т’,’\0’};

char str_2[100] = “Привет”;

char str_3[] = “Привет”;

printf(“%s\n%s\n%s\n”,str_1,str_2,str_3);

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

Символ ‘\0’ означает в языке С конец строки и все символы после него игнорируются как символы строки.

Функции ввода строк

             scantf(“%s”, имя строковой переменной);

gets(имя строковой переменной);

Функции вывода символа

            printf(“%s”, имя строковой переменной);

puts(имя строковой переменной);

 

Для работы  со строками   можно использовать библиотеку стандартных функций   <string.h>,  в которой имеются следующие функции работы со строками:

1) объединение строк или конкатенация:

                       strcat(имя строки1, имя строки2);

2) замена содержимого одной строки содержимым другой:

                        strcpy(имя строки1, имя строки2);

3) нахождение числа символов в строке:

strlen(имя строки);

4) сравнение Строки 1 и Строки 2:

                         strcmp(имя строки1, имя строки2);

Возвращает 0, если строки равны, число меньше нуля, если Строка 1<Строка 2 и число больше нуля, если Строка 1>Строка2;

5) преобразование строчных символов строки в прописные (обрабатывает только буквы латинского алфавита):

strlwr(имя строки);

6) преобразование прописных символов строки  в строчные (обрабатывает только буквы латинского алфавита):

strupr(имя строки);

7) заполнение строки указанным при вызове функции символом:

                    strset(имя строки, имя символа);

8) поиск символа в строке. (Возвращает указатель на первый найденный символ или, если символ не найден – NULL.):

                         strchr(имя строки, имя символа).

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

 Файл - это единица хранения данных, которые обычно хранятся на винчестерах (жестких дисках). Мы будем рассматривать как последовательный, так и произвольный доступ к файлу. Давайте теперь рассмотрим работу с файлами. Файл - это единица хранения данных, которые обычно хранятся на винчестерах (жестких дисках). В языке Си любой файл рассматривается как поток байтов. Концом любого файла является специальный символ.

При работе с файлами выполняются операции ввода - вывода. Операция ввода означает перепись данных с внешнего устройства (из входного файла) в основную память ЭВМ через файловый буфер (структура FILE или дескриптор файла ), операция вывода - это пересылка данных из основной памяти через файловый буфер на внешнее устройство (в выходной файл). Файлы на внешних устройствах часто называют физическими файлами.

Доступ к файловому буферу осуществляется через указатель, который содержит адрес файлового буфера

Определение указателя на файл

                                  FILE *fp;

Четыре шага, необходимых для работы с файлами:

          1) открыть файл;

          2) закрыть файл;

          3) ввод файла;

          4)  вывод файла.

Открытие файла:

                   fp=fopen(“имя_физического файла”,”режим”).

Закрытие файла:

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

Режимы работы с файлом:

 

Режим

Назначение

r

открываем файл для чтения (чтение из файла в файловый буфер ОП)

w

создаем файл для записи (запись из файлового буфера ОП в файл) Если файл уже существует, то данные стираются

a

Режим добавления данных (добавление из файлового буфера ОП в файл) Если файл уже существует, то записываем данные в конец файла

r+

существующий текстовый файл открывается как для чтения, так и для записи в любом месте файла; недопустимо увеличение файла

w+

создаем файл для обновления. Если файл уже существует, то данные стираются

a+

создает файл для обновления. Если файл существует, то данные записываются в конец файла

 

Функции ввода файла  (чтение данных из файла):

        1) ввод одного символа

                           имя_переменной=getc(имя_указателя);

        2) ввод строки

                                      fgets(pa,n,fp),

где pa- имя_указателя на строковую переменную или имя массива символов, куда читается строка из файла;

      n- количество символов, считываемых с файла;

      fp-имя_указателя, содержащего адрес файлового буфера;

       3) чтение  данных из файла последовательного доступа

                                      fscanf(fp,”f ”,a),

где  f- форматная строка;

        a- адрес_переменной.

Пример:      fscanf(fp,”%d”,&a); 

        4) чтение  данных из файла произвольного доступа

                                           fread(a,m,n,fp),

где  m-размер блока данных;

        n-количество блоков данных.

Пример:           fread(&a,sizeof(int),10,fp);  

Функции вывода файла  (запись данных в файл):

          1) вывод одного символа (запись одного символа)

                                    putc(имя_переменной,имя_указателя);

          2) вывод строки(запись строки в файл)

                                       fputs(pa,fp),

где pa- имя_указателя на строковую переменную или имя  массива символов, откуда читается строка в файл;

      fp-имя_указателя, содержащего адрес файлового буфера

         3) записи данных в файл последовательного доступа

                                             fprintf(fp,”f ”,a),

 где  f- форматная строка;

        a- имя_переменной.

Пример:                fprintf(fp,”%d”, a); 

       4) запись данных в файл произвольного доступа
                                           
fwrite(a,m,n,fp),

 где  m-размер блока данных;

        n-количество блоков данных.

Пример:                 fwrite(a,sizeof(int),10,fp);  

 

Задание А

Пример. Написать программу замены во веденной строке буквы   «а» на символ «+»

#include<stdio.h>

#include<string.h>

int main()

{ int i;

 char st[10];

 gets(st);

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

    if (st[i]=='a')st[i]='+';

 printf("\n st=%s\n",st);// puts(st);

   system("PAUSE");      

  return 0;

 

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

1) Написать программу поэлементного копирования строки «Языки и технология программирования» в другой символьный массив.

2) Написать программу объединения трех строк “Лабораторная ”, “ работа ” и “№6” в четвертую строку с текстом: «Лабораторная  работа “№6”».

3) Написать программу замены во веденной строке малых букв а на заглавные.

4) Написать программу удаления букв «н» из введенной строки.

5) Написать программу подсчета букв «е» во введенной строке.

6) Написать программу добавления слова «салют» после первого слова введенной строки.

7) Написать программу удаления букв «о» из введенной строки.

8) Написать программу сцепления двух строк.

9)  Написать программу добавления пробела после каждой буквы а введенной строки.

10) Написать программу замены во веденной строке заглавных букв «О» на малые.

11) Написать программу подсчета числа слов в строке.

12) Написать программу подсчета букв ‘и’ во введенной строке.

13) Написать программу замены первого слова из введенной строки на последовательность символов «*».

14) Написать программу удаления всех пробелов из введенной строки.

15) Написать программу замены последнего слова из введенной строки на последовательность символов «*».

16) Написать программу копирования первой половины введенной строки в другую строку.

17) Написать программу вывода введенного слова задом наперед.

18) Написать программу замещения первых половин двух введенных строк.

19) Написать программу удаления последнего слова из строки.

20) Написать программу замещения первой половины строки второй, а второй – первой.

 

Задание Б

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

 

Пример. Написать программу замены во веденной строке буквы   «а» на символ «+»

 

#include <conio.h>

#include <stdio.h>

int main()

{int i;

    char st[10];

     FILE *fp; /*объявляем указатель на структуру File*/

    fp = fopen("1.txt","w"); /*открытие файла для записи*/

     if (fp  == NULL)

        printf("Файл невозможно открыть или создать\n");

     else{

           scanf ("%s", st); /*ввод данных*/

           fprintf(fp," %s\n", st); /*запись данных из  переменной st в файл*/
        }

      fclose(fp); /*закрытие  файла*/

    fp = fopen("1.txt","r"); /*открытие файла для чтения*/

    if ((fp = fopen("1.txt","r")) == NULL)

        printf("Файл невозможно открыть или создать\n");
    
else{

         fscanf(fp," %s", st); /* чтение данных из файла и запись их в переменную st */

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

            if (st[i]=='a')st[i]='+';

           }fclose(fp);

          fp = fopen("1.txt","w"); /*открытие файла для записи*/

     if (fp  == NULL)

        printf("Файл невозможно открыть или создать\n");

     else{

           fprintf(fp," %s\n", st); /*запись данных из  переменной st в файл*/
        }

      fclose(fp);

      fp = fopen("1.txt","r"); /*открытие файла для чтения*/

    if ((fp = fopen("1.txt","r")) == NULL)

                printf("Файл невозможно открыть или создать\n");
    
else{

         fscanf(fp," %s", st); 

      printf (" %s\n", st); /*вывод данных*/

       

     }

     fclose(fp); /*закрытие  файла*/

     system("PAUSE");

return 0;

}

 

Варианты задания Б.

          Варианты задания соответствуют вариантам задания А настоящей лабораторной работы.

 

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

1) Что такое файл?

2) Какие существуют виды файлов?

3) Каково должно быть содержание программы по созданию файла и его корректировки (замена элементов, добавление элементов, удаление элементов)?

4) Какие существуют режимы работы с файлом?

5) Шаги, необходимые для работы с файлами?

6) Как объявляются строковые переменные в языке С?

7) Способы инициализации строковых переменных.

8) Что означает символ ‘\0’ в языке С?

 

 Заключение

 

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

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

 

 

 

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

 

1.  Эпштейн М.С. Программирование на языке С.-М.: «Академия», 2011.

2. Эпштейн М.С. Практикум по программированию на языке С.-М.: «Академия», 2007.

3. Уэйт М и др. Язые Си. Руководство для начинающих.-М.: «Мир», 1988.

4. Керниган Б. Язык программировния Си.-М.: «Финансы и статистика», 1992.

5. Вирт Н. Алгоритмы и структуры данных.-М.: «Мир», 1989.

6. Березин Б.И. Начальный курс С и С++.-М.: «Диалог-Мифи», 2004.

7. Архангельский А.Я. Язык С++ в С++ BUILDER.-М., 2008.

8. Ишкова Э.А. С++ начала программирования.-М.: «Бином», 2011.

9. Коплиен Дж. Программирование на С++.-СПб., 2005.

10 Либерти Дж. Освой самостоятельно С++ за 21 день.-М., 2007.

11. Павловская Т.А. С/С++. Структурное  программирование. -СПб.: «Питер», 2010.

12. Подбельский В.В. Программирование на языке Си. – М., 2000.

13. Полубенцева М. С/С++ процедурное программирование.- СПб., 2008.

14. Культин Н. С/С++ в задачах и примервх.-СПб.: «БХВ-Петербург», 2011.

 

  

Приложение А

Образец титульного листа  отчета

 

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ

РЕСПУБЛИКИ КАЗАХСТАН

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

 

 

Факультет «Информационные технологии»

Кафедра «Информационные системы»

 

                                                                                 

 

 

 

 

 

 

 

 

ОТЧЕТ

по лабораторной работе №1

по дисциплине «Языки и технология программирования»

тема: «Линейный алгоритм »

вариант № 1

 

                                                                                   

 

 

 

 

 

 

 

                                                                      Выполнил ст.гр. БИ-11-2

                                                                               Петров И.И.

        Проверил к.т.н., доцент                                                                        

  _______________Ни А.Г.

“______”__________2012

 

 

 

 

 

 

Алматы 2012

 

Сводный план 2012 г.,поз.205