Файл: Могилев А.В. Информатика.pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 31.03.2021

Просмотров: 6821

Скачиваний: 51

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

321 

#include<stdio.h> 
main() 

int x,y; 
scanf("\n%d",&x); scanf("\n%d",&y) ; 
while (x!=y) 

if (x>y) x=x-y; else y=y-x; 

printf("\n%d",x); 

Пример

 2.

 Проверить, содержит ли квадрат натурального числа n цифру 3.  

 

Программа 92

 

#include<stdio.h> 

main() 

int i,n,a; 
scanf("%d",&n); n=n*n; i=10000; 
while(i>=l)  

a=n/i; /* если результат целочисленного деления n/i 

меньше 1,то а=0 */  

n=n-a*i; 
if(a==3) goto abc; else i=i/10; 

)  

printf("цифры 3 в числе n^2 нет"); 
goto cd; 
abc: printf("цифра 3 в числе n^2 есть"); 
cd: ; 

 
Оператор цикла do/while 
 

В языке Си имеется также конструкция цикла с постусловием (условие на выходе), где ис-

тинность условия проверяется после выполнения каждой итерации цикла. Этот подход реализует-
ся с помощью цикла do/while. 

Тело цикла do/while всегда выполняется по крайней мере один раз, поскольку проверка ус-

ловия осуществляется только после его завершения. 

Форма записи: 
 
do <оператор>  
while (<выражение>); 
 

Оператор break 
 

Оператор break дает возможность выйти из операторов цикла for, while, do/while, а также из 

переключателя switch без проверки условия. Оператор break приводит к немедленному выходу из 
самого внутреннего охватывающего его цикла или из переключателя. 

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

разных условия прекращения его работы. 

 
Программа 93

 

# include<stdio.h> 
main() 

int x=l,y,z; 


background image

 

322 

printf("Мы будем вычислять значение функции y=2*x+z\n"); 

printf("Введите значение z:"); scant("%d",&z); 
while(x<1000)  

     y=2*x+z;x++; if y=100 ( printf(= 100\n"); break; }  
} if y=100 

printf("Цикл закончен!!!") ; 

else printf ("Цикл закопчен!!! Но y<>lOO."); 

 
Наличие  оператора  break  позволяет  использовать  «бесконечные  циклы».  В  ряде  случаев 

весьма удобно записать заголовок цикла без всякого условия в виде 

 

for(;;), 
 

а выход из цикла оформить с помощью операторов break. 

 

Оператор продолжения continue 

 
Оператор continue вызывает преждевременное завершение выполнения тела цикла и пере-

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

 
Программа 94

 

#include<stdio.h> 
main() 

int x,y,z; 
printf("Мы будем вычислять значение функции y=2*x+z\n"); 
printf("в промежутках [1;6] и [13;18]."); 
printf("Введите значение z

= "};

 scant("%d",&z) ; 

for(x=l;x<18;x++)  

if ((x>6) and (x<13)) 
continue; 
y=2*x+z; printf(= %d, у= %d",x,y); 

}  

 
Оператор безусловного перехода goto 
 

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

программы. Его выполнение заключается в передаче  управления оператору, помеченному задан-
ной меткой. 

В качестве метки используется идентификатор. Метка отделяется от оператора, к которому 

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

Форма: 
 
goto <метка>;...  
<метка>: <оператор> 
 

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

 
Символы "{" и "}" используются для объединения описаний и операторов в составной опе-


background image

 

323 

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

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

(при необходимости его используют в качестве «внутреннего» оператора в операторах ветвления и 
цикла). Он называется также «блоком». Блоки не могут быть вложенными. 

 

Пример /*

 I -й вариант */ 

 

Программа 95

 

#include<stdio.h>  
main() 

int sam,index=0; 

/*  В  цикл  включен  только  оператор  присваивания.  Печать  данных  */ 

/* будет произведена только один раз - после завершения цикла */ 

while(index++<10)  
sam=10*index+2; 
printf("sum= %d\n",sam) ; 

)  

Результат работы программы: 
 
sam = 102 
 
 /* II -й вариант */  
 

Программа 96

 

 
#include<stdio.h>  
main () 

int sam,index=0; 
/* Наличие фигурных скобок гарантирует, что оба оператора */  
/* являются частью цикла while, и печать результатов будет */ 

/* производиться на каждом шаге работы цикла. Весь составной*/  
/* оператор рассматривается как один оператор, являющийся */  
/* составной частью оператора while. */  
while(index++<10)  

sam=10*index+2; printf("sum = %d\n",sam); 

}  

