Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги / Язык Си

..pdf
Скачиваний:
6
Добавлен:
20.11.2023
Размер:
7.64 Mб
Скачать

Таким образом, оператор 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;