Индивидуальное задание к лабораторной работе №13
Составить программу для обработки многомерных массивов с использованием циклов. Индивидуальные задания приведены в таблице 13.1.
Таблица 13.1 - индивидуальное задание
Вар. | Условие задачи |
Вычислить произведение отрицательных чисел строки, у которой второй элемент четный | |
Найти сумму нечетных чисел столбца, у которого первый элемент больше второго | |
Определить количество отрицательных чисел столбца, у которого первый элемент меньше последнего | |
Найти сумму положительных кратных 5 чисел столбца, у которого четвертый элемент отрицательный | |
Найти произведение нечетных чисел столбца, у которого первый элемент нуль | |
Найти произведение положительных чисел столбца, последний элемент которого нуль | |
Найти сумму нечетных элементов строки, первый элемент которой кратен 3 | |
Найти максимальное отрицательное число строки, у которой второй элемент больше 20 | |
Найти сумму положительных четных чисел строки, у которой первый элемент отрицательный | |
Найти минимальное положительное число строки, у которой пятый элемент отрицательный | |
Найти минимальное четное число столбца, у которого первый элемент больше третьего | |
Найти сумму положительных кратных 5 чисел столбца, у которого четвертый элемент отрицательный | |
Найти количество отрицательных не кратных 3 чисел строки, у которой первый элемент нуль | |
Найти количество положительных четных чисел строки, у которой пятый элемент больше 30 | |
Найти произведение квадратов положительных четных чисел столбца, у которого второй элемент нуль | |
Найти среднее арифметическое отрицательных элементов строки, у которой четвертый элемент отрицательный | |
Найти разность сумм отрицательных и положительных элементов строки, у которой третий элемент кратен 3 | |
Найти среднее геометрическое модулей отрицательных элементов столбца, у которого первый элемент положительный | |
Найти все кратные 7 положительные элементы столбца, у которого третий элемент нечетный | |
Найти среднее арифметическое положительных элементов строки, у которой первый элемент меньше второго | |
Найти среднее геометрическое кратных 3 элементов столбца, у которого шестой элемент не кратен 4 | |
Найти частное от деления количества отрицательных элементов столбца, у которого первый элемент нуль, на их сумму | |
Найти все положительные нечетные числа строки, у которой второй элемент не кратен 3 | |
Найти количество отрицательных кратных 5 элементов столбца, у которого второй элемент равен третьему | |
Найти номер максимального четного числа строки, у которой первый элемент равен последнему | |
Найти номер минимального нечетного числа строки, у которой первый элемент равен последнему | |
Найти номер максимального четного числа столбца, у которого первый элемент равен последнему | |
Найти номер минимального нечетного числа столбца, у которого первый элемент равен последнему | |
Найти сумму максимального и минимального чисел строки, у которой второй элемент нечетный | |
Найти номер минимального нечетного числа строки, у которой первый элемент четный |
|
Контрольные вопросы для подготовки и самостоятельной работы
|
1 Приведите примеры объявления массивов с различной размерностью. Объясните организацию хранения элементов массива.
2 Как происходит масштабирование при последовательном разыменовании указателя (имени массива) в процессе доступа к элементам? Какие синтаксические конструкции можно использовать для доступа к элементам массива?
3 Приведите общую формулу для массива <Тип> <Имя> [N][M][K] при доступе к заданному элементу <Имя> [i][j][k] и объясните её.
4 Как осуществляется инициализация многомерных массивов?
5 Зависит ли инициализация массива от класса памяти при объявлении?
6 Как использовать средство typedef для объявления типа массива.
7 Какой из индексов можно не указывать при явной инициализации массивов?
8 Можно ли указывать не все элементы при инициализации? Как использовать скобки при инициализации?
9 Какой индекс не используется при расчёте величины смещения указателя в процессе доступа к элементу массива?
10 Для чего используется указанный индекс?
Лабораторная работа № 14
Разработка программ с составными типами данных
(2часа)
Цель: выработать практические навыки в написании программ с использованием комбинированных типов данных.
Теоретические сведения
Структуры
С поддерживает определённый пользователем составной тип, объявляемый с ключевым словом struct, который определяет структуры. Эти структуры подобны записям, используемым в других языках программирования. Структура содержит данные-члены, которые являются данными базовых типов, либо являются предварительно объявленными структурами. Структуры не могут содержать структуры своего типа, но могут содержать указатели на такие структуры.
|
Объявление структур
В С ключевое слово struct используется не только для объявления объектов структурного типа, но и для объявления нового (структурного) типа. Объявленный тип структуры можно использовать для объявления объектов структурного типа.
Представим общий синтаксис для объявления структуры типа (stt) и приведём несколько примеров структур
struct sttype { type1 dataMember1; type2 dataMember2; //другие данныe-члены }[<имя_объекта 1>, <имя_объекта 2>];// объявление типа структуры и необязательное // объявление объектов | struct Point { float x; float y; } Apoint, Bpoint, *Ppoint, Mpoint[10]; объявление типа и объектов | struct Person {char firstname[12]; char lastname[15]; int birthday; float weight; }; // объявление // типа структуры |
После объявления типа (<strucType>), его можно использовать для объявления объектов, например
sttype Astr, Mstr[5], *pstr;
Объявлены объекты структурного типа:
Astr - структура;
Mstr[5]- массив из 5 -ти структур;
pstr- указатель на структуру данного типа.
Структура типа Point имеет два члена-данных типа float.
Структура типа Person - пример структуры, которая содержит данные-члены, которые являются массивами:
firstname []- массив из 12 символов, в котором хранится имя.
lastname []- массив из 15 символов, в котором хранится фамилия.
birthday типа int, в котором хранится год рождения.
weight типа float, в котором хранится вес.
Объявление структуры-переменной (объекта структурного типа) не отличается от объявления переменных с базовыми или предварительно определёнными типами.
Общий синтаксис объявления | Пример объявления объектов (переменных) структурного типа |
//объявление единственной переменной //sttype sttype structVar; //объявление массива структур sttype sttype stArray[Kol_elem]; | Point Origin, StartPoint, Points[10]; Person You, Me, Us[30], *PYou; |
В этом примере объявлены переменные- структуры Origin, StartPoint типа Point, массив Points [10], имеющий 10 элементов - структур типа Point, переменные Me и You типа Person, массив Us [30], имеющий 30 элементов- структур типа Person и указатель на тип Person.
С позволяет инициализировать данные-члены структур. Инициализация осуществляется подобно инициализации массивов и следует тем же правилам. Общий синтаксис для инициализации данных-членов структуры:
sttype strucVar ={value1,value2,...};
Компилятор присваивает значение value1 первому данному-члену структуры strucVar, value2 - второму данному-члену структуры strucVar и т.д. С требует соблюдения следующих правил:
1 Присваиваемые значения должны быть совместимы с соответствующими им данными-членами по типу, диапазону и количеству (для массивов).
2 Можно объявлять меньшее количество присваиваемых значений, чем количество данных. Компилятор присваивает нули остальным данным- членам структуры.
3 Нельзя указывать больше инициализирующих значений, чем количество данных-членов.
4 Значения из списка инициализации последовательно присваиваются данным-членам вложенных структур и массивов.
Пример инициализации структуры - Point fPoint={12.4,34.5};
В этом примере объявлена переменная fPoint типа Point и инициализированы данных члены х, у значениями 12.4 и 34.5.
Доступ к данным-членам осуществляется с помощью операции (.)"точка".
Общий синтаксис для доступа к данным-членам структуры | Примеры доступа к данным - членам структуры |
StrucVar.dataMember <Имя_структуры>. <данное_член>; | Point myPoint; //объявление MyPoint. x=10.9; //доступ кх MyPoint. y=21.89; |
myPoint -структурная переменная, доступ к её данным-членам х, у осуществляется с помощью выражения myPoint. x и myPoint. y соответственно.
Пример
/* ЗАНЯТИЕ N 14
Разработал Петров Ю.В.
Объявить составные типы данных, выполнить их
инициализацию. Массив структур инициализировать с
использованием операторов организации цикла. Получить доступ
к элементам структур. Вывести значения элементов массива
структур на экран с применением функции. */
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <alloc.h>
#define N 20
#define M 5
typedef struct Adr //Adr -тип структуры
{ char town[N]; char *country;
char region; float indeks; int kolvo;
} adr; //adr -тоже тип структуры (синоним Adr)
//input_st() -функция для инициализация структуры типа adr
adr input_st(char *town, char *coun, char reg, float ind, int kol);
void print_st(adr adr3); //Функция вывода элементов структуры
int main(void)
{ clrscr();
int a; float f1;
char str[125]; //Буфер для ввода строки символов
adr adress[M]; //Массив структур
adr adr1,adr2={"Kiev","Ukr",'r',12.3,15}; //Явная инициализация
adr1=adr2; //Инициализация adr1 присваиванием
printf("Вывод элементов структуры ");
print_st(adr1); //Вывод adr1
adr1=input_st("Kr","Ukr",'t',134.5,2); //Инициализация adr1
printf("Вывод элементов структуры ");
print_st(adr1); //Вывод adr1
int i=0,j;
while (a&&i<M) //Ввод элементов массива структур
{ printf("Ввод города (char array[N]) ");
scanf("%s",&adress[i].town); fflush(stdin);
printf("Ввод страны (char *) ");
scanf("%s",str); fflush(stdin);
adress[i].country=(char*)malloc(strlen(str)+1);
strcpy(adress[i].country,str);
//adress[i].country=strdup(str); //Возможный вариант иниц.
printf("Ввод кода региона (char) ");
scanf("%c", &adress[i].region); fflush(stdin);
printf("Ввод цифрового кода (float) ");
scanf("%f",&f1); fflush(stdin);
adress[i].indeks=f1;
printf("Ввод количества (int) ");
scanf("%i",&adress[i].kolvo); fflush(stdin);
printf("\n\t\t\t Продолжить ввод? y/n: ");
char c=getche(); printf("\n");
if (c=='n' || c=='N') a=0;
i++;
} //end while---------------------------------------------
printf("Вывод элементов структур\n ");
j=i;
for(i=0;i<j;i++) print_st(adress[i]);
getche();
return 0;
} //end main()-----------------------------------------------
adr input_st(char *t, char *c, char r, float f, int k)
{ adr ad; //Объявление локальной структуры
strcpy(ad.town,t); //Копирование "t" в "ad.town"
ad.country=(char*)malloc(strlen(c)+1); //Выделение памяти
strcpy(ad.country, c); //Копирование "c" в "ad.country"
// ad.country=strdup(c); //Возможный вариант инициализации
ad.region=r; ad.indeks=f; ad.kolvo=k;
return ad; //Возврат структуры из функции
} //end input_st ()---------------------------------------
void print_st(adr adr3) //Функция вывода элементов структуры
{ printf("| %s ", adr3.town);
printf("| %s ", adr3.country);
printf("| %4c | %10f|%6i|\n",adr3.region, adr3.indeks, adr3.kolvo);
} //end print_st()-----------------------------------------
/*Вывод элементов структуры | Kiev | Ukr | r | 12.300000| 15|
Вывод элементов структуры | Kr | Ukr | t | 134.500000| 2|
Ввод города (char array[N]) Don
Ввод страны (char *) Ukr
Ввод кода региона (char) t
Ввод цифрового кода (float) 45.67
Ввод количества (int) 8
Продолжить ввод? y/n: y
Ввод города (char array[N]) Khar
Ввод страны (char *) Ukr
Ввод кода региона (char) g
Ввод цифрового кода (float) 67.84
Ввод количества (int) 4
Продолжить ввод? y/n: n
Вывод элементов структур | Don | Ukr | t | 45.669998| 8|
| Khar | Ukr | g | 67.839996| 4| */
Ход работы
1 Изучить теоретические сведения.
2 В соответствии с индивидуальным заданием разработать алгоритм решения задачи. Объявить составные (комбинированные) типы, массивы структур, использовать указатели в качестве членов структуры, объявить объединение и выполнить работу с объединением. Результаты инициализации, изменения членов комбинированных типов в процессе вычисления вывести на экран.
3 Разработать программу, набрать программу на компьютере, устранить ошибки.
4 Получить результат.
5 Оформить отчет.
6 Подготовиться к защите лабораторной работы, изучив контрольные вопросы по данной теме.