Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Visual_Studio_2010

.pdf
Скачиваний:
109
Добавлен:
03.03.2016
Размер:
5.94 Mб
Скачать

Рис. 14.2. Результат выбора и расчета плоской фигуры

Задание2

1.Выполните программу для всех возможных случаев.

2.По программному коду запишите формулы для расчета площадей и длин граничных линий каждой из фигур.

3.Предусмотрите ввод с клавиатуры параметров выбранной фигуры.

Пример 3. Написать программу вывода на консоль дня недели до и после заданного номера дня недели с помощью перечислимого типа данных enum.

Программный код решения примера

#include <stdio.h> #include <conio.h>

const int

NUMDAYS = 7;

enum DAYS

 

{

 

Mon,

// Monday,

Tue,

// Tuesday,

Wed,

// Wednesday,

Thu,

// Thursday,

Fri,

// Friday,

Sat,

// Saturday,

Sun

// Sunday

} day1, day2, day3; // сегодня, вчера, завтра

// Прототипы функций int day_before(DAYS); int day_after(DAYS); void print_day(DAYS);

int main (void)

{

printf("\n Days of week:\n 1) Monday, 2) Tuesday, 3) Wednesday, \

4) Thursday,\n 5) Friday, 6) Saturday, 7) Sunday\n");

printf("\n Select the number of days a week: "); scanf_s("%d", &day1);

if (day1 > 7 || day1 < 1) printf("\n\t Error!\n");

241

else {

day2 = day_before(day1); day3 = day_after(day1); printf("\n If today "); print_day(day1);

printf("\n yesterday was "); print_day(day2);

printf("\n and tomorrow will be "); print_day(day3);

}

printf("\n\n Press any key: "); _getch();

return 0; }

//Описание функции int day_after(day) {

int aft, ex;

aft = (day+1) % NUMDAYS; // остаток от деления по модулю if (aft == 0)

ex = NUMDAYS; else

ex = aft; return ex; }

//Описание функции

int day_before(day) { int pre, ex;

pre = (day-1) % NUMDAYS; if (pre == 0)

ex = NUMDAYS; else

ex = pre; return ex; }

//Описание функции void print_day(day) {

int day_i = day-1;

//Массив указателей static char *days[] = char *days[] =

{"Monday",

"Tuesday",

"Wednesday",

"Thursday",

"Friday",

"Saturday", "Sunday" };

printf(" %s\n", days[day_i]); }

В программе использован спецификатор класса памяти static для массива указателей, инициированных названиями дней недели. В этом случае мас-

242

сив указателей с заданным именем будет недоступен за пределами функции, где он определен. Для данной программы класс памяти static внутри функции print_day() инициирует выделение памяти для объекта (массив указателей) и служит определением массива указателей.

Возможный результат выполнения программы приведен на рис.14.3.

Рис. 14.3. Пример выбора полей перечисления по дням недели

Задание3

1.В программе используйте кодовые страницы (Windows или DOS) для работы с русскими шрифтами (с подключением заголовка <locale.h>).

2.Видоизмените программу для выбора месяца года (с учетом п.1).

3.Видоизмените программу для выбора одного из 7 цветов (каждый охотник желает знать, где сидят фазаны – красный, оранжевый, желтый, зеленый, голубой, синий, фиолетовый) с выводом на консоль цвета и его кода RGB (red, green, blue – красный, зеленый, синий).

4.Выполните изменения в программе, чтобы выбор дня недели осуществлялся при инициализации переменной day1, например day1 = Sun.

5.Напишите программу вывода на консоль названия месяца до и после заданного (введенного пользователем) номера месяца года с помощью перечислимого типа данных enum.

Пример 4. Написать программу вывода количества дней для каждого месяца невисокосного года на основе перечислимого типа данных [5].

Программный код решения примера

#include <stdio.h> #include <conio.h>

int main (void) {

enum month {january = 1, february, march, april, may, june,july, august, september, october, november,

december } aMonth; int days;

printf("\n Enter the number of the month (1 - 12): "); scanf_s("%d", &aMonth);

243

switch (aMonth)

{

// 31 день case january: case march: case may:

case july: case august: case october: case december:

days = 31; break;

// 30 дней case april: case june: case september: case november:

days = 30; break;

case february: days = 28; break;

default:

printf("\n\t Wrong number of the month\n"); days = 0;

break;

}

if (days)

printf("\n The number of days of the month: %d\n", days);

if (aMonth == february)

printf("\n ... or 29 if it is a leap year\n");

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

_getch(); return 0;

}

