Вы находитесь на странице: 1из 47

Пояснительная записка

Методические указания и контрольные задания для студентов заочного


отделения составлены для студентов специальности 230105 «Программное
обеспечение вычислительной техники и автоматизированных систем». Они
разработаны на основе и в соответствии с требованиями Государственного
образовательного стандарта. Методические указания и контрольные задания
предназначены для реализации Государственных требований к минимуму
содержания и уровню подготовки выпускников по данной специальности.
Методические указания по курсу «Язык программирования Си»
содержат пояснительную записку, вопросы для самоконтроля и перечень
практических самостоятельных заданий.
Преподавание дисциплины имеет практическую направленность и
проводится в тесной взаимосвязи с другими специальными дисциплинами:
«Основы алгоритмизации и программирования», «Язык программирования
Ассемблер», «Программное обеспечение компьютерных сетей». После
изучения дисциплины «Язык программирования Си» студенты получат
навыки написания простейших программ на этом языке, ознакомятся с его
особенностями, узнают сферы его применения.
Для закрепления теоретических знаний и приобретения необходимых
практических навыков и умений программой дисциплины предусматривается
выполнение самостоятельных практических заданий. Для их проведения
используются методические указания к выполнению лабораторных работ.
Практические занятия позволят студентам лучше освоить работу на
персональном компьютере.
В обязанности преподавателя входит контроль за степенью усвоения
программного материала.
В результате изучения предмета студент должен изучить следующие
темы:
Тема 1 Синтаксис Си++
1. Структура программы
2. Алфавит языка
3. Служебные слова
4. Идентификаторы
5. Константы
6. Типы данных

Тема 2. Программирование с использованием стандартных


функций
1. Операции и выражения
2. Программирование задачи линейной структуры на Си++
3. Потоковый ввод- вывод в стандарте Си++
4. Форматированный ввод- вывод в Си++
5. Программирование задачи разветвляющейся структуры на Си++
6. Программирование задачи циклической структуры на Си++
7. Программирование задачи обработки вектора на Си++
8. Программирование задачи обработки матрицы на Си++
9. Программирование задачи обработки текстовых данных на Си++

Тема 3. Функции
1. Программирование задач с использованием функций на Си++9.
Требования к выполнению контрольной работы.
В соответствии с учебным планом предусмотрено выполнение
домашней контрольной работы.
Контрольная работа должна быть результатом изучения студентом
соответствующих тем, должна показать его умение работать с литературой,
осмыслять ее, грамотно излагать свои мысли. Решенные задачи должны быть
представлены на дискете и оформлены в тетради по следующему плану:
1. № лабораторной работы, тема.
2. краткие ответы на все вопросы для самоконтроля, предлагаемые по
каждой теме.
3. условие задачи
4. блок-схема
5. код программы
6. тестирование
Всего должно быть выполнено 6 лабораторных работ.
Учебный материал необходимо изучать в последовательности,
указанной в пособии. К сессии следует составить конспект по всем темам.
Контрольная работа выполняется в отдельной тетради. В конце работы
приводится список использованной литературы в алфавитном порядке (по
фамилии автора).
Вариант контрольной работы определяется по последней цифре номера
зачетной книжки. № 0 соответствует 10 варианту.
Контрольная работа выполняется и оформляется в соответствие с
общими рекомендациями.
Лабораторная работа № 1
Линейные алгоритмы

Цель: Научить программировать линейные алгоритмы, используя


операторы форматированного и потокового ввода-вывода.
Постановка задачи: Разработать программу на Си++ для следующего
задания:
Задание1. Вычислить значение выражения по формуле (все переменные
принимают только вещественные значения)

b+ √b 2 +4 ac 3
P= −a c+b−2
2a

Вариант 1
#include <stdio.h>
#include <math.h>
void main()
{float a,b,c,P;
printf(“\na=”); scanf(“%f”,&a);
printf(“\nb=”); scanf(“%f”,&b);
printf(“\nc=”); scanf(“%f”,&c);
P=(b+sgrt(b*b+4*a*c))/(2*a)-pow(a,3)*c+1/(b*b);
printf((“\nP=%f”,P);
}
Вариант 2
#include <iostream.h>
#include <math.h>
void main()
{ float a,b,c,P;
cout<<“\na=”; cin>>a);
cout<<“\nb=”; cin>>b);
cout<<“\nc=”; cin>>c);
P=(b+sgrt(b*b+4*a*c))/(2*a)-pow(a,3)*c+1/(b*b);
cout<<“\nP=”<<P;
}

Примерный перечень вопросов для самоконтроля

1. Из чего состоит алфавит Си++?


2. Что является ограничителем комментариев?
3. Что такое идентификатор?
4. Что такое служебное слово?
5. Перечислите базовые типы в Си++.
6. Какие модификаторы размера вы знаете?
7. Какие модификаторы знака вы знаете?
8. Если не указан базовый тип, то какой принимается по умолчанию?
9. Если не указан модификатор знака, то какой принимается по
умолчанию?
10. Какие модификатор можно использовать с базовым типом Float?
11. В случае интерпретации величина Char как символа, чем будет являться
ее числовое значении?
12. Формат описания переменных. Привести пример.
13. Запись целых констант.
14. Запись вещественных констант. Использование суффиксов.
15. Запись символьных и строковых констант.
16. Именование константы
17. Определение константы на стадии предпроцессорной обработки
программы.
18. Определение констант перечисленного типа.
19. Выражения.
20. Арифметические операции.
21. Операции отношения.
22. Логические операции.
23. Операции присваивания
24. Операции «ТИП»-явного преобразования типа. Формат.
25. Операция sizeof. Формат
26. Операция «Запятая».
27. Операция «Условие ?:». Формат.
28. Приоритеты логических операций

Задания для самостоятельного выполнения

1 sin x x  1  sin x  1 cos 2 x


sin x  xyz  ax 2  bx c
dx3  f
2 sin x  cos y x y xy  21
cos x  sin y
tgxy y 1  34 x
3 3 e y 1
: x 1, y 1 2ctg(3x)  ln(
ln cos x
1 x 2 )
1 x 2 | y tgx| z  2 ,5
4 e x  ln(
ln cos x
: x 0.1
(1  tgx) ctgx  cos(x  y)
1 x 2 ) s

5
( xx 11 ) x  18 xy 2
ln|cos x|
ln(1 x 2 )
6 x  10sin x  cos(x  y) e x  x  2  (1  x) x : s 1.x718282
1

7 cos x
 2 x  16x cos(xy)  2 2 x  cos x  sin(2 xy)
8 2ctg (3 x)  12 x 2 17 x 5 | x 2  x 3 |  x3 715
x
x

9
x ln x cos yx  x 1 sin 2 ( x  y )
2 | x  2x
|
3 2 2
1 x y

10 x  10sin x | x  x | 4 5
1 sin x 1
cos(12 y  4 )
Лабораторная работа №2
Разветвляющиеся алгоритмы

Цель: Научить программировать разветвляющиеся алгоритмы.


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

