Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по ОИиП под ред Бусько.DOC
Скачиваний:
18
Добавлен:
11.05.2015
Размер:
732.67 Кб
Скачать

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

  1. Чем функция пользователя отличается от стандартной функции ?

  2. Способы передачи аргументов в функцию.

  3. Поясните понятие “локальные” и “глобальные” переменные.

  4. Для чего и каким образом применяется оператор return ?

Лабораторная работа №6 строки и структуры

Цель работы

Изучить особенности работы со строковыми объектами (одномерными символьными массивами и строками-константами) языка С, а также освоить приемы работы с составным типом данных – структуры.

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

В алгоритмическом языке PASCAL существует отдельный тип данных – строка, который объявляется с атрибутом string. В языке С отдельного типа данных «строки символов» нет. Работа со строками реализована путем использования одномерных массивов типа char, т.е. строка символов – это одномерный массив типа char, заканчивающийся нулевым байтом. Нулевой байт – это байт, каждый бит которого равен нулю, при этом для нулевого байта определена символьная константа ´ \0 ´(признак окончания строки или нуль-терминатор). Поэтому, если строка должна содержать k символов, то в описании массива необходимо указать k+1 элемент.

Например, описание: char a[7]; означает, что строка содержит шесть символов, а последний байт отведен под нулевой байт.

Строковая константа в языке С – это набор символов, заключенных в двойные кавычки. Например: “Лабораторная работа по строкам”. В конце строковой константы явно указывать символ ´ \0 ´ не нужно, так как это сделает компилятор языка С.

Для ввода строки с клавиатуры дисплея используются две стандартные библиотечные функции, прототипы которых приведены в заголовочном файле stdio.h.

Функция scanf( ) вводит значения для строковых переменных спецификатором ввода %S. Но надо помнить, что функция scanf( ) вводит символы до появления первого символа “пробел”.

Библиотечная функция gets( ), обеспечивает ввод строки с пробелами внутри этой строки. При этом ввод строки символов завершается нажатием клавиши ENTER.

Обе функции автоматически ставят в конец строки нулевой байт. И, кроме того, так как строка – это символьный массив, а имя массива – это указатель на его начало в памяти, то символ «&» перед именами строковых объектов при использовании этих функций указывать не надо.

Вывод строк производится функциями printf( ) или puts( ). Обе функции выводят символьный массив до первого нулевого байта. Функция printf( ) не переводит курсор после вывода на начало новой строки, программист должен предусмотреть такой перевод в строке формата. Функия puts( ) автоматически переводит курсор после вывода строковой информации в начало новой строки.

При работе со строковыми объектами допустима напрямую только одна операция: операция сцепления «+». Например:

char s1[]=”город”, s2[]=” Минск.”, s3[41];

s3=s1+s2; puts(s3);

Получим фразу: город Минск.

Остальные операции над строками выполняются с использованием стандартных функций. Функции для работы со строками размещены в библиотеке, описание которой находится в файле string.h. Вот некоторые из наиболее часто используемых:

  1. Функция strcpy(S1, S2) - копирует содержимое строки S2 в строку S1.

  2. Функция strcat(S1, S2) - присоединяет строку S2 к строке S1 и помещает ее в массив, где находилась строка S1, при этом строка S2 не изменяется. Нулевой байт, который завершал строку S1, заменяется первым символом строки S2.

3.Функция strcmp(S1, S2) сравнивает строки S1 и S2 и возвращает значение

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

4. Функция strlen(S) возвращает длину строки, при этом завершающий нулевой байт не учитывается.

Структура

Тип данных «структура» объединяет несколько переменных, возможно разного типа. Переменные, которые объединены структурой, называются полями структуры (или элементами структуры). Рассмотрим пример описания структуры:

struct student

{

char name [20];

int kurs;

char group [5];

};

Само описание структуры еще не создает в оперативной памяти структурных объектов с указанными полями. Описание структуры является “шаблоном” (типом пользователя) будущих объектов с описанной структурой

Для того чтобы объявить конкретные переменные типа struct student, необходимо или указать список имен через запятые между закрывающейся фигурной скобкой и символом «;», или записать в программе объявление таких переменных, например:

struct student stud1, stud2, stud3;

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

Доступ к конкретному элементу структуры осуществляется с использованием операции «точка». Например, для печати содержимого третьего поля структурной переменной stud2 надо написать printf(“%S”, stud2.group);

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

Например: struct student studkurs[100];

Для доступа к полю kurs 15-го элемента массива необходимо записать studkurs[14].Kurs .

Если объявлены две переменные типа структуры с одним шаблоном, допустима операция присвоения: stud2 = stud3;

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

Переменные типа структуры могут быть глобальными, локальными, а также формальными. Можно создать указатель на структуру и передавать аргумент типа структуры по ссылке.

Пример работы со строковыми данными

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

#include <stdio.h>

#include <string.h>

#include <conio.h>

void main(void)

