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

Visual_Studio_2010

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

Частным от деления числа z1 на z2 (z2 ≠ 0) называется число z такое, что справедливо равенство z z2 = z1.

Правило деления. Чтобы разделить число z1 на z2 (z2 ≠ 0), следует числитель и знаменатель дроби z1 / z2 умножить на число, сопряженное знаменателю. Комплексные числа называются сопряженными, если у них равны действительные части, а мнимые противоположны по знаку.

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

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

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

{

long double Re; long double Im; };

//Прототип функции с аргументами:

//структура и симольная переменная

void complex (struct comp ri[2], char op);

int main (void)

{

long double x, y; char op;

// Определение структурной переменной struct comp ri[2];

setlocale(LC_ALL, ".1251"); // для русских шрифтов

//Для определения чисел с десятичной точкой setlocale(LC_NUMERIC, "English");

printf("\n\t ДЕЙСТВИЯ С КОМПЛЕКСНЫМИ ЧИСЛАМИ\n");

printf("\n Введите действительную часть 1-го комплексного числа:

");

scanf_s("%lf", &x); _flushall(); ri[0].Re = x;

printf(" Введите мнимую часть 1-го комплексного числа: "); scanf_s("%lf", &y); _flushall();

ri[0].Im = y;

printf("\n Введите действительную часть 2-го комплексного числа:

");

scanf_s("%lf", &x); _flushall(); ri[1].Re = x;

printf(" Введите мнимую часть 2-го комплексного числа: "); scanf_s("%lf", &y); _flushall();

ri[1].Im = y;

251

printf("\n Введите арифметический оператор: "); scanf_s("%c", &op, 1); _flushall();

//Вызов функции расчета комплексных чисел

printf("\n Результат действия (\"%c\") над двумя комплексными

числами\n (результат с десятичной запятой):", op);

// Для русских шрифтов с числами с десятичной запятой setlocale(LC_ALL, ".1251");

complex (ri, op);

//Для определения числа с десятичной точкой setlocale(LC_NUMERIC, "English");

//Вызов функции расчета комплексных чисел printf("\n Результат действия (\"%c\") над двумя

комплексными числами\n (результат с десятичной точкой):", op); complex (ri, op);

printf("\n Нажмите любую клавишу (Press any key): "); _getch();

return 0;

}

// Вспомогательная функция

void complex (struct comp ri[2], char z) {

double num1, num2, den; // вспомогательные переменные

// Выбор арифметического действия switch (z) {

case '+' :

if ((ri[0].Im + ri[1].Im) >= 0)

printf("\n\t %1.4f + %1.4fi\n", ri[0].Re + ri[1].Re, ri[0].Im + ri[1].Im);

if ((ri[0].Im + ri[1].Im) < 0)

printf("\n\t %1.4f - %1.4fi\n", ri[0].Re + ri[1].Re, -(ri[0].Im + ri[1].Im));

break;

case '-' :

if ((ri[0].Im - ri[1].Im) >= 0)

printf("\n\t %1.4f + %1.4fi\n", ri[0].Re - ri[1].Re, ri[0].Im - ri[1].Im);

if ((ri[0].Im - ri[1].Im) < 0)

printf("\n\t %1.4f - %1.4fi\n", ri[0].Re - ri[1].Re, -(ri[0].Im

- ri[1].Im)); break;

case '*' :

if ((ri[0].Re*ri[1].Im + ri[1].Re*ri[0].Im) >= 0) printf("\n\t %1.4f + %1.4fi\n",\

ri[0].Re * ri[1].Re - ri[0].Im*ri[1].Im, ri[0].Re*ri[1].Im + ri[1].Re*ri[0].Im);

if ((ri[0].Re*ri[1].Im + ri[1].Re*ri[0].Im) < 0) printf("\n\t %1.4f - %1.4fi\n",\

ri[0].Re * ri[1].Re - ri[0].Im*ri[1].Im, -(ri[0].Re*ri[1].Im + ri[1].Re*ri[0].Im));

break;

252

case '/' :

if (ri[1].Re != 0 && ri[1].Im != 0) {

den = ri[1].Re*ri[1].Re + ri[1].Im*ri[1].Im;

num1 = (ri[0].Re*ri[1].Re - ri[0].Im*(-ri[1].Im))/den; num2 = (ri[0].Re*(-ri[1].Im) + ri[1].Re*ri[0].Im)/den; if (num2 >= 0)

printf("\n\t %1.4f + %1.4fi\n",num1, num2); if (num2 < 0)

printf("\n\t %1.4f - %1.4fi\n",num1, -num2);

}

else

printf("\n\t Ошибка! Деление на нуль.\n"); break;

default : printf("\n\t Ошибка! Неизвестный оператор.\n"); break;

}

}

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

Рис. 15.2. Результат действия над двумя комплексными числами

Задание2

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

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

3.Напишите программу ввода комплексных чисел в виде одной строки, например (4+5.5i) – первое вводимое число как строка, (2–3.3i) – второе вводимое число как строка. Предусмотрите также арифметические действия над комплексными числами.

4.Напишите программу возведения комплексного числа в степень (см. формулу бинома Ньютона).

253

Пример 3. Написать программу имитатора случайного таймера с помощью указателей на структуру [2].

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

#include <stdio.h>

#include <conio.h> #include <time.h> #include <stdlib.h>

// Глобальный шаблон структуры struct mtime

{

int hours;

// часы

int

minutes;

// минуты

int

seconds;

// секунды

};

//Прототипы вспомогательных функций void update (struct mtime *t); void display (struct mtime *t);

//Главная функция

int main (void) { int i;

//Создание переменной структурного типа struct mtime systime;

//Для изменения псевдослучайной последовательности srand((unsigned) (long)time(NULL));

//Начальная инициализация структурной переменной systime.hours = 0;

systime.minutes = 0; systime.seconds = 0;

//Цикл вывода расчетного времени

for (i = 0; i < 10; ++i) { update(&systime); display(&systime);

}

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

_getch(); return 0;

}

// 1-я вспомогательная функция void update (struct mtime *t) {

// Заполнение полей структуры случайными числами t -> hours = (int)(24*rand()/RAND_MAX);

t -> minutes = (int)(60*rand()/RAND_MAX); t -> seconds = (int)(60*rand()/RAND_MAX);

254

// Условия расчетного времени t -> seconds += 1;

if (t -> seconds == 60)

{ t -> seconds = 0; t -> minutes++; }

if (t -> minutes == 60)

{ t -> minutes = 0; t -> hours++; }

if (t -> hours == 24) t -> hours = 0;

}

// 2-я вспомогательная функция void display (struct mtime *t) {

printf("\n System time: "); printf("%02d:", t -> hours); printf("%02d:", t -> minutes); printf("%02d\n", t -> seconds);

}

