Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
отчет по срсп.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
180.74 Кб
Скачать

Работа с текстовой информацией и с массивами

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

Краткие теоретические сведения

Оператор while

Оператор while используется для организации цикла, который повторяется до тех пор, пока проверяемое выражение не станет ложным, или нулем. Оператор while задает цикл с предусловием, решение о прохождении цикла принимается до входа в цикл. Поэтому возможно, что цикл никогда не будет пройден.

Общее описание:

while (выражение1) оператор1;

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

Пример:

y=x; //возведение x в степень num while ((num--) > 0) y*=x;

Оператор do-while

Оператор do-while создает цикл, который повторяется до тех пор, пока выражение, проверяющее условие, не станет ложным, или нулем. Оператор do-while является циклом с постусловием; после прохождения цикла принимается решение, проходить ли его еще раз. Поэтому цикл выполнится хотя бы один раз.

Общее описание:

do

оператор while (выражение);

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

Пример:

do

{

printf ("\n Введите целое число от 1 до 100 >");

scanf ("%d",&num); } while (num<1 || num>100);

}

Оператор for

В операторе for для управления циклом используются три выражения, разделенные символом "точка с запятой". Общее описание оператора for:

for (инициализация; проверка условия; коррекция) оператор;

Инициализирующее выражение выполняется один раз, до выполнения любого из операторов цикла. Если проверяемое выражение является истинным, то цикл должен быть пройден один раз. По окончании первой итерации выполняется корректирующее выражение, а затем снова проверяется условие. Если оно истинно, то выполняется следующая итерация, и так далее, пока проверяемое условие не станет ложным.

Любое из трех перечисленных выражений (инициализация, проверка, коррекция) может отсутствовать. Этим можно добиться разнообразных эффектов, в частности, задавать вечные циклы.

Гибкость использования цикла for увеличивает операция "запятая". Она позволяет включать в спецификацию for несколько инициализирующих или корректирующих выражений.

Примеры:

for (num=1; num<=6;num+=2)

printf ("\n %5d %5d", num, num*num*num); for (num=1;num<=6;

printf("\n %5d %5d",num,num*num*num),num+=2); for (ch='a';ch<='z';ch++)

printf ("\n Символ %c, код ASCII %u",ch,ch);

for (;;)

printf ("\n Вечный цикл");

Управление ходом выполнения программы с помощью операторов goto, break, continue

Оператор goto вызывает передачу управления оператору, помеченному указанной меткой. Помеченный оператор может находиться до или после операторов goto. Метка должна быть составлена по правилам, принятым для имен переменных, и отделяться двоеточием.

Пример:

if (i!=0) goto label1;

i++;

label1: printf ("%d",i);

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

Оператор continue применяется с любым из трех операторов цикла. Выполнение оператора приводит к тому, что для операторов for и while начинается новая итерация, а для do-while производится проверка условия выхода, в зависимости от результатов которой выполнение цикла может быть прервано или продолжено далее.

Указатели

В языке Си для описания указателей используется знак операции косвенной адресации *, а также приводится тип данных, с которым будет связан указатель. Примеры описания указателей:

int y, x=9;

int *p1=&x; // Указатель на int, p1 указывает на x

int **p2=&p1; // Указатель на указатель на int, // p2 указывает на p1

Над указателями определены пять операций:

- присваивание;

- косвенная адресация (*), или получение значения, хранящегося по адресу, на который ссылается указатель;

- взятие адреса (&) с целью получения адреса указателя;

- увеличение (++) или уменьшение (--), означает перемещение указателя на n байт в сторону увеличения или уменьшения адресов; значение n соответствует количеству байт памяти, отводимых для единицы типа данных, с которым связан указатель;

- разность.

Выполнять над указателями операции отношения не рекомендуется, поскольку результат может быть некорректным.

Для указателей зарезервировано специальное значение - NULL, соответствующее пустому указателю. Обращения по этому адресу компилятором не отслеживаются, вся ответственность возлагается на программиста.

Массивы и строки

Общее описание одномерного массива в языке Си:

тип элемента имя массива [количество элементов];

Для обращения к отдельному элементу массива используется операция индексирования []. Особенностью языка Си является то, что индекс принимает значения от 0 до количество_элементов-1.

Пример:

int arr [10];

arr[0]=1; //Первый элемент массива arr[9]=2; //Последний элемент массива

Общий размер массива в байтах определяется выражением:

количество_элементов * sizeof (тип_элемента).

Допускается возможность объявления и использования многомерных массивов, количество размерностей не ограничивается. Многомерные массивы хранятся в памяти слева направо, т.е. последний индекс изменяется быстрее первого. При обращении к элементу многомерного массива необходимо ставить квадратные скобки вокруг каждого индексного выражения.

Пример:

int MultiArray [10][20][30];

MultiArray [1][2][3]=5; //Правильно

MultiArray [0,5,6]=3; //Неправильно

Описание массива можно сочетать с его инициализацией. Для этого необходимо перечислить в скобках значения элементов массива. В языке Си не разрешено выполнять операцию присваивания над массивами.

Пример:

int array1 [2][3] ={{1,2,3}, //0-я строка {4,5,6}}; //1-я строка

Имя массива рассматривается как указатель на начало массива, однако это указатель-константа, над которым нельзя выполнять операции увеличения и уменьшения.

Для обработки элементов массивов могут использоваться переменные-указатели. При использовании таких переменных необходимо руководствоваться правилами адресной арифметики:

- операции увеличения (++) и уменьшения (--) изменяют значение переменной-указателя;

- операция (+) не изменяет значение переменной-указателя, равноценна операции индексирования.

Пример:

int a[20], v[30]; int *ptr;

ptr=&(a[0]); //Установка ptr на начало массива,

a[0] v[0]=*(ptr+1); //То же, что v[0]=a[1];

ptr++; //Переместить указатель с a[0] на a[1]

v[3]=*ptr+1; //То же, что v[3]=a[1]+1;

Частным случаем одномерных массивов являются строки. Строки в языке Си представляют собой ASCIIZ-последовательности, каждая из которых должна заканчиваться специальным нуль-символом ('\0'). Описание строк в языке Си можно сделать следующим образом:

char str1[20];

char *str2="Hello, world!\0";

Рекомендуется использовать первый способ. Во втором случае строка была описана как указатель. Одновременно с описанием str2 было зарезервировано место в памяти, достаточное для размещения последовательности символов "Hello, world!", которая была завершена нуль-символом.

Следующий способ описания и определения строки является ошибочным и вызовет сбой в работе программы:

char *str;

str = "Error!\0"; //Память для строки не была выделена

Ряд полезных стандартных функций для обработки символьных строк описан в заголовочных файлах <ctype.h> и <string.h>.