
- •Министерство образования и науки Республики Казахстан
- •Кафедра программного обеспечения
- •Языки программирования
- •Лабораторная работа № 1
- •Краткая теория
- •Задания
- •Лабораторная работа № 2
- •Краткая теория
- •Задания
- •Лабораторная работа №3
- •Краткая теория
- •Задания
- •Лабораторная работа № 4
- •Краткая теория
- •Задания
- •Лабораторная работа № 5
- •Краткая теория
- •Задания
- •Лабораторная работа № 6
- •Краткая теория
- •Объединения
- •Задания
- •Лабораторная работа № 7
- •Краткая теория
- •Задания
- •Лабораторная работа № 8
- •Краткая теория
- •Задания
Задания
Слова в строке разделены пробелами. Найти самое длинное слово.
Слова в строке разделены последовательностями пробелов. Удалить лишние пробелы.
Дана строка, слова в которой разделены пробелами. Удалить из строки самое короткое слово.
Дана строка, слова в которой разделены пробелами. Все слова в строке перевернуть.
Дана строка, слова в которой разделены пробелами. Подсчитать количество слов в строке, которые начинаются и заканчиваются на одну букву.
Дана строка, слова в которой разделены пробелами. Определить, есть ли среди слов строки такое, которое представлено как последовательность одинаковых символов.
Дана строка, слова в которой разделены пробелами. Получить новую, удалив из исходной все слова, которые являются перевертышами.
58. Дана строка. Определить самую длинную последовательность одинаковых символов, и вывести количество этих символов.
59. Дана строка. Определить, какой символ встречается в ней чаще всего.
60. Дана строка, слова в которой разделены пробелами. В строке поменять местами самое длинное и самое короткое слово.
Лабораторная работа № 6
Дисциплина: Языки программирования
Тема: Структуры
Цель: изучить инициализацию и массивы структур, уметь решать все приведенные примеры
Краткая теория
Структура позволяет объединить в одном объекте совокупность значений, которые могут иметь различный тип. Однако в языке реализован ограниченный набор операций над структурами, как над единым целым: передача в функцию в качестве параметра, получение адреса. Можно присваивать одну структуру другой, если они имеют одинаковый тег. Существует две формы объявления структуры:
struct [<тег>]{<список объявлений элементов>} [<описатель>][,..];
struct <тег> <описатель>[,...];
Объявление структуры может задавать имя структурного типа и/или последовательность объявлений переменных, называемых элементами структуры. Эти элементы могут иметь различные типы.
В первой форме объявления типы и имена элементов структуры специфицируются в списке объявлений элементов. Необязательный тег - это идентификатор, который именует структурный тип, определенный данным списком объявлений элементов. <Описатель> специфицирует либо переменную структурного типа, либо указатель на структуру данного .типа, либо массив структур данного типа, либо функцию, возвращающую структуру данного типа, либо более сложный объект.
struct {
char name[20];
char adress[40];}
person;
При такой форме объявления структуры для определения подобного объекта снова придется повторять определение указанной структуры. Это не всегда удобно, а в некоторых случаях не приводит к желаемым результатам. Поэтому такой вариант объявления используется при работе с единичным объектом.
Вторая форма объявления использует тег структуры для ссылки на структурный тип, определенный где-нибудь в другом месте программы. Тег может быть использован в программе позднее для создания подобных объектов, а также для передачи в функцию в качестве параметра: struct anceta {
char name [20];
char adress[40];} person;
struct anceta kadr[20];
Список объявлений элементов представляет собой последовательность из одного или нескольких объявлений переменных или битовых полей. Каждая переменная, объявленная в этом списке, называется элементом структуры. Такие переменные не могут иметь инициализаторов.
Элементы структуры могут иметь базовый тип, либо быть массивом, указателем, объединением или структурой. Элемент структуры не может быть структурой того же типа, в которой он содержится. Однако он может быть объявлен как указатель на тип структуры, в которую он входит. Это позволяет создавать связанные списки структур.
Идентификаторы элементов структуры должны различаться между собой, но идентификаторы элементов разных структур могут совпадать.
Элементы структуры запоминаются в памяти последовательно в том порядке, в котором они объявляются.
Примеры объявления:
struct { struct COMPLEX
int a; {
float b[ 10); float real;
char * c; . float imag;
} prim; };
COMPLEX x,y,z; struct struct STACK
{
int info;
STACK * next;
}*ptr;
Обращаться к полям структуры можно, указывая имя переменной типа структура и имя поля, записанного через точку:
Prim.Ь[]=’\0’;
x.real = 5;
z.imag = y.imag;
Если переменная определена как указатель на структуру, то для доступа к полям используется операция х = ptr->info; эквивалентно у = (*ptr).info;
Инициализация структур
Структуры можно инициализировать непосредственно в месте описания. Начальные значения для каждой структуры задаются внутри скобок. Соответствие между константами и полями устанавливается по порядку записи.
Например: struct record {
char * name;
int age;
} person = {"Иванов", 25};
Массивы структур
Чаше, при решении задач используются не единичные структуры, а их более сложные совокупности. Мы рассмотрим массивы структур, способы доступа к их элементам и возможности модификации самого массива.
1.
Дан список сотрудников с указанием имени и возраста каждого. Всех сотрудников, достигших 60 лет удалить из списка и вывести оставшихся на печать. |
Очевидно, что для поддержания указанного списка следует завести линейный массив, каждый элемент которого будет структурой с полями имени и возраста.
struct {
char name [20];
intage;}a[10];
Обращение к i-ому элементу такого массива традиционно - a[i], а обращение к полям 1-ого элемента ведется через точку - a[i].name, a[i].age . Ввод массива будет следующим:
printf("\n введите размерность \п");
scanf("0/od",&n);
for (i=0; i<n; i++)
printf("\n фамилия %d сотрудника",i+1);
scanf("%s", a[i].name);
printf("\n возраст");
scanft"%d", &a[i].age);
}
Перебираем всех сотрудников (все элементы массива, начиная с первого). При этом, если возраст сотрудника больше 60 (a[i].age>60), удаляем его из списка, т.е. перемешаем все элементы массива, начиная со следующего на одно место влево, и общее количество элементов уменьшаем на 1.
i=0;
while (i<n) s
if(a[i].age>60)
{for (j=i+1;j<n;j++)
a[j-1]=a[j];
n--;
}
else
i++;
Язык позволяет присваивать значение одной структуры переменной такого же структурного типа; это отражается строкой a[j-l]=a(j];
Рассмотрим работу описанного фрагмента программы на следующем примере: Иванов 60
Сидоров60Петров 28 Мамонов 43
При i=0 удаляется элемент а[0]:
Сидоров 60
Петров 28
Мамонов 43
и на месте i=0 стоит уже новый сотрудник- Поскольку он также подходит под условие, и он удаляется а значение i=0 остается :
Петров 28
Мамонов 43
На следующем шаге условие не' выполнится, и просмотр передвинется к следующему участнику списка i=1, и т.д.
Для удобства просмотра при выводе элементы массива распечатаем построчно.
#include <stdio.h>
mam()
struct {
char name [20];
int age;
}
a[10]; //массивсотрудников
int n; // размерность массива
tntij;
printf("\n введите размерность \n">; scanf("%d",&n);
for (i=0; i<n; i++)
{
printf("\n фамилия %d сотрудника",i+1); scanfT%s", a[i].name);
printf("\n возраст");
scanf("%d", &a[j].age);
}
i=0;
while (i<n) if(a[i].age>60)
{
for(j=i+l;j<n;j++)
a[j-1]=a[j];
n--;
else
i++;
for(i=0; i<n; i++)
printf{"\n %s %d", a[i].name, a[i].age);