- •Министерство образования Республики Беларусь
- •Часть 1.Методически указания по курсу “Вычислительная техника и программирование
- •Содержание
- •Лабораторная работа №1 Линейный вычислительный процесс Цель работы
- •Операторы вывода информации
- •1. Формат, указывающий компилятору вид выводимой информации, признаком формата является символ %.
- •2. Управляющие символы:
- •Стандартные математические функции
- •Варианты индивидуальных заданий
- •Варианты индивидуальных заданий
- •Циклы типа while и do – while
- •Вложенные циклы
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Лабораторная работа №4 Массивы в языке с
- •Многомерные массивы
- •Контрольные вопросы
- •Лабораторная работа №5 Функции пользователя
- •Область действия переменных
- •Контрольные вопросы
- •Лабораторная работа №6 строки и структуры
- •Краткие теоретические сведения
- •Контрольные вопросы
- •Лабораторная работа №7 Файлы в языке с
- •Краткие теоретические сведения
- •Посимвольный ввод-вывод
- •Построчный ввод-вывод
- •Блоковый ввод-вывод
- •Контрольные вопросы
- •Лабораторная работа №8 Графический режим работы в языке с
- •Kраткие теоретические сведения
- •Функции для подготовки графической системы
- •Основные функции для получения изображения
- •Варианты индивидуальных заданий
- •Контрольные вопросы
- •Задание опций интегрированной среды
- •Набор текста программы
- •Компиляция, редактирование связей, запуск программы на выполнение
- •Многофайловая компиляция
- •Отладка программы
- •Использование глобальных переменных, объявленных вне файла
- •Литература
- •Учебное издание
Область действия переменных
Область действия переменной – это правила, которые устанавливают, какие данные доступны из текущего места программы. Имеются три типа переменных: глобальные, локальные и формальные. Область действия локальных переменных – это те блоки, где локальные переменные объявлены. При выходе из блока локальная переменная и ее значение теряются.
Формальные переменные – это параметры в заголовке функции пользователя. Формальные параметры используются в теле функции так же, как локальные переменные. Область действия формальных параметров – блок, являющийся телом функции.
Глобальные переменные объявляются вне какой-либо функции. Глобальные переменные могут быть использованы в любом месте программы, но перед их первым использованием они должны быть объявлены и проинициализированы. Область действия глобальных переменных - вся программа с момента их объявления.
В языке С каждая переменная принадлежит к одному из четырех классов памяти – автоматическая (auto), внешняя (extern), статическая (static), регистровая (register). Тип памяти указывается ключевым словом (auto, extern, static, register), стоящим перед спецификацией типа переменной. Например, register int a;
По умолчанию (если класс памяти для переменной не указан) переменная относится к классу auto и будет размещена в стеке.
В языке С аргументы при стандартном вызове функции передаются по значению, т.е. в стеке выделяется место для формальных параметров функции и в это выделенное место при ее вызове заносятся значения фактических аргументов. Затем функция использует и может изменять эти значения в стеке. Но при выходе из функции измененные значения теряются. Вызванная функция не может изменить значения переменных, указанных как фактические аргументы при обращении к данной функции. В случае необходимости функцию можно использовать для изменения передаваемых ей аргументов. В этом случае в качестве аргумента необходимо в вызываемую функцию передавать не значение переменной, а ее адрес. А для обращения к значению аргумента-оригинала использовать операцию «*».
Примерфункции, в которой меняются местами значения аргументов x и y:
void z1(int * x, int * y)
{ int t=*x;
*x=*y;
*y=t;
}
Участок программы с обращением к данной функции :
int a=2, b=3;
void z1(int*, int*);
…
printf(“\n a=%d, b=%d”, a, b);
z1(&a, &b);
printf(“\n a=%d, b=%d”, a, b);
…
При таком способе передачи в вызываемую функцию аргументов их значения теперь будут изменены, т.е. на экран монитора будет выведено:
a=2, b=3
a=3, b=2
В языке С функции могут вызывать сами себя. В этом случае функция называется рекурсивной.
Примеррекурсивной функции – вычисление факториала числа n!=1*2*3*…*n:
fac(int n)
{
int b;
if (n= =1) return 1;
b=fac (n-1)*n;
return n;
}
Вызов функции в рекурсивной функции не создает новую копию функции, а создает новые копии локальных переменных и параметров. Из рекурсивной функции надо предусмотреть выход, иначе через некоторое время работы с такой рекурсивной функцией система «зависает».
На функцию, как и на другой объект, можно создать указатель. Например, указатель р на функцию, возвращающую значение типа type и имеющую параметры типа type t, type z, объявляется следующим образом:
type (*p)(type1 t1, type2 t2);
В заключение рассмотрим передачу в функции одномерных и двумерных массивов:
Передача одномерного массива:
void main (void)
{
int vec [2Q];
…
fun(vec);
…
}
void fun(vec_pav)
int vec_pav [ ];
{
…
}
Передача двумерного массива:
void main(void)
{
static int mos [2][3]={{1,2,3}, {4,5,6}};
…
fun (mos);
…
}
vooid fun(mos_per)
{
int_mos_per [ ][3];
…..
}
Пример работы с функциями
Следующая программа запрашивает элементы целочисленного массива размером 3Х3 и передает сформированный массив в пользовательскую функцию, которая подсчитывает сумму его положительных значений.
#include <stdio.h>
#include <conio.h>
void summa(int a1[ ][3]);
void main(void)
{
int a[3][3];
int i,j;
clrscr();
printf("\n Введите девять целых чисел \n");
for(i=0; i<3; i++)
for(j=0; j<3; j++)
{
printf("\n a[%d][%d]=", i, j);
scanf("%d", &a[i][j]);
}
summa(a);
}
void summa(int a1[ ][3])
{
int i,j,s;
puts(" ФУНКЦИЯ summa ");
puts("----------------------------------");
/* ВЫЧИСЛЕНИЕ СУММЫ ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ МАССИВА */
s=0;
for (i=0; i<3; i++)
{
printf("\n");
for (j=0;j<3;j++)
{
if (a1[i][j]>0)
{
s=s+a1[i][j];
}
}
}
printf("\a СУММА ПОЛОЖИТЕЛЬНЫХ ЭЛЕМЕНТОВ\
МАТРИЦЫ =%d, Press any key... ",s);
getch();
}
Варианты индивидуальных заданий
1. Даны три натуральных числа. Определить их наибольший делитель (определение HOD – см. N 10).
2. Даны отрезки a,b,c,d. Для каждой тройки этих отрезков, из которых можно построить треугольник, вычислить площади треугольников. Площадь треугольника , где.
3. Дано натуральное число N. Определить, если это возможно, пару x,y таких натуральных чисел, что .
4. Дано натуральное число N. Определить все пары x,y натуральных чисел, таких, что ,.
5. Даны действительные числа x,y (x>0, y>1). Получить целое число K (положительное, отрицательное или равное нулю), удовлетворяющее условию <.
6. Дано натуральное число N (N > 99). Определить число сотен в нем.
7. Дано натуральное число N (N 99).Выяснить, верно ли, что N2 равно кубу суммы цифр числа N.
8. Дано натуральное число N (N > 10000). Определить сумму цифр первых K разрядов числа N (K 4).
9. Даны натуральные числа n,m. Получить произведение m последних цифр числа n.
10. Даны натуральные числа n,m. Найти наибольший общий делитель n и m (наименьшее общее кратное n и m), используя алгоритм Евклида.
Пусть n и m – одновременно не равные нулю целые неотрицательные числа и пусть m n. Тогда, если n = 0, то NOD (n,m) = m, и если n ≠ 0, то для чисел m, n, r, где r остаток от деления m на n, выполняется равенство NOD (m,n) = NOD (n,r). Например, NOD (15,6) = =NOD (6,3) = NOD (3,0) = 3.
11. Даны натуральные числа a,b,c,d. Вычислить f(a)·f(b)+f(c)f(d), где
12. Дано натуральное число N. Удалить из записи числа N цифры 0 и 5, оставив прежним порядок остальных цифр. Например, из числа 59015509 должно получиться число 919.
13. Дано натуральное число N. Получить все такие натуральные K, что N делится на K2 и не делится на K3.
14. Даны натуральные целые числа n и m, вычислить A(n,m), где
15. Натуральное число из n цифр является числом Армстронга, если сумма его цифр, возведенных в n-ю степень, равна самому числу (как, например, 153=13+53+33 ). Получить все числа Армстронга, состоящие из двух, трех и четырех цифр.
16. Имеется n населенных пунктов, перенумерованных от 1 до n (n=10). Некоторые пары пунктов соединены дорогами. Определить, можно ли попасть по этим дорогам из первого пункта в n-й пункт. Информация о дорогах задается в виде последовательности пар чисел i и j ( i<j ) указывающих, что i-й и ј-й населенный пункт пункты соединены дорогой. Признак окончания этой последовательности – пара нулей.
17. Напечатать все цифры числа 2500 и числа 1!+2!+…+100!
18. Даны координаты вершин двух треугольников. Определить, какой из них имеет большую площадь.
19. Три прямые на плоскости заданы уравнением akx+bky=ck (k=1,2,3). Если эти прямые попарно пересекаются и образуют треугольник, тогда найти его площадь.
20. Два простых числа называются «близнецами», если они отличаются друг от друга на 2 (например, числа 41 и 43). Напечатать все пары «близнецов» на отрезке [n,2n], где n – заданное целое число, больше 2.
21. Ввести целое натуральное число N. Сформировать треугольник Паскаля по алгоритму:
C00
C10 C11
C20 C21 C22
C30 C31 C32 C33
C40 C41 C42 C43 C44
………………………..
Здесь , где n!=1·2·3·….·n – факториал числа n.
22. «Ханойская башня». Имеются три колышка A,B и C и n дисков разного размера, перенумерованных от 1 до n в порядке возрастания их размеров. Сначала все диски надеты на колышек A так, как показано на рис.1,а. Требуется перенести все диски с колышка A на колышек С (рис.1,в), соблюдая при этом следующие условия:диски можно переносить только по одному, больший диск нельзя ставить на меньший.
23. Написать программу, которая печатает последовательность действий (в виде «перенести диск с q на r», где q и r – это А,В или С), решающую указанную задачу для n дисков, где n- заданное натуральное число. (При правильном переносе n дисков с А на С обязательно встретится конфигурация, показанная на рис.1,б).
А В С А В С А В С
а) б) с)
Рис. 1
24. «Задача о 8 ферзях».На шахматной доске расставить 8 ферзей так, чтобы они не «били» друг друга (всего существует 92 расстановки).
25.«Метод фон Неймана». Дано n вещественных чисел. Упорядочить их по неубыванию:образовать два массива А и В и записать исходные числа в А; упорядочить пары соседних чисел (А1 и А2, А3и А4и т.д.) и записать их в В; взять из В по две соседние упорядоченные пары и, слив их в упорядоченные четверки, снова записать в А; затем каждые две соседние четверки из В слить в упорядоченные восьмерки и перенести в А и т.д.
26. Даны два массива чисел X и Y размером 100 элементов. Составить программу, меняющую последовательно местами значения элементов xkи yk, не используя промежуточных величин.
27. Дана последовательность из N целых чисел, среди которых нет двух одинаковых. Требуется вычеркнуть минимально возможное количество чисел, так чтобы оставшиеся числа шли в порядке возрастания.
28. Имеется 9 карточек, на которых написаны цифры 1,2,3,4,5,6,7,8,9 (по одной цифре на каждой карточке). Из этих карточек составляются два числа. Первое число – это числитель дроби, а второе число – это знаменатель дроби. Каждая карточка должна быть обязательно использована. Знаменатель дроби состоит из пяти цифр. Например, числитель – 6729, знаменатель – 13458 (все карточки использованы). Дробь 6729/13458 в точности равна ½.
29. Ввести два натуральных числа N и M. Найти такую комбинацию карточек (если она существует), которая образовала бы дробь, равную в точности N/M. Если комбинация не единственная, то вывести их все.