В программе аргументами функций update() и display() являются указатели на структуру с дескриптором (этикеткой) mtime. При этом в главной функции main() создается структурная переменная systime по шаблону struct mtime и передается в функции update() и display() через свой адрес, т. е. &systime. Так происходит 10 раз (в цикле).

П р и м е ч а н и е . В прототипе функций указатели на структуру могут быть записаны в обезличенной форме, например

void update (struct mtime *); void display (struct mtime *);

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

Рис. 15.3. Пример вывода полей структуры на консоль

255

Задание3

1.Проверьте работу программы без начальной инициализации полей структурной переменной systime.

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

3.В программу добавьте нумерацию итераций цикла: 1), 2), , 10).

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

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

Создадим программу расчета средней успеваемости студента за последнюю экзаменационную сессию (или по другим экзаменам) с использованием структурного типа данных.

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

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

#define MAX 79

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

char name[MAX+1]; char surname[MAX+1]; char subject_1[MAX+1]; char subject_2[MAX+1]; char subject_3[MAX+1];

char subject_4[MAX+1]; int mark[4];

float mean;

} student = { // инициализация структурной переменной

"Peter",

"Bobrov",

"Mathematics",

"Informatics",

"Programming",

"Physics",

{0,0,0,0},

0.0f };

//Прототип вспомогательной функции

struct table infor(struct table student);

256

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

//Объявление и инициализация структурной переменной

struct table infor2 = {" "," "," "," "," "," ", {0,0,0,0},0.0f}; infor2 = infor(student); // присвоение структуры от функции

printf("\n The level of knowledge a student of %s %s is: \ %1.2f\n", infor2.name, infor2.surname, infor2.mean);

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

return 0;

}

//Вспомогательная функция с аргументом структурного типа

//и возвращающая структуру