Программа:
Задание 1
//Площадь треугольника
#include <iostream.h>
#include <math.h>
Void main()
{float a,b,c,P,S;
Cout<<”\na=”; cin>>a;
Cout<<”\nb=”; cin>>b;
Cout<<”\nc=”; cin>>c;
If (a>0 && b>0 && c>0 && a+b>c && a+c>b
&& b+c>a)
{P=(a+b+c)/2;
S=sqrt(P*(P-a)*(P-b)*(P-c));
Cout<<”\nПлощадь треугольника=”<<S;
}
Else cout (<<”\n Неверные исходные данные.);

Примерный перечень вопросов для защиты

1. Перечислите дополнительные операции присваивания.


2. Напишите формат и пример операции явного преобразования типа.
3. Напишите формат и пример операции size of.
4. Напишите формат операции «условие» пример: Заменить меньшее из
значений А и В на 3.
5. Структура простейшей программы на Си++.
6. Напишите формат и пример операции форматированного вывода на
экран.
7. Напишите формат и пример операции форматированного ввода с
клавиатуры.
8. Перечислите управляющие символы, используемые в форматной
строке.
9. Перечислите спецификаторы формата, используемые в форматной
строке.
10. Перечислите управляющие символы, используемые в форматной
строке.
11. Напишите формат и пример операции потокового вывода на экран.
12. Напишите формат и пример операции потокового ввода с клавиатуры.
13. Напишите формат и пример условного оператора в полной форме.
14. Напишите формат и пример условного оператора в краткой форме.
15. Напишите формат и пример оператора выбора.
16. Назначение команды Break

Задачи для самостоятельной работы по теме: "Ветвления"

1 1. Напишите программу-модель анализа пожарного датчика в помещении, которая выводит


сообщение «Пожарная ситуация», если температура (ее значение вводится с клавиатуры) в комнате
превысила 60ºС.
2. Ракета запускается с точки на экваторе и развивает скорость v км/с. Каков результат запуска?
Замечание: если v<=7.8 км/с, то ракета упадет на Землю, если 7.8<v<11.2, то ракета станет спутником
Земли, если 11.2v16.4, то ракета станет спутником Солнца, если v>16.4, то ракета покинет Солнечную
Систему.

2 1. Рис расфасован в два пакета. Вес первого - m кг, второго – n кг. Составьте программу,
определяющую: а) какой пакет тяжелее – первый или второй? б) вес более тяжелого пакета.
2. Написать программу, которая бы запрашивала возраст мужчины и сообщала, сколько лет ему
осталось до пенсии, либо что он уже пенсионер.

3 1. Туристы вышли из леса на шоссе неподалеку от километрового столба с отметкой А км и


решили пойти на ближайшую автобусную остановку. Посмотрев на план местности, руководитель
группы сказал, что автобусные остановки расположены на километре В и на километре С. Куда следует
пойти туристам?
2. Написать программу, которая бы запрашивала целое число и распечатывала любое его
значение, кроме13. Если заданное число равно13, вместо него печатается число 77.

4 1. Валя и Вера на своем садовом участке собрали А кг клубники. Из них В кг собрала Вера. Кто
из девочек собрал клубники больше и на сколько?
2. Даны длины трех отрезков a, b, c. Если можно построить треугольник по этим трем отрезкам,
то вычислить его периметр и площадь.

5 1. Первая бригада маляров за t1 час покрасила А м2 стен, а вторая бригада за t2 часа покрасила В
м2. У какой бригады производительность труда выше и на сколько?
2. Каждое утро майор Знаменский заходит в тир и делает 5 выстрелов через плечо. Если он
набирает 50 очков, то вечером идет с Зиночкой в ресторан, а если меньше, то на тренировку в тир.
Написать программу, которая распечатывает планы майора на вечер.

6 1. Турист за день прошел А км. До обеда он шел t часов и прошел 20 км. Еще t2 часа он шел
после обеда. Когда скорость туриста была выше: до обеда или после обеда?
2. Составьте программу, которая по трем введенным вами числам определит, могут ли эти числа
быть длинами сторон треугольника, и если да, то определить вид этого треугольника (остроугольный,
прямоугольный или тупоугольный).

7 1. Валя и Вера собрались варить варенье из А кг смородины. По рецепту на 2 кг ягод нужно 3 кг


сахара. Валя сказала, что им потребуется С кг сахара, а Вера - что Р кг. Кто из них прав?
2. Для конкурсного отбора манекеншиц приглашаются девушки не ниже 180 см. Оределить,
будет ли допущена Таня к участию в конкурсе.

8 1. Смекалкин, уходя в школу, вышел из дому на 3 минуты позже младшего брата. Расстояние до
школы S метров. Смекалкин идет со скоростью V1 м/мин, а его брат – V2 м/мин. Догонит ли
Смекалкин брата, прежде, чем тот придет в школу?
2. Известна заработная плата сотрудника. Вычислить величину подоходного налога.

9 1. Составьте программу, проверяющую, верно ли утверждение, что сумма цифр введенного вами
целого числа делится на 5.
2. Нормальный пульс человека 60 ударов в минуту, давление 120 на 80. При отборе в школу
космонавтов допуск по пульсу равен –1, +3; допуск по нижнему значению давления 3, по верхнему -
+5. Определить, пройдет ли медкомиссию данный претендент.

10 1. Даны три действительных числа a, b, c. Найти наибольшее из них.


2. Занятия в начальных классах отменяются в тех случаях, когда температура воздуха не выше –
25 градусов, а также при ветре не менее 7м/с и температуре не выше – 20 градусов. По утренней сводке
погоды определить, пойдут ли дети в школу.
Лабораторная работа № 3
Использование оператора SWITCH

Цель: Научить программировать разветвляющиеся алгоритмы,


используя оператор-переключатель.
Постановка задачи: Разработать программу на Си++ для следующего
задания:
Задание1. используйте оператор switch для вывода словесного
описания оценки, основываясь на текущей оценке студента.
#include <iostream.h>
void main(void)
{
int grade =5;
switch (grade)
{ case 5: cout << "Поздравляем, вы получили пять" << endl; break;
case 4: cout << "Хорошо, у вас хорошо" << endl; break;
case 3: cout << "У вас всего лишь удовлетворительно" << endl; break;
case 2: cout << "Плохо, у вас двойка" << endl; break;
default: cout << "Ужасно! Учите лучше!" << endl; break;
}
}
Оператор switch состоит из двух частей.
Первая часть оператора switch представляет собой условие, которое
появляется после ключевого слова switch. Вторая часть представляет собой
возможные варианты соответствия. Когда программа встречает оператор
switch, она сначала исследует условие, а затем пытается найти среди
возможных вариантов тот, который соответствует условию.
Если программа находит соответствие, выполняются указанные
операторы. Например, в предыдущей программе выбор варианта 'В'
соответствует условию. Таким образом, программа выводит сообщение, что
пользователь получил В. Найдите время для эксперимента с этой
программой, изменяя оценку и наблюдая поведение программы. Если же ни
один из указанных вариантов не соответствует условию, то выполняется
вариант default. Обратите внимание на использование оператора break в
каждом варианте предыдущей программы.
Оказывается, если C++ встречает вариант, соответствующий условию
оператора switch, то он подразумевает, что все последующие варианты тоже
соответствуют условию. Оператор break указывает C++ завершить текущий
оператор switch и продолжить выполнение программы с первого оператора,
следующего за оператором switch. Если вы удалите операторы break из
предыдущей программы, то программа выведет не только требуемое
сообщение, но и сообщение для всех последующих вариантов (потому что
если один вариант является истинным, то и все последующие варианты в C++
рассматриваются как истинные).
ЧТО ВАМ НЕОБХОДИМО ЗНАТЬ
Если вашей программе необходимо проверить, соответствует ли
условие указанным значениям, следует использовать оператор switch.
Когда программа встречает в операторе switch вариант (case),
соответствующий условию, то все последующие варианты рассматриваются
как удовлетворяющие условию. Используя оператор break, вы можете
указать C++ прервать оператор switch и продолжить выполнение программы
с первого оператора, который следует за switch.К сожалению, в сase нельзя
задавать диапазон значений. Если в Паскале метка оператора выбора может
иметь следующий вид: 1..3, 6, 9..11, то в Си приходится писать громоздкую
конструкцию :сase 1: сase 2:сase 3:сase 6:сase 9:сase 10:сase 11:

Примерный перечень вопросов для защиты

1. Напишите формат оператора switch.


2. Можно ли в сase задавать диапазон значений?
3. Можно ли с помощью оператора break прервать оператор switch и
продолжить выполнение программы с первого оператора, который следует за
switch?
4. Какой вариант выполняется , если ни один из указанных вариантов не
соответствует условию.

Задания для самостоятельного выполнения