Возможный результат выполнения программы показан на рис.14.4.

Рис. 14.4. Подсчет количества дней в месяце года

244

Задание4

1.Произведите запись в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.

2.Создайте переменную перечислимого типа compX, где Х – номер компьютера, на котором выполняется лабораторная работа.

3.Предусмотрите вывод названия месяца и количества его дней.

4.Предусмотрите количество дней в феврале для високосного года (без добавления разделительного союза «или»).

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

1.Какие различия и общие черты имеются у структур и объединений?

2.Для чего используются объединения в языке С? Как они определяются?

3.Как осуществляется инициализация полей объединения?

4.Как можно вывести значения полей объединения на дисплей?

5.Для чего служит перечислимый тип данных в языке С? Как он определяется?

6.Какие операции разрешено выполнять над объединениями?

7.Какие значения по умолчанию присваиваются полям перечислимого списка?

БИБЛИОГРАФИЧЕСКИЙ СПИСОК

1.Прата С. Язык программирования С. Лекции и упражнения : пер. с англ. / С. Прата. – 5-е изд. – М. : Вильямс, 2006. – 960 с.

2.Керниган Б. У. Язык программирования С : пер. с англ./Б. У. Керниган, Д. М. Ритчи. – 2-е изд. – М. : Вильямс, 2007. – 304 с.

3.Подбельский В. В. Программирование на языке Си : учеб. пособие/ В. В. Подбельский, С. С. Фомин. – 2-е изд., доп. – М. : Финансы и стати-

стика, 2007. – 600 с.

4.Шилдт Г. Полный справочник по С : пер. с англ./Г. Шилдт. – 4-е изд. –

М. : Вильямс, 2007. – 704 с.

5.Кочан С. Программирование на языке С : пер. с англ./С. Кочан. –

3-е изд. – М. : Вильямс, 2007. – 496 с.

245

Тема 15

СТРУКТУРЫ И ФУНКЦИИ ЯЗЫКА С

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

ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

Разрешенными операциями над структурами являются копирование или присваивание структуры как целого, взятие ее адреса операцией &, а также обращение к ее элементам [1]. Копирование и присваивание включают также передачу аргументов в функции и возвращение значений из функций.

Возможна передача членов структур и целых структур функциям. В первом случае передается значение члена структуры, притом не играет роли то, что оно берется из члена структуры. Например, пусть задана структура следующего вида [2]:

struct fred

{

char x; int y; float z;

char str[10]; // с учетом символа окончания строки

} mike;

Тогда каждый член этой структуры можно передать функции:

func(mike.x); // передается символьное значение х func2(mike.y); // передается целое значение y func3(mike.z); // передается значение с плавающей точкой z func4(mike.str); // передается адрес строки str[10] func(mike.str[2]);// передается символьное значение str[2]

Если же нужно передать адрес отдельного члена структуры, то перед именем структуры должен находиться оператор &. Для рассмотренных примеров получим

func(&mike.x); // передается адрес символа х func2(&mike.y);// передается адрес целого y func3(&mike.z);// передается адрес члена z с плавающей точкой func4(mike.str);// передается адрес строки str func(&mike.str[2]);// передается адрес символа в str[2]

Когда в качестве аргумента функции используется структура, для передачи ее целиком выбирается обычный способ вызова по значению [2], т. е. любые изменения в содержимом параметра внутри функции не отразятся на той структуре, которая передана в качестве аргумента.

При использовании структуры в качестве параметра надо помнить, что тип аргумента должен соответствовать типу параметра. В качестве примера рассмотрим следующий программный код [2]:

246

#include <stdio.h> #include <conio.h>

//Определение глобального типа структуры struct struct_type {

int a, b; char ch; };

//Прототип функции

void fun(struct struct_type parm);

int main (void) { struct struct_type arg;

arg.a = 1000; fun(arg);

printf("\n Press any key: "); _getch();

return 0;

}

// Определение функции

void fun(struct struct_type parm)

{

printf("\n %d\n", parm.a);

}

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

Когда используется указатель на структуру, вместо оператора точки применяют оператор «стрелка». Видоизменим рассмотренную программу, введя в

нее указатель на структуру:

#include <stdio.h> #include <conio.h>

//Определение глобального типа структуры struct struct_type { int a, b; char ch; };

//Прототип функции

