Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



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

 

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

Оператор 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>.

 

Порядок выполнения работы

Выполнить экспериментальную часть лабораторной работы в соответствии с вариантом задания.

Задания

1. Матрица размером 7*4 заполнена случайными действительными числами. Переставляя ее строки и столбцы, добиться того, чтобы наибольший элемент (один из них) оказался в верхнем левом углу.

2. Определить, является ли заданное натуральное число палиндромом, т.е. таким, десятичная запись которого читается одинаково и слева направо, и справа налево.

3. Определить, является ли заданная целая квадратная матрица 9-го порядка магическим квадратом, т.е. такой, в которой суммы элементов во всех строках и столбцах равны. Матрицу заполнить случайными числами.

4. Проверить, можно ли получить слово x из слова y путем перестановки букв.

5. В массиве действительных чисел, состоящем из 20 элементов, подсчитать сумму тех из них, номера которых являются простыми числами. Массив заполнить случайными числами.

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

7. Дана матрица размером 5*5. Осуществить поворот элементов матрицы вокруг ее центра на 90 градусов против часовой стрелки. Матрицу заполнить случайными действительными числами.

8. Элемент матрицы назовем седловой точкой, если если он является наименьшим в своей строке и одновременно наибольшим в своем столбце, либо наименьшим в своем столбце и наибольшим в своей строке. Для матрицы размером 5*5, заполненной случайными целыми числами, напечатать индексы всех ее седловых точек.

9. Определить, является ли введенная с клавиатуры фраза на русском языке, содержащая не более 100 символов, палиндромом, т.е. ее можно одинаково читать и с начала, и с конца. Различие регистров при сравнении игнорировать. Пример палиндрома: " А роза упала на лапу Азора".

10. Дана непустая последовательность слов из строчных латинских букв; слова разделяются запятыми, за последним словом - точка. Среди всех пар ai и bi, где ai -первая, а bi - последняя буквы i-го слова последовательности, определить наиболее часто встречающуюся пару.

11. Дана непустая последовательность слов из строчных латинских букв; слова разделяются запятыми, за последним словом - точка. Напечатать все слова, для которых верно, что первая буква слова входит в него еще один раз.

12. Даны координаты n векторов n-мерного линейного пространства (n=7). Определить, являются ли они линейно независимыми.

 

Контрольные вопросы

1. Охарактеризуйте возможности цикла for. Приведите примеры.

2. Какие логические циклы имеются в Си? Приведите примеры их использования.

3. Операторы цикла с предусловием и постусловием?

4. Указать особенности программ, использующих массивы.

5. Какие операторы языка можно использовать для описания массивов?

6. Указать особенность ввода вывода массивов.

 


ЛАБОРАТОРНАЯ РАБОТА №4

Функции в языке Си

Цель работы: Овладение навыками алгоритмизации и программирования задач с использованием подпрограмм пользователя различных видов.

 


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 540; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.037 с.)
Главная | Случайная страница | Обратная связь