1. Написать программу, которая по номеру дня недели (целому числу от 1 до 7) выдает в качестве
результата количество пар и их названия в вашей группе в этот день.
2. Написать программу, позволяющую по последней цифре числа определить последнюю цифру его
квадрата.
3. Написать программу, которая по заданному году и номеру месяца m определяет количество дней в
этом месяце.
4. Для каждой введенной цифры (0-9) вывести соответствующее ей название на английском и русском
языке.
5. Написать программу, которая по номеру месяца выдает название следующего за ним месяца. (При
m=1 получаем- февраль, 4- май и т.д.)
6. Напишите программу, которая анализирует человека по возрасту и относит к одной из четырех
групп: дошкольник, ученик, работник, пенсионер. Возраст вводится с клавиатуры.
7. В старояпонском календаре был принят 12-летний цикл.
Годы внутри цикла носили названия животных: крысы, коровы, тигра, зайца, дракона, змеи, лошади, овцы,
обезьяны, курицы, собаки и свиньи. Написать программу, которая вводит номер некоторого года и печатает
его название по старояпонскому календарю.
8. Написать программу, которая по введенному номеру времени года (1-зима, 2-весна, 3-лето, 4-осень)
выдавала соответствующее этому времени года месяцы и количество дней в каждом месяце.
9. Написать программу, которая по номеру месяца (целому числу от 1 до 12) выдает в качестве
результата названия сезона, соответствующее ему. Например: 5-весна.
10. Составьте программу, которая для целого числа k (от 1 до 99), введенного вами, напечатает фразу
«Мне k лет», при этом в нужных случаях слово «лет» заменяя на слово «год» или «года».
Лабораторная работа № 4
Программирование циклических алгоритмов

Цель: Научить программировать циклические алгоритмы, используя


операторы цикла с параметром и с предусловием.
Постановка задачи: Разработать программу на Си++ для следующего
задания:
Задание1
Числа Фибоначчи (Fn) определяются формулами: f0=f1=1, fn=fn-1+fn-2
При n=2,3… Определить первые n чисел Фибоначчи.
Код программы:
#include<conio.h>
#include <iostream.h>
void man()
{ clrscr();
long int fn, f1, f2; int I, n;
f2=f1=1;
cout<<”Введите n>2:”;
cin>>n;
for(i=3; i<=n; i++)
{ fn=f1+f2;
f1=f2;
f2=fn;
}
cout<<”\nf”<<i<<”=”<<fn;
}
Задание 2.
Из заданного натурального числа вычли сумму его цифр. Из
результатов вновь вычли сумму его цифр и д.т. Сколько таких действий
необходимо произвести, чтобы получить 0?
Код программы:
#include<conio.h>
#include <iostream.h>
void main()
{ clrscr();
int i,s,c,o,p;
long int n,N;
p=0;
cout<<”\n Введите число”; cin>>N;
while(n>0)
{n=N;
i=s=0;
do {c=n/10; o=n%10; n=c; s+=o;}
while(c!=0); // Подсчёт суммы цифр в числе
N=N-s; p++;
}
cout<<”\nP=”<<p;
}
Задание 3.
Приведенная программа подсчитывает сумму цифр введенного числа N.
Цикл while последовательно выделяет и суммирует цифру исходного числа,
начиная с последней; для выделения применяется операция взятия остатка от
деления - %. При делении целых чисел любая дробная часть отбрасывается,
поэтому после операции N=N/10; исходное число уменьшается в 10 раз при
каждом "обороте" цикла, пока, наконец, не станет равным нулю, после чего
цикл завершается и на экран дисплея выдается значение переменной S, в
котором содержится сумма цифр числа N.
Код программы.
#include <stdio.h>
main()
{ int N,S,Z;
S=0;
printf("ВВЕДИ N\n");
scanf("%d",&N)
while(N!=0)
{Z=N%10;
N=N/10;
S=S+Z;
}
printf("СУММА ЦИФР=%d\n",S);
}
Задание 4.
Рассмотрим еще один пример. Здесь приведена программа, которая
реализует алгоритм разложения числа на простые множители. Для
сокращения времени счета отдельно рассматривается случай множителя,
равного двум, чтобы в последующем рассматривать только нечетные
множители.
Код программы.
/*РАЗЛОЖИТЬ ЧИСЛО НА МНОЖИТЕЛИ */
#include <stdio.h>
main()
{ int M,i=3;
printf("ВВЕДИ M\n"); scanf("%d",&M);
printf("%d=1",M);
while(M%2==0)
{printf("*%d",2); M=M/2;
}
while(i <=M)
{if(M%i==0)
{printf("*%d",i);
M=M/i;
}
else i=i+2
}
}
Задание 5.
Рассмотрим еще один пример, в котором используется сложный цикл.
Программа позволяет найти в заданном интервале все совершенные числа.
Напомним, что натуральное число называются совершенным, если оно равно
сумме всех своих делителей, считая его самого. Известно, что все
совершенные числа - четные и что первое совершенное число из
натурального ряда чисел равно 6. Этим объясняется начальное значение
параметра внешнего цикла. Так как все натуральные числа имеют своим
делителем единицу, полагаем начальное значение суммы делителей числа
S=1. Во внутреннем цикле организуется перебор всех множителей текущего
значения N. Из теории чисел известно, что такому испытанию имеет смысл
подвергать числа от 2 до N/2, либо даже до корень из N.
Код программы.
#include <stdio.h>
main()
{int j,N,M,S;
printf("ВВЕДИ M\n");
scanf("%d",&M);
N=4;
while(N<=M)
{ S=1;j=2;
while(j<=N/2)
{if(N%j==0) S=S+j;
j=j+1;
}
if(N==S)
printf("%d- СОВЕРШЕННОЕ ЧИСЛО\n",N);
N=N+2;
}
}

Примерный перечень вопросов для самоконтроля

1. Оператор цикла с постусловием выполняется до тех пор, пока


заключенное в нем выражение …………………(истина или ложь?)
2. Какого типа может быть шаг изменения параметра цикла for? цикла while?
3. Формат оператора цикла с параметром, постусловием, предусловием.
4. Назначение оператора CONTINUE, BREAK.
5. Можно ли использовать оператор GOTO для досрочного выхода из цикла?
6. Запишите, что является результатом выполнения фрагмента программы:
for(x=8; x<=30; x+=6) cout<<”Привет!”;
7. Подсчитайте, чему равно значение переменной S после завершения
выполнения оператора цикла:
for(S=0, I=10; I>=6; I--) S++;
8. Подсчитайте, чему равно значение переменной S после завершения
выполнения оператора цикла:
S=0; I=5; while(I<=7) S++; I++;
9. Подсчитайте, чему равно значение переменной F после завершения
выполнения оператора цикла:
for(F=1, I=1; I<=4; I++) F*=I;
10. Оператор цикла с предусловием выполняется до тех пор, пока
заключенное в нем выражение ……………………(истина или ложь?)
11. Запишите, что является результатом выполнения фрагмента
программы:
for(p=1; p<=5; p++) cout<<p<<” “<<p*p<<” “<<pow(p,3);
12. Что будет напечатано на экране после выполнения оператора цикла:
for( buk=’A’; buk<=’Z’; buk++) cout<<buk;
13. Подсчитайте, чему равно значение переменной S после завершения
выполнения оператора цикла:
for(S=0, I=5; I<=7; S++);
14. Подсчитайте, чему равно значение переменной S после завершения
выполнения оператора цикла:
S=0; I=5;
do S++; I++; while(I<=7)

Задания для самостоятельного выполнения

№ Условие задач
1 1. Сколько можно купить быков, коров, телят, платя за быка 10 рублей, за корову 5 рублей, а за
теленка 0,5 рублей, если на 100 рублей надо купить 100 голов скота. [Ответ: коров-9, бык-1,телят-90]
2. В компьютер вводятся по очереди координаты N точек. Определить, сколько из них попадет в круг
радиусом R с центром в точке (а,в).
2 1. У гусей и кроликов вместе 24 лапы. Сколько может быть кроликов и гусей (указать все сочетания)
2. В компьютер вводятся по очереди данные о росте N учащихся группы. Определить средний рост
учащихся группы.
3 1. Одноклеточная амеба каждые три часа делится на 2 клетки. Определить, сколько амеб будет
через 3,6,9,12,…,24 часа. [Ответ: 256]
2. Составьте программу вычисления степени числа А с натуральным показателем N . (Записать
варианты программы с 3 видами циклов: for, while, do…while)
4 1.Написать программу, которая вводит и суммирует любое количество целочисленных значений. Если
введено число 999, то на экран выводится результат суммирования.
2. Дано действительное число x. Вычислить:
1 1 1 1
   ...  (1) n * n