Результат работы программы: 
 
sam = 12  
sam = 22  
sam = 32  
sam = 42  
sam = 52  
sam = 62  
sam = 72  
sam = 82  
sam = 92  
sam = 102 
 


background image

 

324 

Пустой  оператор

  состоит  только  из  точки  с  запятой  (;)  и  используется  для  обозначения 

пустого тела управляющего оператора. 

 

6.5. СТРУКТУРА ПРОГРАММЫ НА СИ. ПОНЯТИЕ О ФУНКЦИЯХ 

 

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

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

 
Тип_функцни Имя (<список аргументов>)  
<описания аргументов> 

{

 

<описания> 
<операторы>  

 
Отметим, что список аргументов может быть пустым (однако, скобки после имени функции 

сохраняются). В этом случае, естественно, нет и их описаний. 

Имеется  одна  главная  функция  (с  именем  main),  с  которой  начинается  выполнение  про-

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

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

описан (даже если это неопределенное значение) вместе с описанием переменных. 

Пример.

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

ментов» 15 раз, используя функции. 

 

Программа 97 

#include<stdio.h> 
main () 

int i,print() ; 

for (i=l;i<=15;i++) print(); 

print() /* вызываемая функция без аргументов */ 

)  

printf ("Простая функция без аргументов\n»); 

 
Аргументы  передаются  по  значению  путем  копирования  в  соответствующие  (по  порядку) 

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

Следует различать формальные аргументы, используемые при описании функций, и факти-

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

Пример:

  программа  98,  которая 

находит числа х, у, z, принадлежащие отрезку [1;20] и удовлетворяющие условию x^2 = у^2 + z^2

 


background image

 

325 

Программа 98 

#include<stdio.h> 
main() 

int х, у, z, zero() ; 
char p, q, ch() ; 
x=2; y=45; z=0; 
q=’o’; 
printf("х» "); zero(x); 

printf("x+y+(x+y)^z= "); zero(x+y+(x+y)^z) ; 

printf("q= "); ch(q); 


int zero(u) 
int u; 

printf("%d\n",u); 


char ch(u) 
char u; 

printf("%c\n",u); 

Результат работы программы: 
 
x=2 
x+y+(x+y)^z= 94  
q=0 
 

Программа 99 

#include<stdio.h> 
main() 

int x,y,z; 
int zero(); 
printf("Следующие величины могут быть сторонами прямоугольного тре-
угольника:\n"); 
for (х=1;х<=20;х++) 
for (у=1;у<=20;у++) 
for (z=l;z<=20;z++) 
if (y*y+z*z==x*x) 

zero(x,у,z); 


int zero(f,g,h) 
int f,g,h; 

printf ("x= %d, y= %d, 2=%d\n",f,g,h); 

Результат работы программы: 
 
следующие величины могут быть сторонами прямоугольного треугольника 
х= 5, у= 3, z= 4 
х= 5, у= 4, 

z=

 3 x= 10, y= 6, z= 8  

x= 10, y=8, z=6 x= 13, y=5, z= 12  
x= 13, y= 12, z= 5 x

=

 15, y= 9, z= 12  

x= 15, y= 12, z=9 x=17, y=8, z=15 x= 17, y= 15, 
z=8 x=20, y=12, z=16  
x=20, y= 16, z= 12