struct table infor(struct table student) { float x = 0.0f;

int i;

printf("\n\t Enter a name: "); gets_s(student.name, MAX); printf("\t Enter a surname: "); gets_s(student.surname, MAX);

printf("\t Enter 1-st academic subject: "); gets_s(student.subject_1, MAX);

printf("\t Enter a mark in the first subject: "); scanf_s("%d",&student.mark[0]);

_flushall();

printf("\t Enter 2-nd academic subject: "); gets_s(student.subject_2, MAX);

printf("\t Enter a mark in the second subject: "); scanf_s("%d",&student.mark[1]);

_flushall();

printf("\t Enter 3-rd academic subject: "); gets_s(student.subject_3, MAX);

printf("\t Enter a mark in the third subject: "); scanf_s("%d",&student.mark[2]);

_flushall();

printf("\t Enter 4-th academic subject: "); gets_s(student.subject_4, MAX);

printf("\t Enter a mark in the fourth subject: "); scanf_s("%d",&student.mark[3]);

// Расчет средней оценки по 4 предметам for (i = 0; i < 4; ++i) {

x += student.mark[i]; student.mean = x/4;

}

// Возвращение структурной переменной return (student);

}

257

В программе приведена инициализация структурной переменной student для наглядности. Инициализация переменной типа float выполнена с суффиксом f. Присвоение одной структурной переменной другой может быть реализовано только в случае, когда они принадлежат одному и тому же шаблону структур. Функции _flushall() введены для того, чтобы устранить пустую строку перед использованием функции gets_s() (или gets()) после ввода с помощью функции scanf_s (или scanf()).

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

Рис. 15.4. Пример расчета средней успеваемости студента

Задание4

1.Проверьте содержимое структурной переменной student.

2.Вместо структурной переменной student в аргументе вспомогательной функции используйте собственную фамилию.

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

4.В программу добавьте вывод в главной функции main() всех полей структуры.

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

6.Проверьте работу программы без начальной инициализации структурной переменной.

7.Примените оператор typedef при создании шаблона структуры.

Пример 5. Написать программу, в которой функция возвращает указатель на структуру при поиске служебных слов языка С, вводимых с клавиатуры пользователем [3; 5].

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

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

258

#define MAX 1000

// Функция ввода строки с клавиатуры void getLine(char str[], int m) { int c, i;

for (i = 0; i < m-1 && (c = getchar())!= EOF && c != '\n'; i++) str[i] = c;

// После цикла

str[i] = '\0'; // завершение символом окончания строки

}

//Создание структуры глобального типа struct key

{

char *keyword;

//int keycount;

} tab[] = { "for",

"while",

"do",

"if",

"else",

"switch",

"case",

"break",

"default"

}, *bam;// указатель на структуру

//Вспомогательная функция

//с указателем на структуру key

struct key *PTR_ANALYSE(char *word, struct key tab[], int n)

{

int i;

struct key *PTR;

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

if (strcmp(tab[i].keyword, word) == 0) {

PTR = &tab[i];

// возвращение указателя на структуру типа key return (PTR); }

return NULL; // служебное слово не найдено

}

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

{

int c;

char str[MAX];

259

printf("\n The analysis of input of syntactic words\n of the programming language C\n\n");

printf("\n The end of the session: press Ctrl+Z after pressing

Enter\n\n");

// Цикл с постусловием do {

printf("\t Enter a new line: "); getLine(str, MAX);

printf(" ");

bam = PTR_ANALYSE(str, tab, 9); // 9 - число слов

if (bam != NULL)

printf("\t String found: %s\n press Enter to continue or Ctrl+Z to quit: ", bam->keyword);

else

printf("\t STRING NOT FOUND:\n press Enter to continue or Ctrl+Z to quit: ");

} while ((c = getchar()) != EOF);

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

_getch(); return 0;

}

В программе ввод слов осуществляется посимвольно с помощью специальной функции getLine(). Шаблон структуры – это struct key, для него определяется переменная tab[] как массив структур. Одновременно создается указатель на эту структуру *bam.

Функция struct key *PTR_ANALYSE() возвращает указатель на структуру. Параметрами этой функции являются указатель на тип char, массив структур и целая переменная. Цикл do – while применен для того, чтобы тело цикла выполнялось хотя бы один раз. Массив структур с именем tab[] инициализирован служебными словами – операторами управления. Результат выполнения функции struct key *PTR_ANALYSE() присваивается указателю *bam, который определен по шаблону глобальной структуры.

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

260

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