S=x- 2 4 8 2
5 1. С помощью оператора WHILE написать программу, которая ищет произведение 10 произвольно
введенных чисел и выводит его на печать.
2. Начав тренировки, спортсмен в первый день пробежал 10 км. Каждый день он увеличивал норму
на 10% нормы предыдущего дня. Какой суммарный путь пробежит спортсмен за 7 дней?
6 1. С помощью оператора WHILE напишите программу вывода всех четных чисел в диапазоне от 22
до 100 включительно.
2. Составить программу для вычисления значений функции F(x) на отрезке [a,b] с шагом h. Результат
представить в виде таблицы, первый столбец которой- значения аргумента, второй- соотв. значение
функции. F(x)=cosx+ctgx
7 1. С помощью оператора WHILE напишите программу, вычисляющую сумму квадратов чисел от 1
до введенного вами целого числа.
2. Дано действительное число a и натуральное число n. Вычислить:
1 1 1 1
 2  4  ...  2 n 2
S= a a a a
8 1. Напишите программу определения суммы всех нечетных чисел, кратных 3 в диапазоне от 1 до 99
включительно.
2. Дано действительное число Х. Вычислить:
( x  1)( x  3)( x  7)...( x  63)
P= ( x  2)( x  4)( x  8)...( x  64)

9 1. Дано действительное число a и натуральное число n. Вычислить:


2
P=a(a-n)(a-2n)…(a-n )
2. Составить программу поиска четырехзначных чисел, которые при делении на 133 дают в остатке
125, а при делении на 134 дают в остатке 111.

10 1. С помощью оператора цикла с постусловием напишите программу-фильтр, которая вводит любые