{

char s[100]; // обьявление символьного массива

int i, k;

clrscr();

puts(" Введите исходную строку");

gets(s);

k=strlen(s);

puts(" ... РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ ......\n");

for (i=k; i>=0; i--)

printf("%c",s[i]);

/* вывод элементов массива в обратном порядке */

printf("\n Press any key...");

getch();

}

Пример работы со структурой

Ввести сведения о студентах учебной группы. Каждый элемент массива студенческой группы содержит:

а) фамилию и имя;

б) итоги сдачи экзамена по программированию.

Программа выводит информацию о студенте по его порядковому номеру в списке группы(индекс массива, содержащего введенную информацию)

Текст С-программы может иметь вид:

#include <stdio.h>

#include <conio.h>

struct student

{

char fio[10]; // поле для Ф.И.О. студента

int est1; // поле для оценки

} gruppa[25]; // массив для списка группы

void main(void)

{

int i,j,k,priznak;

clrscr();

printf("\n Формирование списка до 25 человек");

/*------Формирование списка----------*/

for (i=1;i<=25;i++)

{

printf("\n Введите сведения о студенте %d и\

\n признак режима работы программы (0-окончить ввод )\

\n",i);

printf("\n Фамилия и инициалы: ");

fflush(stdin); // функция очистки буфера ввода

gets(gruppa[i].fio);

printf("\n Введите оценкy по программированию: ");

fflush(stdin);

scanf("%d",&gruppa[i].est1);

k=i; // запоминаем текущий номер введенной

// информации

printf(" \n Признак? ");

scanf("%d",&priznak);

k=i;

if(!priznak)break;

}

/*---------Просмотр списка------------*/

for (i=0; i<25; i++)

{

printf("\n Сведения о каком студенте?\n");

scanf("%d",&j);

if(j>k)

{

printf("\n НЕТ СВЕДЕНИЙ! ");

continue; // в случае отсутствия информации

} // переход на следующий шаг цикла

printf(" \n СТУДЕНТ: %s \n",gruppa[j].fio);

printf(" \n ВЕСЕННЯЯ СЕССИЯ, ОЦЕНКА\

по ПРОГРАММИРОВАНИЮ: %d",gruppa[j].est1);

printf("\n Признак? ");

scanf("%d",&priznak);

if(!priznak)break;

}

puts("\n РАБОТА ПРОГРАММЫ ЗАВЕРШЕНА! Press any key...");

getch();

}

Варианты индивидуальных заданий

В программах предусмотреть ввод исходной информации о четырех студентах:

фамилия и инициалы;

год рождения;

год поступления в БГУИР;

оценки за первый семестр: физика, высшая математика, информатика.

1. Распечатать список студентов, упорядоченный по алфавиту.

2. Распечатать список студентов, упорядоченный по году рождения.

3. Распечатать список студентов-отличников, упорядоченный по году поступления.

4. Распечатать анкетные данные студентов, сдавших сессию на 4 и 5.

5. Распечатать список студентов, фамилии которых начинаются с буквы Б, и их оценки по всем предметам.

6. Распечатать анкетные данные отличников.

7. Распечатать список студентов, фамилии которых начинаются с буквы А, и их даты рождения.

8. Распечатать анкетные данные студентов, имеющих оценку 3 в сессию.

9. Распечатать список студентов и их оценки. Фамилии студентов начинаются с букв В и Г.

10. Распечатать фамилии и даты рождения студентов, не имеющих оценок 3.

11. Вычислить общий средний балл всех студентов и распечатать список студентов со средними баллами выше общего среднего балла.

12. Вычислить общий средний балл всех студентов и распечатать список студентов, имеющих средний балл ,равный общему среднему баллу.

13. Распечатать анкетные данные студентов, имеющих оценку 2.

14. Распечатать анкетные данные студентов, имеющих оценку 5 по информатике.

15. Распечатать анкетные данные студентов, имеющих оценку 4 по физике и оценку 5 по высшей математике.

16. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L кратна 2, то удаляются все числа, которые делятся на 2.

17. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L четная, то удаляются 2 первых и 2 последних символа.

18. Выяснить, имеются ли среди символов S1...Sn некоторой строки все буквы, входящие в слово DOS.

19. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L нечетная, то удаляется символ, стоящий посередине строки.

20. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в строке длиной К символов каждого второго символа ! на $.

21. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Составить программу для замены в строке длиной К символов всех пробелов на символ $.

22. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L>10, то удаляются все цифры.

23. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L кратна 3, то удаляются все числа, делящиеся на 3.

24. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L кратна 5, то подсчитывается количество скобок всех видов.

25. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L кратна 4, то первая часть строки меняется местами со второй.

26. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина L=10, то удаляются все A...Z.

27. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина

L >15, то удаляются все a…z.

28. В строке символов поменять местами символы на четных и нечетных позициях.

29. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L, и, если длина

L >6, то выделяется подстрока в { } скобках.

30. Ввести с клавиатуры строку символов. Признак окончания ввода строки – нажатие клавиши "Ввод". Программа должна определить длину введенной строки L и, если длина

L >5, то выделяется подстрока до первого пробела.