книги / Язык Си
..pdfТаким образом, оператор goto позволяет сразу перейти в лю бое место программы в пределах текущей функции (пока мы рабо таем только в одной функции - main). Однако частое использова ние произвольных переходов приводит к получению запутанных, плохо структурированных программ, по тексту которых трудно понять порядок исполнения и взаимозависимость фрагментов кода.
Одним из разумных применений оператора goto является бы стрый выход из вложенных циклов (поскольку break тут не помо жет, так как он сможет осуществить выход только из текущего цикла).
fo r ( i=0;i<n;i++) { .
f o r (j=0;j<m;j++) { .
f o r (k=0; k< z; k++)
{ .
--------goto HI;
}
}
6.4. Оператор return
Оператор return имеет два варианта использования:
1. Вызывает немедленный выход из текущей функции и воз врат в вызывающую программу. Формат использования оператора return в этом случае следующий:
return;
2. Возвращает значение выражения в точку вызова функции. Формат использования:
return выражение;
Для функции main оператор return передает управление опе рационной системе, возвращая ей целое значение (значение, рав ное нулю, указывает на то, что программа завершилась успешно).
Пример. Написание функции для вычисления суммы двух чисел.
#include<stdio.h>
#include<conio.h>
int sum(int a, int b)
{
return a+b;
main()
{int a=12, b=58;
printf ("S=%d" ,sum (a,b) ); getch();
return 0;
}
Здесь помимо привычной функции main мы создали свою собственную функцию sum, в которую передаем значения пере менных а, Ь. Функция принимает эти значения и оператором return возвращает в точку вызова результат выражения а + Ь. Точкой вы зова функции sum является поле аргумента в функции printf. Та ким образом, это будет соответствовать записи
printf ("S=%d" ,a+b) ;
Более подробно применение оператора return рассмотрено при работе с функциями (см. лекцию 9).
Задача 1. Найти все целые числа на отрезке от 1 до 300, у которых ровно пять делителей.
Используем вложенные циклы. Во внешнем цикле перебира ем числа от 1 до 300, текущее число храним в переменной /. Во внутреннем цикле ищем делители текущего числа /. Поскольку любое число делится само на себя и на 1, то переменная S, в кото рую будем подсчитывать делители, будет начинаться не с 0, а с 2 (уже два делителя подсчитали). Для обозначения текущего числа, которое может быть делителем для /, используем переменную j. Делитель не может превышать //2, т.к. результат точно будет дробным числом. Таким образом, j будет меняться от 2 до //2 включительно. Если j является делителем /, то остаток от их цело численного деления равен 0. В этом случае подсчитываем дели тель (переменную S увеличиваем на 1). Если число подсчитанных в S делителей больше 5, то нет смысла дальше перебирать пере меннуюj. Для прерывания цикла поj применим оператор break.
#include<conio.h> |
|
|
||
#include<stdio.h> |
|
|
||
main() |
|
|
|
|
{int i,j,S; |
|
|
|
|
for(i=l;i<=300;i++) |
S для |
накопления |
||
{S=2; //инициализируем |
||||
//новой |
суммы |
|
|
|
for(j=2;j<=i/2;j++) |
j является делителем i, |
|||
{if(i%j ==0) |
//если |
|||
S++; |
|
//делаем подсчет |
||
if(S>5) |
//если делителей |
больше 5, |
||
break; |
//прерываем цикл |
|
}
if(S==5) |
//если делителей |
ровно |
5, |
printf(M%d\n",i); |
//напечатаем это |
число |
|
}
getch(); return 0;
}
Задача 2. Найти 100 первых простых чисел.
Простое число - это число, которое делится без остатка толь ко на 1 и на себя. Таким образом, нужно находить числа, у кото рых ровно два делителя. Программа во многом схожа с предыду щей, только сами числа / будут меняться от 2 (так как 1 не являет ся простым числом) до бесконечности, а параметром внешнего цикла будет являться переменная п, в которую будет подсчиты ваться количество найденных простых чисел. Внешний цикл про должаем до тех пор, пока п меньше 100.
#include<conio.h>
#include<stdio.h> main()
{int i=2,j,n=0,s;
while(n<100)
{s=2; for(j=2/j<=i/2;j++)
if(i%j==0) //если есть еще делитель, {s++; //подсчитываем его
break; //и выходим из цикла, так как s>2
}
if(s==2)
{printf("%2d: %5d\n",n+l,i); n++;
i++;
}
getch(); return 0;
}
1. Подсчитайте вручную, а затем проверьте на компьютере, чему равна переменная а после выполнения данного кода:
int i,j,a=0;
for(i=0,j=5; i<3; i++,j— )
{if(i>j)
continue;
a++;
}
2. Подсчитайте вручную, а затем проверьте на компьютере, чему равна переменная а после выполнения данного кода:
int i,j,a=l,b=2;
for(i=0; i<3; i++)
{a+=b+i;
for(j=0; j<5; j++)
if (a>j)
{b++;
continue;
}
}
3. Подсчитайте вручную, а затем проверьте на компьютере, чему равна переменная а после выполнения данного кода:
int i,j,a=0;
for(i=0,j=5; i<10; i++,j — )
{if(i>j)
break;
a++;
}
4. Подсчитайте вручную, а затем проверьте на компьютере, чему равна переменная а после выполнения данного кода:
int i,j,a=l,b=2;
for(i=0; i<3; i++)
{a+=b+i;
for(j=0; j<5; j++)
if(a>j)
{b++;
break;
}
}
5. Подсчитайте вручную, а затем проверьте на компьютер чему равна переменная S после выполнения данного кода:
int i,j,а=1,b,S=14;
for(i=0; i<3; i++)
{for(j=0,b=5; j<2; j++)
if(i>j)
{do {b— ; a++;
}while(b!=a);
break;
}
else
S+=b+a;
ЛЕКЦИЯ 7. МАССИВЫ
Массив - это набор данных одного и того же типа, собранных под одним именем.
7.1. Объявление массивов
Основная форма объявления массива:
тип имя массива [размер1][размер2]... [размер N]
Тип - один из базовых типов {char, int, float, double).
Имя массива выбирается по тем же правилам, что и любая переменная (см. лекцию 1).
Количество открывающих и закрывающих квадратных скобок соответствует числу степеней свободы массива, т.е. одномерный массив - одна пара: {размер 1]; двумерный массив - две пары:
[размер 1] [размер 2] и т.д.
Размер - это количество элементов в направлении степени свободы, т.е. это всегда число типа int.
■ Размер массива может быть только константой или константным выражением. Нельзя использовать переменные для задания размера массива.
int а=5;
int b[a]; //ОШИБКА, потому что а - это
//переменная
int с [5]; //ПРАВИЛЬНО, потому что 5 - это
//константа
Нельзя задавать массив переменного размера. Для этого есть специальный механизм, называемый динамическим выделением памяти (будет рассмотрен в лекции 10), а пока будем работать со статическими массивами.
Чаще всего используются одномерные массивы (вектор) или двумерные массивы (матрица).
Пример. Объявление одномерного массива.
float а [5];
Одномерный массив из пяти элементов можно представить в виде строки
а 0 |
a i |
а 2 |
а 3 |
а 4 |
или в виде столбца
а0 a i
а2
а3
а4
Пример. Объявление двумерного массива.
float а [3] [4] ;
Данный двумерный массив можно представить в виде трех строк и четырех столбцов:
ао,о |
а о д |
а о д |
ао,з |
a i ,o |
а 1Д |
|
а 1,3 |
а 2,о |
а 2,1 |
а 2 , 2 |
а 2,з |
Массивfloat я[4][3] имеет четыре строки и три столбца:
^0,0 |
а о д |
а о,г |
a i,o |
а 1Д |
а 1д |
^2,0 |
а 2д |
а 2,2 |
аз,о |
а з д |
а з , 2 |
Каждый элемент массива определяется именем массива и по рядковым номером элемента, который называется индексом. Ин декс - всегда целое число (тип inf).
■ Индексация массивов всегда начинается с нуля (первый элемент массива имеет индекс 0).
Если мы объявили массив int я[100], это значит, что массив содержит 100 элементов от а[0] до а[99].
В оперативной памяти массив занимает непрерывный уча сток. Память под массив выделяется по формуле
количество байтов = размер базового типа * количество элементов
Под массивfloat а[5] будет выделено 4*5 = 20 байт. Под массивfloat я[3][4] будет выделено 4*12 = 48 байт.
Пример. Вывести на экран заданный элемент массива.
int i,a[7]={-10,4,0,7,-3,15,6};
printf("Введите номер элемента: ");
scant("%d",&i);
printf (,,%d",a [i] );
7.2. Инициализация массивов
Инициализировать массивы, т.е. задавать им начальные зна чения, можно в процессе объявления:
float z [5]={1.1, 2, -6, 0, 0.18};
Список инициализаторов указывается в фигурных скобках {}. Данный массив можно представить в виде строки
Индексы ячеек - это индексы элементов
0 |
1 |
2 |
3 |
4 |
1.1 |
2 |
-6 |
0 |
0.18 |
\ |
| |
| |
1 |
/ |
Значения в ячейках - это элементы массива
или в виде столбца
01.1
12
2- 6
3О
40 . 1 8
Для двумерных массивов инициализация имеет вид
int а [3] [4]={{1,2,-1,6},{4,7,0,9},{0,12,4,5}};
1 |
2 |
- 1 |
6 |
4 |
7 |
0 |
9 |
0 |
12 |
4 |
5 |
Также массивы можно инициализировать через непосредст венное обращение к каждому элементу массива:
int а [3] [3] ;
а[0][0]=4;
а [ 0 ] [1]=1;