символы, но комментирует только буквы русского алфавита. Завершение работы - по нажатию буквы
‘Я’.
2. Дано натуральное число n. Вычислить:
1 1 1 1
)(1  )(1  )...(1  )
P=(1- 2 4 6 2n
11 1. С помощью оператора цикла с постусловием напишите программу, которая требует у вас пароль,
например: 111, и если пароль правильный, то заполняет все строки экрана сообщением «Молодец».
Если после пятой попытки пароль все равно неправильный, выйти из программы.
2. Дано натуральное число n. Вычислить:
1 1 1 1
2
)(1  2 )(1  2 )...(1  2 ),
P=(1- 2 3 4 n где n>2
12 1. С помощью оператора WHILE напишите программу получения в порядке убывания всех
делителей данного числа N.
2. Вычислить:
P=(1+sin0.1)(1+sin0.2)(1+sin0.3)…(1+sin10)

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


вводимого вами целого неотрицательного числа. (Можно использовать операцию целочисленного
деления для последовательного уменьшения числа на 1 разряд)
2. Дано действительное число x и натуральное число n. Вычислить:

S=sinx+sinx
2
 sin x 3  ...  sin x n

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


из всех введенных вами чисел. Признаком конца ввода чисел пусть является введенное число 0.
2. Дано натуральное число n. Вычислить:
1 1 1 1
 2  2  ... 
S=
3 2
5 7 (2n  1) 2
15 1. С помощью оператора WHILE напишите программу, находящую наибольшее и наименьшее
значение функции y=3*x*x+x-4, если на заданном интервале [а,в] х изменяется с шагом 0,1
2. Дано натуральное число n. Вычислить:
2 3 4 n 1
   ... 
S= 1 2 3 n
Лабораторная работа № 5
Одномерные массивы

Цель работы: Освоить программирование алгоритмов с использованием


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

Выполнение:
Обратите внимание на объявление массива через константу
Код программы:
//Среднее значение массива
#include<iostream.h>
#include<conio.h>
void main()
{const n=10;
int i; double A[n],SA;
clrscr();
for(i=0; i<n; i++)
{ Cout<<”A[“<<i<<”]=”;
cin>>A[i];
}
SA=0;
for(i=0; i<n; i++) SA=SA+a[i];
SA=SA/n;
Cout<<”/nСреднее значение=”<<SA;
}
Задание 2
Вычисление и вывод на экран таблицы умножения в форме матрицы
Пифагора.
Код программы:
// Матрица Пифагора.
#include<stdio.h>
#include<conio.h>
void main()
{int i,j, A[10][10];
clrscr();
for(i=1; i<=9; i++)
{ for(j=1; j<=9; j++)
{A[i][j]=i*j;
printf(“%5d”,A[i][j]);
}
Printf(“\n”);
}
Задание 3
Заполнение массива случайными числами в диапазоне от 0 до 99 и
поиск в нем максимального значения.
Код программы:
#include<iostream.h>
#include<iomanip.h> //для использования манипуляторов при потоковом
выводе
#include<conio.h>
#include<stdlib.h> //для подключ. функции int rand(void)- генератор
случ. чисел
#define n 5
void main()
{
int i, ImaxA, A[n][n];
clrscr();
randomize(); //первоначальная установка датчика случайных чисел
for(i=0; i<=n; i++)
{A[i]=rand()%100;
cout<<setw(6)<<A[i]; // setw(n) влияет на формат следующего элемента
выходного //потока. Он указывает на то, что значение будет выводиться в n
позиции на экране (в //программе n =6); endl -обозначает конец строки и
переводит экранный курсор на //начало новой строки. Его действие
аналогично действию управляющего символа \n
}
cout<<endl;
ImaxA=0;
for(i=0; i<=n; i++)
{if (A[i]>A[ImaxA]) ImaxA=I;}
cout<<”Максимальное значение:A[“<< ImaxA<<”]=”<<A[ImaxA];
}

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

1. Формат описания массива.


2. Пусть объявлен массив int p[]={2, 4, 6, 10, 1};
Чему равно значение элемента р[3]?
3. Пусть задан массив int x[]={6, 4, 9, 3, 2}; Как определить размерность
массива?
4. Опишите массив R из пяти элементов, каждый из которых является
массивом
из 10-ти вещественных чисел.
5. В какой библиотеке находится функция rand().
6. Числа из какого диапазона генерирует функция rand()
7. Чему равно значение константы RAND_MAX
8. Что является результатом программы:
Int x[]={5,2,3,0,8};
FOR(i=1;i<=3;i++){cout>>”\n”>>x[i];}
9. Каким должен быть тип индекса массива;
10.Заполните массив float x[15] [15] случайными числами из диапазона 0..1;
11.Опишите массив А, содержащий 10 элементов целого типа.
12.В каком случае размерность массива можно явно не указывать.
13.Пусть объявлен массив Int m[6]={5, 3, 2}; Чему равен элемент m[4]?
14.Чему равно нижнее значение индекса?
15.Какая функция генерирует случайные числа.
16.Для чего предназначена функция randomize()?
17.Что является результатом программы:
For (i=0;i<=5;i++) {A[i]=i; cout <<A[i]<<” “;}
18.Пусть задан c[i] [j].Какой индекс обозначает строки,а какой столбцы
19.Заполните массив int x[10][15] случайными числами из диапазона 1..100;
Вывести символы, соответствующие кодам?
20.Можно ли изменить размерность ранее описанного массива?

Задания для самостоятельного выполнения

1 1. Задан вещественный массив Х из пяти элементов. Выведите на экран значения квадратов и


корней каждого из пяти элементов.
2. При поступлении в вуз абитуриенты, получившие двойку на первом экзамене, ко второму не
допускаются. В массиве А[n] записаны оценки экзаменующихся, полученные на первом экзамене.
Подсчитать, сколько человек не допущено ко второму экзамену.
2 1. Задан вещественный массив Х из семи элементов. Найти его минимальный и максимальный
элементы.
2. Задана последовательность N целых чисел. Вычислить сумму элементов массива, порядковые
номера которых совпадают со значением этого элемента.
3 1. Задан массив С из 10 элементов. Подсчитать в нем количество четных, нечетных чисел и
нулей.
2. Даны натуральное N и последовательность A 1, A2, …,A N, состоящая из N целых чисел. Получить
последовательность, которая отличается от исходной тем, что все нечетные элементы удвоены.

4 1. Задан массив С из 8 вещественных элементов. Подсчитать в нем количество положительных,


отрицательных чисел и нулей.
2. Даны натуральное число N и последовательность A1, A2, …,A N, AN+1. Определить наибольшее
из нечетных и количество четных чисел, входящих в последовательность A1, A2, …,A N, AN+1.
5 1. Задан массив С из 10 элементов. Найти номер первого из элементов массива С, имеющего
нулевое значение. Если таких элементов нет, вывести соответствующее сообщение.
2. Последовательность а1, а2, …, аn состоит из нулей и единиц. Поставить в начало этой
последовательности нули, а затем единицы.
6 1. Задан вещественный массив Х из 10 элементов. Найти минимальный элемент и его
порядковый номер.
2. «Суперзамок». Секретный замок для сейфа состоит из 10 расположенных в ряд ячеек, в
которые надо вставить игральные кубики. Но дверь открывается только в том случае, когда в любых
соседних ячейках сумма точек на передних гранях кубиков равна 10. (игральный кубик имеет на
каждой грани 1 до 6 точек.) напишите программу, которая разгадывает код замка при условии, что два
кубика уже вставлены в ячейку.
7 1. Пусть в массиве А хранятся зарплаты N сотрудников. Тем сотрудникам, у которых зарплата
меньше минимально-возможной суммы, поднимем зарплату до этого минимального значения minzp.
2. Даны натуральное число N и последовательность A1, A2, …,A N. Определить ближайшее к
какому-нибудь целому.

8 1. Задан массив С из 10 элементов. Поменять местами его первый и последний элементы.


2. Дан одномерный массив В[n]. Вставьте в него элемент В в L позицию.
9 1. Вычислить произведение элементов массива С[7] целых чисел, и если это произведение
отрицательное, то вывести его абсолютное значение.
Дана последовательность n различных целых чисел. Найти сумму ее членов, расположенным между
максимальным и минимальным значениями (в сумму включить и оба этих числа).
10 1. Расположить числа массива D[10] в обратном порядке.
2. Заданы два массива FAM и ZP, в которых соответственно хранятся фамилии работников и их
заработная плата. Найти работника, который получает максимальную зарплату.
11 1. В массив А[n] занесены натуральные числа. Найти сумму тех элементов, которые кратны
данному К.
2. В целочисленной последовательности есть нулевые элементы. Создать массив из номеров этих
элементов.
12 1. Дана последовательность натуральных чисел а 1, а2, … аn. Создать массив из четных чисел этой
последовательности. Если таких чисел нет, то вывести сообщение об этом факте.
2. Даны натуральное число N и последовательность A 1, A2, …,A N. В данной последовательности
определить число соседств двух положительных чисел.
13 1. В доме проживают 70 семей. Найдите номер квартиры, в которой проживает самая
многочисленная семья.
2. Даны натуральное число N и последовательность A 1, A2, …,A N. В данной последовательности
определить число соседств двух чисел разного знака.
14 1. Дана последовательность чисел, среди которых имеется один нуль. Вывести все числа до нуля
включительно.
2. Дан одномерный массив N целых чисел. Проверьте, является ли он упорядоченным по
убыванию.
15 1. В последовательности действительных чисел есть только положительные и отрицательные
элементы. Вычислить произведение отрицательных элементов и произведение положительных
элементов и сравнить, какое произведение больше по модулю.
2. Даны натуральное число N и последовательность A 1, A2, …,A N. Определить наименьшее
положительное среди A1, A2, …,A N.
16 1. Найти произведение всех элементов массива вещественных чисел, меньших заданного числа.
Размерность массива –10. Заполнение массива осуществить случайными числами от 50 до 100.
2. Вычислить среднее арифметическое значение тех элементов одномерного массива, которые
расположены за первым по порядку минимальным элементом.
17 1. Найти сумму элементов массива целых чисел, которые делятся на 5 и на 8 одновременно.
Размерность массива –30. Заполнение массива осуществить случайными числами от 500 до 1000.
2. В сказочной стране Лукоморье в целях экономии топлива все грузы перевозят на Змей
Горыночах, имеющих свой бортовой номер от 1 до 100. Количество голов Змея определяет его
грузоподъемность. В архиве К. Бессмертного заведено личное дело на каждого Змея Горыноча с
информацией о количестве голов и бортовом номере Однажды на Калиновом мосту грузовым Змеем
Горыночем была сбита гражданка Баба Яга. Нарушитель скрылся, но свидетели показали, что число
голов Змея кратно его бортовому номеру. Помогите Д. Никитичу следователю по ДТП выяснить
нарушителя.
Лабораторная работа №6
Двумерные массивы

Двумерный массив трактуется как одномерный массив, элементами


которого является массив с указанным в описании типом элементов.
Например, оператор float R[5][10]; объявляет массив из пяти элементов,
каждый из которых есть массив из десяти вещественных чисел. Отдельные
величины этого массива обозначаются именами с двумя индексами: R[0][0],
R[0][1],…,R[4][9].
Двумерный массив можно инициировать так:
int matr[2][5] = {{3,4,0,1,2},{6,5,1,4,9}};
Пример 1
Вычисление и вывод на экран таблицы умножения в форме матрицы
Пифагора.
//Матрица Пифагора
#include <stdio.h>
#include <conio.h>
void main()
{ int i, j, A[10][10];
Clrscr();
for (i=1; i<=9; i++)
{ for (j=1; j<=9; j++)
{A[i][j]=i*j;
Printf(“%5d”, a[i][j]);
}
Printf(“\n”);
}
}
По данной программе в двумерном массиве А не будут заполнены
нулевая строка и нулевой столбец. (интерпретируем: i- номер строки, j-номер
столбца).
Пример 2
Заполнение матрицы случайными числами в диапазоне от 0 до 99 и
поиск в ней максимального и минимального значения.
//Максимум
#include <iostream.h>
#include <iomanip.h>
#include <stdlib.h>
#include <conio.h>
#define n 5
void main()
{ int i, j, A[n][n],ImaxA, JmaxA, IminA, JminA;
сlrscr();
randomize(); //установка датчика случайных чисел
for (i=0; i<=n; i++)
{ for (j=0; j<=n; j++)
{A[i][j]=rand()%100;
cout<<setw(6)<<A[i][j]);
}
cout<<endl;
}
ImaxA=JmaxA=IminA=JminA=0;
for (i=0; i<=n; i++)
{ for (j=0; j<=n; j++)
{if (A[i][j]>A[ImaxA][ JmaxA]) { ImaxA =I; JmaxA=j; }
if (A[i][j]<A[IminA][ JminA]) { IminA =I; JminA=j; }
}
cout<<”Максимальное значение:[”<< ImaxA<<”][“<<
JmaxA<<”]=”<<A[ImaxA][ JmaxA];
cout<<”Минимальное значение:[”<< IminA<<”][“<< JminA<<”]=”
<<A[IminA][ JminA];
}
В библиотеке stdlib.h содержится функция, прототип которой имеет
вид: int rand(void). Результатом этой функции является целое случайное
число из диапазона от 0 до RAND_MAX. значение константы RAND_MAX
обычно равно 32767- максимально допустимому целому числу. Для
получения целых чисел в диапазоне от 0 до N-1 достаточно вычислить
остаток от деления rand() на N. Функция с прототипом void randomize(void)
выполняет первоначальную настройку датчика случайных чисел так, чтобы
последовательность чисел не повторялась при повторном выполнении
программы.
 Другим новым элементом в данной программе является использование
манипуляторов для управления потоковым выводом с помощью стандартного
объекта cout. Манипуляторы объявляются в заголовочном файле iomanip.h.
Манипулятор setw(n) влияет на формат следующего элемента выходного
потока. Он указывает на то, что значение будет выводиться в n позиции на
экране (в программе n=6). Манипулятор endl обозначает конец строки и
переводит экранный курсор на начало новой строки. Его действие
аналогично действию управляющего символа \n.

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

1. Формат описания двумерного массива.


2. Пусть объявлен массив int p[3][3]={2, 4, 6, 10, 1, 12, 4, 0, 0};
3. Чему равно значение элемента р[2][2]?
4. Опишите массив R из пяти элементов, каждый из которых является
массивом из 10-ти вещественных чисел.
5. В какой библиотеке находится функция rand().
6. Числа из какого диапазона генерирует функция rand()
7. Чему равно значение константы RAND_MAX
8. Что является результатом программы (на экране):
int x[3][2]={5,2,3,0,8,1};
for(i=1; i<=3; i++)
{ for(j=1; j<=3; j++) cout>>x[i]>>” “;
cout>>”\n”;}
9. Каким должен быть тип индекса массива;
10. Заполните массив float x[15] [15] случайными числами из диапазона
0..1;
11. В каком случае размерность массива можно явно не указывать.
12. Пусть объявлен массив int m[2][2]={{5, 3}, {0, 2}}; Чему равен элемент
m[1][2]?
13. Чему равно нижнее значение индекса?
14. Какая функция генерирует случайные числа.
15. Для чего предназначена функция randomize()?
16. Пусть задан c[i] [j].Какой индекс обозначает строки,а какой столбцы
17. Заполните массив int x[10][15] случайными числами из диапазона
1..100; Вывести квадраты элементов массива.
18. Можно ли изменить размерность ранее описанного массива?
19. Заполните массив int P[5][5] случайными числами из диапазона
32..255; Вывести символы, соответствующие кодам?
20. Можно ли определить произвольный диапазон для индексов массива?
21. Пусть задан А[4][5]. Чему равны максимальные значения индексов для
строк и для столбцов?
22. Для чего предназначен манипулятор setw(n)? В какой библиотеке он
находится?
Задания для самостоятельного выполнения

1 1. Дана квадратная матрица порядка N. Вычислить среднее арифметическое положительных


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

2 1. Дана матрица размерности N на M. Найти строку, в которой максимальный элемент


минимален в соответствующем столбце.
2. Сформировать матрицу по следующему правилу

3 1. Дана матрица размерности N на M. Найти столбец, в котором максимальный элемент


минимален в соответствующей строке.
2. Сформировать матрицу по следующему правилу

4 1. Дана матрица размерности N на M. Найти в матрице первую по порядку строку с


наибольшей суммой элементов. Вывести ее номер.
2. Дана вещественная матрица размерности n * m. По матрице получить логический вектор,
присвоив его k-ому элементу значение True , если выполнено указанное условие и значение False
иначе:
- все элементы k столбца нулевые;
- элементы k строки матрицы упорядочены по убыванию;
- k строка массива симметрична.
5 1. Дана квадратная матрица порядка N. В матрице вычислить среднее арифметическое
положительных элементов, стоящих на главной диагонали.
2. Дана вещественная матрица размерности n * m. Сформировать вектор b, в котором элементы
вычисляются как:
- произведение элементов соответствующих строк;
- среднее арифметическое соответствующих столбцов;
- разность наибольших и наименьших элементов соответствующих строк;
- значения первых отрицательных элементов в столбце.
6 1. Дана квадратная матрица порядка N. Вывести строку матрицы, в которой элемент, стоящий
на главной диагонали, максимален.
2. Дана вещественная матрица размерности n * m. Вывести номера столбцов, содержащих
только отрицательные элементы.
7 1. Дана матрица размерности N на M. Положительные элементы матрицы переписать подряд в
одномерный массив В.
2. Дана вещественная матрица размерности n * m. Вывести номера строк, содержащих больше
положительных элементов, чем отрицательных.

8 1. Дана матрица размерности N на M. Вычислить количество строк матрицы, в которых есть


хоть один отрицательный элемент.
2. Дана вещественная матрица размерности n * m. Найти общую сумму элементов только тех
столбцов, которые имеют хотя бы один нулевой элемент.

9 1. В квадратной матрице найти сумму элементов побочной диагонали и разделить на


полученную сумму все элементы последнего столбца.
2. Дана квадратная матрица порядка N. Найти количество четных элементов квадратной
матрицы, расположенных ниже побочной диагонали.

10 1. Дана матрица размерности N на M. Найти максимальный элемент и строку, содержащую этот


элемент, поменять с первой строкой. Полученную матрицу вывести построчно.
2. Дана вещественная матрица размерности n * m. Поменять местами строки с максимальным и
минимальным элементами.
Лабораторная работа №7
Функции

Цель работы
Ознакомиться с правилами работы с функциями на языке Си.
Содержание работы
 Изучить способы вызова функции, возврата из функции
 Написать на языке Си программу, состоящую из основной части и
функции, выполняющей определенную в задании задачу.
 Отладить программу, проверить правильность работы программы на
тестовых примерах.
Методические указания
Определение функции. Обращение к функции.
В отличии от Паскаля в Си нет разделения на процедуры и функции.
Имеются только функции, а если они ничего не возвращают, то есть являются
аналогом процедур в Паскале, то считается (и явно указывается), что они
возвращают значение пустого типа void.
Всякая программа обязательно включает в себя основную функцию с
именем main. Определение функции состоит из двух частей: заголовка и
тела. Заголовок определяет имя функции, ее тип и формальные параметры,
тело определяет действия над данными, выполняемые функцией.
Возвращаемое функцией значение передается в вызывающую программу
оператором return (выражение). Значение "выражения" и есть результат
функции (возвращаемого значения).
Если в программе функция физически следует за вызывающей ее
функцией main, то надо в последней объявить функцию внешней с помощью
описателя extern: extern int fun(); или еще проще int fun();. В противном
случае при компиляции будет выдана ошибка.
Всякая функция имеет вид:
Тип имя_функции (спецификация_параметров )
{тело_функции}
Тип_функции- это тип возвращаемого функцией результата. Если
функция не возвращает ни какого результата, то для нее указывается тип void.
Имя_функции- идентификатор, задаваемый программистом или main-
для основной функции.
Спецификация_параметров- это либо «пусто», либо список имен
формальных параметров функции с указанием типа для каждого из них.
Тело_функции- это либо составной оператор, либо блок. Признаком
блока является наличие описаний программных объектов (переменных,
массивов ит.д.), которые действуют в пределах этого блока. Блок, как и
составной оператор, ограничивается фигурными скобками.
 Тело функции не может содержать в себе определения других функций.
 Оператором возврата из функции в точку ее вызова является оператор
return. Он может использоваться в функциях в двух форматах: return; или
return выражение; В первом случае функция не возвращает никакого
значения в качестве своего результата. Во втором случае результатом
функции является значение указанного выражения. Тип этого выражения
должен совпадать с типом функции, либо относиться к числу типов,
допускающих автоматическое преобразование к типу функции. Оператор
return может в явном виде отсутствовать в теле функции. В таком случае его
присутствие подразумевается перед закрывающей тело функции фигурной
скобкой. Такая подстановка производится компилятором.
 Передача параметров при вызове функции происходит только по
значению, поэтому выполнение функции не может изменить значения
переменных, указанных в качестве фактических параметров.
 Формат обращения к функции (вызов функции) традиционный:
Имя_функции (список_фактических_параметров);
 Между формальными и фактическими параметрами при вызове функции
должны соблюдаться правила соответствия по последовательности и по
типам.
Пример1.
Является ли число простым?
Функция возвращает значение в момент выполнения оператора return,
причем (в отличии от Паскаля, где присваивание значения имени функции на
ход ее выполнения прямого действия не оказывает) при выполнении
оператора return происходит выход из функции.
На Паскале:
Function simple(n:integer):Boolean;
Var i:integer; sqrtn:real;
Begin
Simple:=true;
i:=2; sqrtn:=sqrt(n);
while (i<=sqrtn) and (n mod i<>0) inc(i);
if (n mod i=0) then simple:=false
end;
На Си:
//является ли число простым?
int simple (int n)
{ int i=2; float sqrtn=sqrt(n);
while((i<=sqrtn)&&(n%i)) i++
return (n%i);
Пример 2.
Функция, вычисляющая день недели по номеру.
void day (int n)
{switch (n)
{ case 1: printf(“\nПН”); break;
case 2: printf(“\nВТ”); break;
case 3: printf(“\nСР”); break;
case 4: printf(“\nЧТ”); break;
case 5: printf(“\nПТ”); break;
case 6: printf(“\nСБ”); break;
case 7: printf(“\nВС”); break;
default: printf( “\n функция day-ошибка в параметре”); break;
}
}
Пример 3.
Программа возведения числа в степень.
Составим функцию power(t,n); В нашей реализации функция power
предшествует головной программе, поэтому она предварительно не
объявлена. Описание формальных параметров функции происходит в
заголовке (int t,n;) Оператор int p=1; в теле функции определяет переменную
p целого типа и присваивает ей начальное значение равное 1. Обращение к
функции задает один из аргументов стандартной функции printf в программе
main. Выражение power(t,n) предписывает вызов функции. Когда программа
main достигает этой точки, то все управление передается функции power.
Операторы, содержащиеся в теле функции power фактически оперируют
данными. Когда достигается оператор return, осуществляется переход в ту
точку программы main, из которой мы пришли в power. Значение,
вычисляемое функцией power, передается в головную программу с помощью
оператора return(p).
/* Функция y=t**n */
int power(t,n);
int t,n;
{
int p=1;
while(n!=0)
{ if(n%2 !=0) p=p*t;
n=n/2; t=t*t;
}
return(p);
}
//Возведение в степень- головная программа
#include <stdio.h>
main()
{ int a,n;
printf("Введи a, n \n");
scanf("%d %d",&a,&n);
printf("%d в степени %d = %d",a, n, power(a,n));
}
Прототип функции.
Прототипирование- это предварительное объявление функций
(описание того, как выглядят их заголовки). При прототипировании имена
формальных параметров можно не указывать, компилятор интересует только
их тип.
Пример 4.
Требуется составить программу нахождения наибольшего значения
среди трех величин- max(a,b,c). Для ее решения можно использовать
вспомогательный алгоритм нахождения максимального значения из двух,
поскольку справедливо равенство: max(a,b,c)= max(max(a,b),с).
#include <iostream.h>
int MAX (int, int) //прототип функции MAX
void main() // Основная функция
{ int a,b,c,d;
cout<<”Введите а, в, с:”;
cin>>a>>b>>c;
d=MAX(MAX(a,b),c);
cout<<”\nMAX(a,b,c)=”<<d;
}
//Определение функции MAX
int MAX(int x, int y)
{ if (x>y) return x;
else return y;
}
Примерные вопросы для защиты

23. Определение функции.


24. Обращение к функции.
25. Найти ошибку в программе:
#include <iostream.h>
void main()
{ int a=1,b=2,c;
c=sum(a,b);
cout<<c;
}
Int sum(int x, int y);
{return x+y
}

Задачи для самостоятельного выполненияи"

1 1. Напишите программу вычисления площади поверхности и длины экватора на основе известного


радиуса планет солнечной системы. Форму планет будем считать шаром. Вычисление площади
поверхности и длины экватора оформите отдельными функциями.
2. Написать программу, вычисляющую доход по вкладу. Исходными данными для вычисления
являются: величина вклада, процентная ставка (годовых) и срок вклада (количество дней).
2 1. Напишите программу поиска большего из четырех чисел с использованием функции поиска
большего из двух чисел.
2. Напишите программу, состоящую из трех функций и основной программы. Первая функция
организует ввод двух целых чисел X и Y, вторая проверяет их сумму, третья выводи результат.
Используйте эти функции в основной программе. Используйте X и Y как глобальные переменные.
3 1. Даны координаты вершин многоугольника (x1, y1,x2,y2,…x10,y10). Напишите программу для
вычисления его периметра (вычисление расстояния между вершинами оформить функцией).
2. Напишите программу вычисления площади поверхности и длины экватора на основе известного
радиуса планет солнечной системы. Форму планет будем считать шаром. Вычисление площади
поверхности и длины экватора оформите отдельными функциями.
4 1. Напишите программу вычисления суммы: 1! + 2! + 3! + … + n!, используя функцию вычисления
факториала числа k.
2. Напишите программу поиска большего из четырех чисел с использованием подпрограммы поиска
большего из двух чисел.
5 1. Напишите программу для вычисления числа сочетаний из N по M. Число сочетаний определяется
по формуле N!/(M!*(N-M)!, где N – количество элементов перебора. Используйте подпрограмму
вычисления факториала.
2. Даны координаты вершин многоугольника (x1, y1,x2,y2,…x10,y10). Напишите программу для
вычисления его периметра (вычисление расстояния между вершинами оформить функцией).
6 1. Напишите программу, которая удаляет из введенной строки любой требуемый введенный с
клавиатуры символ. Процесс удаления выделите в отдельную функцию.
2. Дано простое число. Составить функцию, которая будет находить следующее за ним простое число.
7 1. Даны три целых числа. Определить, сумма цифр которого из них больше. Подсчет суммы цифр
организовать через функцию.
2. Составить программу, определяющую, в каком из данных двух чисел больше цифр.
8 1. Составить программу для вычисления площади кольца по значениям внутреннего и внешнего
радиусов, используя функцию вычисления площади круга.
2. Даны натуральные числа K и N. Составить программу формирования массива А, элементами
которого являются числа, сумма цифр которых равна K и которые не больше N.
9 1. Составить программу для вычисления суммы факториалов всех четных чисел от m до n.
2. Дан массив A(N) (N – четное).
Сформировать массив В(М), элементами которого являются средние арифметические соседних пар
рядом стоящих в массиве А чисел. (Например, массив А состоит из элементов 1; 3; 5; -2; 0; 4; 0; 3.
элементами массива В будут 2; 1,5; 2; 1,5).
10 1. Заменить отрицательные элементы линейного массива их модулями, не пользуясь стандартной
функцией вычисления модуля. Подсчитать количество произведенных замен.
2. Составьте программу, которая в массиве A[N] находит второе по величине число (вывести на
печать число, которое меньше максимального элемента массива, но больше всех других элементов).,
Лабораторная работа №8
Строки

Цель работы
Ознакомиться с правилами работы со строками на языке Си. Освоить
программирование задач обработки текстовых данных.
Содержание работы
 Изучить способы инициализации, вывода и ввода строк, работы со
строками.
 Написать на языке Си программу, выполняющую определенную в
задании задачу.
 Отладить программу, проверить правильность работы программы на
тестовых примерах.
Методические указания
Обработка символьных строк.
Символьные строки организуются как массивы символов, последним из
которых является символ /0, внутренний код который равен 0 на длину
ограничений нет.
Пример: char str [20];
Возможна инициализация
Пример: char S [10]=’строка’;
char S [ ]=’строка’;
char S [10]= {‘c’,’т’,’р’,’о’,’к’,’а’,’/0’};
S [5]=’а’;
Обработка строк связана с перебором всех символов от начало до
конца. Признаком конца такого перебора является обнаружение 0 символа.
Пример 1: Заменить все символы строки на * и подсчитать длину
строки.
// замена символов на *
# include <stdio.h>
# include <conio.h>
void main ( )
{char S[ ] = ‘fh 5 j’;
int i=0;
clrscr ( );
puts (S);
while (S[i])
{ S [i++]=’*’; puts (S);}
printf (‘\n,длина строки=’, i);
}
результат: fh 5 j
*h 5 j
** 5 j
** * j
** * *
длина строки =4
Цикл повторяет свое выполнения, пока S [i] не получит значение
нулевого символа.
puts(s)- функция для вывода строки на экран, s- имя строки, библиотека
stdio.h
gets(s)- ввод строки с клавиатуры, s- имя строки, в которую
производится ввод, библиотека stdio.h.
strlen (s) – функция определения длины строки s, библиотека обработки
строк string.h.
Пример 2:
ввести строку и перевернуть.
//обращение строки
# include <stdio.h>
# include <string.h>
void main ( )
{ char c, s [10];
int i;
printf (‘введите строку’);
gets (s);
for (i=0; i<=(strlen(s)-1)/2; i++)
{c=S[i]; S[i]=S [strlen (s) – i -1];
S[strlen(S) – i – 1] =c;}
printf (‘\n перевернутая строка :’);
puts(s);
}
Строка как параметр функции.
Имя строки является указателем - переменной, и следовательно его
значение может подвергаться изменению. В заголовках функций,
работающих со строками, рекомендуется явно использовать обозначение
символьного указателя.
Пример3:
Записать определения функции вычисление длины строки (аналог
стандартной strlen( )).
int length (char*s)
{int k;
for (k=0; *s++! =’\0’; k++);
return k;
}
Здесь: функция использует явный механизм работы с указателем.
Изменение значения указателя s допустимо благодаря тому, что он является
переменной. (для числовых массивов этого делать нельзя!)
Пример4:
оформить программу обращения строки в виде функции и написать
основную программу, использующую ее. Для определения длинны стоки не
будем пользоваться стандартной функцией. Для вывода строки на экран
применим функцию printf ( ) со спецификатором % S.
// обращение строки
# include <stdio.h>
# include <conio.h>
//прототипы функций
Int length (char*str);
// основная программа
Void main ()
{Char S [ ] = ‘1 2 3 4 5 6 7 8 9’;
clrscr ();
Invers (S);
// вызов функции обращение строки
printf (‘/n%S’, S);
}
// функция вычисления длины строк
Int length (char*e)
{Int R;
For (R=0; *S++! =’/0’: R++);
Return R;
}
// функция обращения строки
Void invers (char*e)
{Char C;
Int i, j, m;
m=length (e);
// вызов функции length
For (i=0, j=m-1; i<j; i++, j--)
{c=e[i]; e[i]=e[j]; e[j]=c}
}
в результате 9 8 7 6 5 4 3 2 1 0
здесь функция invers() работает аналогично паскалевой структуре.
Обмен параметрами через указатели имитирует обмен по имени.
Пример 5:
описать функцию вставки символа в строку. Параметры функции:
строка, позиция вставки, вставляемый символ use – эту функцию в основной
программе, где исходная строка, номер позиции и вставляемый символ
задаются вводом.
// вставка символа в строку
# include <stdio.h>
# include <string.h>
# include <conio.h>
void insert (char*str, int p, char c)
{int i;
for (i=strlen(str); i>=p; i--)
str [i+1]=str[i];
str[p]=c;
}
void main()
{char c, S[100]; int n;
clrscr();
puts(‘введите строку:’); gets (S);
puts(‘введите позицию вставки:’); scanf(‘%d’,&n);
scanf (‘введите символ:’); c=getche ();
insert (S,n,c);
puts (‘/n результат :’); puts(S);
}
результат: ввести строку 0 1 2 3 4 5 6 7 8 9
позицию вставки: 4
ввести символ: *
результат: 0 1 2 3 * 5 6 7 8 9

Задания для самостоятельного выполнения

1 1. Заменить в заданной строке первое вхождение слова «кот» на «пес».


2. Статистика. Дан текст. Напишите программу, определяющую процентное отношение строчных и
прописных букв к общему числу символов в нем.
2 1. Строка содержит дефис. Обменять местами части строки до и после дефиса.
2. Форматирование текста. Дан текст, состоящий из предложений, разделяемых точками. Напишите
программу, произво 00дящую следующее форматирование: после каждой точки в конце предложения
должен стоять хотя бы один пробел; первое слово в предложении должно начинаться с прописной
буквы.
Замечание. Текст может быть как на русском, так и на английском языке.
3 1. В строке имеется точка с запятой. Подсчитать количество символов до точки с запятой и после нее.
2. Статистика –Дан текст. Определите, каких букв (строчных или прописных) в нем больше, и
преобразуйте следующим образом: если больше прописных букв, чем строчных, то все буквы
преобразуются в прописные; если больше строчных, то все буквы преобразуются в строчные; если
поровну и тех и других – текст остается без изменения.
4 1. Удалить в сроке все находящиеся в ней пробелы
2. Дана строка. Преобразовать ее, удалив каждый символ * и повторив каждый символ, отличный от *.
5 1. Строка содержит одно слово. Проверить будет ли оно читаться одинаково справа налево и слева
направо, т.е. является ли оно полиандромом.
2. Лишние пробелы. Дана строка, состоящая из слов, разделенных пробелами. Напишите программу,
удаляющую лишним, если он:
 Стоит вначале строки;
 Стоит в конце строки;
 Следует за пробелом.

6 1. Заданы две строки. Напечатать те слова, которые встречаются в каждом из двух заданных
предложений.
2. Форматированный вывод числа. С клавиатуры вводится целое число в десятичной системе
счисления. Написать программу, реализующую вывод его представления с разделением на триады
цифр.
Пример.
Число: 100000
Форматированный вывод: 100 000
Число: 1000000
Форматированный вывод: 1 000 000

7 1. Дана строка, заканчивающаяся точкой. Подсчитать, сколько слов в строке.


2. Дано число в двоичной системе счисления. Проверить правильность ввода этого числа (в его записи
должны быть только символы 0 и 1). Если число введено неверно, повторить ввод. При правильном
вводе перевести число в десятичную систему счисления
8 1. Дана строка. Подсчитать, сколько в ней символов *, ;, :.
2. В символьном массиве хранятся фамилии и инициалы учеников класса. Требуется напечатать
список класса с указанием для каждого ученика количества его однофамильцев
9 1. Дана строка, содержащая текст. Найти длину самого короткого слова и самого длинного слова.
2. Из заданной символьной строки выбрать те символы, которые встречаются в ней только один раз, в
том порядке, в котором они встречаются в тексте.
10 1. Дана строка. В строке заменить точку с запятой на двоеточие.
2. Результаты вступительных экзаменов представлены в виде списка из N строк, в каждой строке
которого записаны фамилия студента и отметки по каждому из M экзаменов. Определить количество
абитуриентов, сдавших вступительные экзамены только на «отлично».
11 1. В строке удалить символ двоеточие. Подсчитать количество удалений.
2. Двумерный массив n x m содержит некоторые буквы русского алфавита, расположенные в
произвольном порядке. Написать программу, проверяющую, можно или из этих букв составить данное
слово S. Каждая буква массива используется не более одного раза.
12 1. В строке вместо пробелов вставить запятую и пробел.
2. Даны две строки А и В. Составьте программу, проверяющую, можно ли из букв, находящих в А,
составить В ( буквы можно использовать не более одного раза и можно переставлять).
Например, А: ИНТЕГРАЛ; В: АГЕНТ – составить можно; В: ГРАФ – составить нельзя.
13 1. Удалить часть символьной строки, заключенной в скобки (вместе со скобками).
2. Строка, содержащая произвольный русский текст состоит не более чем из 200 символов. Написать ,
какие буквы и сколько раз встречаются в этом тексте. Ответ должен приводиться к грамматически
правильной форме, например a – 25, к – 3 раза и т.д.
14 1. Определить сколько раз в строке встречается заданный символ.
2. Дана строка содержащая текст. Найти длину самого короткого слова и самого длинного слова.
15 1. Дана строка, содержащая текст. Заменить все точки в строке на многоточие.
2. Дана строка, содержащая текст, заканчивающийся точкой. Вывести на экран слова, содержащие три
буквы.

Оценить