void fun(struct struct_type *parm);

int main (void)

{

struct struct_type arg,*PTR; PTR = &arg;

PTR->a = 999; fun(PTR);

247

printf("\n Press any key: "); _getch();

return 0;

}

// Определение функции

void fun(struct struct_type *parm)

{

printf("\n %d\n", parm->a);

}

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

#include <stdio.h> #include <conio.h>

//Определение глобального типа структуры struct struct_type {int a, b; char ch; };

//Прототип функции

void fun(struct struct_type STRUCT3);

int main (void)

{

struct struct_type struct2 = {2, 3, 'Z' };

fun(struct2);

printf("\n Press any key: "); _getch();

return 0;

}

// Определение функции

void fun(struct struct_type STRUCT3)

{

printf("\n %c: %d + %d = %d\n", \

STRUCT3.ch, STRUCT3.a, STRUCT3.b, STRUCT3.a + STRUCT3.b);

}

В современных версиях языка С, в том числе в ANSI C, структуры не только можно передавать функции в качестве аргументов, но и возвращать их из функции [3]. При использовании функций для возврата структур становится возможным отправлять информацию из вызываемой функции в вызывающую. Указатели на структуры допускают также двусторонний обмен данными.

248

ПРАКТИЧЕСКАЯ ЧАСТЬ

Пример 1. Написать программу передачи частей структуры в качестве аргументов функции на примере подсчета суммы двух вещественных чисел, которые вводятся с клавиатуры с именами двух пользователей.

Программный код решения примера

#include <stdio.h> #include <conio.h>

#define MAX 20

// Шаблон структуры struct test {

char A[MAX+1]; double ax; char B[MAX+1]; double by; };

//Прототип вспомогательной функции double sum(double, double);

// Главная функция int main (void)

{

struct test AB; // создание новой структурной переменной

//Заполнение полей структуры printf("\n\t Type 1 st name: "); gets_s(AB.A, MAX);

printf("\t Enter the first real number: "); scanf_s("%lf", &AB.ax);

_flushall();

printf("\n\t Enter 2 nd name: "); gets_s(AB.B, MAX);

printf("\t Enter the second real number: "); scanf_s("%lf", &AB.by);

printf("\n\t The sum of two numbers \ %1.2f and %1.2f, %s and %s: %1.2f\n",

AB.ax, AB.by, AB.A, AB.B, sum(AB.ax, AB.by));

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

_getch(); return 0;

}

// Функция суммирования двух чисел double sum(double x, double y) { return (x + y);

}

Возможный результат выполнения программы показан на рис.15.1.

249

Рис. 15.1. Сумма двух чисел, переданных в качестве аргументов функции

Задание1

1.Одним из вводимых имен примите свое имя (имя пользователя).

2.Предусмотрите предварительный подсчет суммы двух чисел по возвращаемому значению функции sum().

3.Произведите инициализацию структуры в программе и передайте ее вещественные данные в функцию для подсчета их суммы.

4.Напишите функцию, аргументом которой будет вычисленная сумма двух чисел – полей структуры, чтобы эта функция выполняла вывод на консоль полученной суммы.

5.В программе операцию «точка» замените на операцию «стрелка».

Пример 2. Написать программу выполнения арифметических действий с комплексными числами на основе структурного типа данных и печати результатов выполненных действий с помощью вспомогательной функции.

Для решения данного примера следует выполнить действия с комплексными числами, заданными в алгебраической форме [4].

Суммой двух комплексных чисел z1 = x1 + y1i и z2 = x2 + y2i называется число z = x + yi такое, что справедливы равенства х = х1 + х2, у = у1 + у2, т. е.

z = (x1 + x2) + (y1 + y2)i,

где i – мнимая единица.

Правило сложения. При сложении комплексных чисел складываются действительные и мнимые части соответственно.

Разностью чисел z1 и z2 называется число z такое, что z1 = z z2.

Правило вычитания. При нахождении разности z1 z2 из действительной

имнимой частей уменьшаемого z1 вычитаются соответственно действительная

имнимая части вычитаемого:

z = (x1 x2) + (y1 y2)i.

Произведением двух комплексных чисел z1 = x1 + y1i и z2 = x2 + y2i называется число z = x + yi такое, что выполняются равенства:

х = х1х2 у1у2, у = х1у2 + х2у1.

Правило умножения. Комплексные числа перемножаются как двучлены, при этом учитывается, что 2 = −1.

250

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]