Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные по программированию.doc
Скачиваний:
37
Добавлен:
29.02.2016
Размер:
1.78 Mб
Скачать

Задания1

Напишите программу для расчета по двум формулам. Предварительно подготовьте тестовые примеры по второй формуле с помощью калькулятора (результат вычисления по первой формуле должен совпадать со второй). Для использования математических функций необходимо подключить к программе заголовочный файл <math. h>

Функция

Выполняемые действия

Abs(n)

Возвращаемый модуль целого числа

fabs (x)

Возвр. модуль вещественного числа

acos(x)

asin(x)

atan (x)

atan 2(x)

Arcos x

Arsin x

Arctg x

Возвращаем arctg x/y

cos(x)

sin(x)

tan(x)

exp(x)

log(x)

log10(x)

pow(x,y)

sqrt(x)

Cos x

Sin x

Tag x

Степень числа е

Натуральный логарифм

Логарифм по основанию 10

Возводит число х в степень у

Квадратный корень из числа

1

2

3 10

4

5

6

7

8

Лабораторная работа № 2

Тема: «Работа с главным меню системы Visual C++. Изучение базовых типов данных. Форматированный ввод- вывод информации.»

  1. Цель работы

    1. Изучение интегрированной среды Visual C++ 6.0

    2. Освоение простейшей структуры программы на языке С++.

    3. Получение навыков в организации ввода-вывода на языке С++.

    4. Изучить базовые типы данных языка С++.

  1. Техническое обеспечение

    1. Персональная ЭВМ

    2. Клавиатура.

    3. Дисплей.

    4. Печатающее устройство.

  1. Программное обеспечение

    1. Операционная система Window

    2. Система программирования Visual C++ версия 6.0 или Borland C++ версия 3.1 и более поздние версии.

  1. Постановка задачи

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

  1. Содержание отчета

    1. Тема и цель работы.

    2. Постановка задачи.

    3. Текст программы.

    4. Результаты выполнения программы.

  1. Общие сведения

Решение самой простой задачи на ЭВМ не обходится без операций ввода и вывода информации. Ввод данных – это передача информации от внешнего носителя в оперативную память для последующей обработки с преобразованием ее в двоичный код. Внешним носителем информации при вводе может быть клавиатура, гибкий или жесткий магнитный диск и другие устройства. Вывод – обратный процесс, когда данные передаются после обработки из оперативной памяти на внешний носитель с преобразованием ее из двоичного кода в вид, понятный пользователю. Внешним носителем при выводе может служить дисплей, печатающее устройство, гибкий или жесткий магнитный диск или другие устройства.

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

С не предусматривает никаких предопределенных структур файлов: файлы рассматриваются как последовательности байтов.

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

    1. Консольный ввод-вывод

Консольный ввод-выводотносится к событиям, возникающим от клавиатуры и на экране. Поскольку ввод и вывод на консоль – это типичные операции, была создана подсистема файловой системы ввода-вывода для работы исключительно с консолью. Эти функции направляют операции в стандартный ввод (stdin) и стандартный вывод (stdout) системы. Возможно перенаправить консольный ввод на другие устройства. Для простоты предполагается, что консоль – это устройство, используемое стандартными способами.

      1. Чтение и запись символов

Простейшей из стандартных функций ввода-вывода на консоль является getchar(), читающая символы с клавиатуры, иputchar(), печатающая символ на экран в текущей позиции курсора. Тем не менееgetchar() имеет некоторые существенные ограничения, описываемые ниже. ВBorlandCдобавлена функцияgetche(), которая читает символ с клавиатуры без ожидания нажатия клавиши <Enter>. Ниже показаны прототипы функцийgetchar(),getche()иputchar():

int getchar(void);

int getche(void);

int putchar(int ch);

Функция getchar()читает символ с клавиатуры и ожидает нажатие <Enter>. Функцияgetche()читает символ с клавиатуры и не ожидает нажатие <Enter>. Функция возвращает значениеchв случае успеха илиEOFв случае ошибки (EOF– это макроопределение, означающее конец файла). Функцииgetchar()иputchar()требуют заголовочного файлаstdio.h. Функцияgetche()требует заголовочного файлаconio.h. Следующий пример программы вводит символы с клавиатуры и выводит их в противоположном регистре. То есть прописные символы будут выведены строчными, а строчные – прописными. Программа останавливается при обнаружении точки. Заголовочный файлctype.hсодержит прототипы функций для обработки символов.

/* переключатель регистра */

#include<conio.h>

#include <stdio.h>

#include <ctype.h>

int main(void) {

char ch;

do {

ch=getche();

if(islower(ch)) putchar(toupper(ch));

else putchar(tolower(ch));

} while(ch!=’.’); /* использование точки для остановки */

}

      1. Чтение и запись строк

Функции gets()иputs()позволяют читать строки с клавиатуры и выводить их на экран.

Функция gets() читает строку символов, введенных с клавиатуры и помещает их по адресу, указанному в аргументе. Можно набирать символы, пока не нажата клавиша < >. Символ, соответствующий клавишеEnter – возврат каретки – не станет частью строки. Функцияgets()имеет прототип:

char *gets(char *str);

где str– это массив символов. Функцияgets()возвращает указатель наstr. Следующая программа осуществляет чтение строки в массивstrи выводит ее длину:

#include <stdio.h>

#include <string.h>

int main(void)

{

char str[80];

gets(str);

printf(“Length is %d”,strlen(str));

}

Имеется проблема, связанная с gets(), о которой следует знать: нельзя переходить границы массива, с которым она вызывалась. Для предыдущего примера это 80.

Функция puts()выводит передаваемый ею аргумент на экран, завершая вывод переходом на новую строку. Она имеет следующий прототип:

int puts(const char *str);

Здесь str– выводимая строка. Функция возвращает нецелое число в случае удачи иEOFв случае неудачи. Она воспринимает коды и с обратным слэшем, как иprintf(), например\tвоспринимается как табуляция. Вызов функцииputs()требует гораздо меньше процессорного времени на реализацию, чемprintf(). Она не может выводить числа и выполнять преобразование форматов.

    1. Форматированный консольный ввод-вывод

Стандартная библиотека языка С содержит две функции, выполняющие форматированный ввод и вывод стандартных типов данных: scanf()иprintf(). Термин форматированный подразумевает , что эти функции могут читать или писать данные в различных форматах, которыми можно управлять. Функцияprintf()используется для вывода данных на экран, – для чтения данных с клавиатуры. Какprintf(), так иscanf() могут работать с любыми стандартными типами, включая символы, строки и числа.

      1. Форматированный вывод

Функция printf() имеет следующий прототип:

int printf(const char *форматная_строка, …);

Первый аргумент форматная_строкаопределяет способ вывода последующих аргументов. Он часто называется форматной строкой и содержит два типа элементов: символы, выводимые на экран и спецификаторы формата, определяющие способ вывода аргументов, следующих за форматной строкой. Спецификаторы формата начинаются со знака “%”, за которым следует код формата. Спецификаторы формата приведены в таблице 1. Должно быть полное соответствие между числом аргументов и числом спецификаторов формата, а также спецификаторы формата и аргументы должны соответствовать друг другу слева направо. Например, вызов:

printf(“Hi%c%d%s”, ‘c’,10, “there!”0;

отобразит на экране «Hic10there!». Функцияprintf()возвращает число напечатанных символов. В случае ошибки она возвращаетEOF.

Таблица 1 – Спецификаторы формата функции printf()

Код

Формат

%c

%d

%i

%е

%Е

%f

%g

%G

%o

%s

%u

%x

%X

%p

%n

%%

Символ

Знаковое десятичное целое число

Знаковое десятичное целое число

Научная нотация (е– строчная)

Научная нотация (Е– прописная)

Десятичное число с плавающей точкой

Использует или %e, или %f, соответствующее более короткому представлению

Использует или %E, или %F, соответствующее более короткому представлению

Беззнаковое восьмиричное число

Строка символов

Беззнаковое десятичное число

Беззнаковое шестнадцатиричное число (строчные буквы)

Беззнаковое шестнадцатиричное число (прописные буквы)

Вывод указателя

Ассоциированный аргумент – это указатель на целое, в которое записывается число уже введенных символов

Выводит знак %

Печать символов

Для печати отдельных символов используйте спецификатор %c. Это приводит к выводу соответствующего аргумента в немодифицированном виде на экран.

Для печати строки используйте спецификатор %s.

Вывод чисел

Можно использовать или спецификатор %d, или спецификатор %iдля отбрахения знакового десятичного целого числа. Эти форматы эквивалентны и присутствуют оба по историческим причинам.

Для вывода беззнакового значения надо использовать спецификатор %u.

Спецификатор формата %fпозволяет отображать числа с плавающей точкой.

Спецификаторы %eи %Eсообщаютprintf()о небходимости вывода вещественного числа в научной нотации. Числа, представленные в научной нотации, имеют вид:

x.dddddE+/-yy.

Если необходимо вывести символ «Е», используйте %Е, иначе используйте %е.

Можно указать функции printf()использовать %fили %е, используя спецификаторы формата %gили %G. В результате этогоprintf()выбирает спецификатор формата, приводящий к более короткой форме выдачи информации. Если необходимо, чтобы в научной нотации присутствовало «Е», используйте %G, иначе - %g.

Можно отображать беззнаковые целые в восьмиричном или шестнадцатиричном форматах, используя %ои %хсоответственно. Поскольку шестнадцатиричные числа используют буквы от А доFдля представления чисел от 10 до 15, следует использовать спецификатор формата %Х для вывода прописных букв, а %х- для строчных.

Вывод адресов

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

#include <stdio.h>

int sample;

int main(void);

{

printf(“%p”, &sample);

{

Спецификатор %n

Спецификатор формата %nотличается от других спецификаторов. Вместо того, чтобы говоритьprintf()о необходимости вывода чего-нибудь, он заставляетprintf()инициализировать переменную, на которую указывает аргумент, соответствующий данному спецификатору, значением, равным числу уже введенных символов. Другими словами, значение, соответствующее спецификатору формата %n, должно быть указателем на переменную. После того, какprintf()завершит работу, переменная будет содержать число введенных символов до момента, когда был встречен. Следующая программа иллюстрирует применение спецификатора %n:

#include <stdio.h>;

int main(void)

{

int count;

printf(“this%n is a test\n”, &count);

printf(“%d”, count)

}

Программа выводит в первой строке this is a test, а во второй строке число 4. Спецификатор %nиспользуется, как правило, для выполнения динамического форматирования.

Спецификатор минимума ширины поля

Целое число, помещаемое между знаком % и кодом формата, рассматривается как спецификатор минимума ширины поля. Он добавляет к выводу пробелы, для обеспечения некоторой минимальной длины. Если строка чисел длиннее, чем этот минимум, то она будет выводится без отсечений. По умолчанию для достижения необходимой длины строка дополняется пробелами. Если необходимо выводить не пробелы, а нули, следует поставить ноль перед спецификатором ширины поля. Например, спецификатор %05dбудет выводить числа, длиной меньше пяти символов с впереди стоящими нулями, чтобы полная длина была пять. Следующая программа демонстрирует использование спецификатора минимума длины поля:

#include <stdio.h>

int main(void)

{

double item;

item = 10.12304;

printf(“%f\n”,item);

printf(“%10f\n”,item);

printf(“%012f\n”,item);

}

В результате работы данной программы получаем:

10.123040

10.123040

00010.123040

Спецификатор точности

Спецификатор точностиследует за спецификатором минимума ширины поля (если он есть). Он состоит из точки, за которой следует целое число. Его точное значение зависит от типа данных, к которым он применяется.

При применении спецификатора точности к вещественным данным, используя спецификаторы %f, %eили %Е, он определяет число выводимых цифр в дробной части. Например, %10.4fвыводит числа, по крайней мере, с длиной строки в 10 символов, причем под дробную часть отводится 4 символа. Если не указать точность, то по умолчанию используется шесть символов.

Когда спецификатор точности применяется к %gили %G, он определяет число значимых цифр.

Применение спецификатора точности к строкам ограничивает длину строки. Например, %5.7sдлиннее, чем максимальная указанная ширина, оставшиеся символы отбрасываются.

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

Следующая программа иллюстрирует применение спецификатора точности:

#include <stdio.h>

int main(void)

{

printf(“%.4f\n”, 123.1234567);

printf(“%3.8d\n”, 1000);

printf(“%10.15s\”, “This is a simple test”);

}

В результате работ программы получаем:

123.1235

00001000

This is a simpl

Выровненный вывод

По умолчанию все выводимое выравнивается по правому краю. То есть, если поле имеет ширину, большую чем выводимые данные, то данные размещаются с правого края поля. Можно выводить информацию с левого края, поместив знак минус сразу после %. Например, %-10.2fприведет к выравниванию по левому краю вещественного числа с двумя знаками после запятой в 10-символьном поле.

Работа с другими типами данных

Имеется два модификатора формата, позволяющие функции printf()выводить короткие и длинные целые. Эти модификаторы могут применяться к спецификаторам типаd,i,o,u,x. Модификаторlсообщает функцииprintf()о том, что далее будет следовать длинный тип данных. Например, %ldозначает, что будет выводится значение типаlong int. Модификаторhговорит функцииprintf() о необходимости вывода коротких целых. Например, %huвыводит данные типаshort unsigned int.

Модификатор Lможет стоять перед спецификатором плавающего типаe,fиg, тем самым указывая, далее следуют переменные типаlong double.

Модификаторы * и #

Функция printf()поддерживает два дополнительных модификатора для некоторых спецификаторов формата: * и # .

Помещение # перед g,G,f,eилиЕобеспечивает наличие десятичной точки в случае отсутствия дробной части. Если перед спецификатором форматахилиХпоставить #, то шестнадцатиричное число будет печататься с префиксом 0х. Если перед спецификаторомопоместить #, то выведенное число будет иметь в начале0. Нельзя применять # к остальным спецификаторам формата.

Помимо констант, спецификаторы минимальной ширины поля и точности могут предоставляться аргументами функции printf(). Для реализации этого следует использовать*. Когда форматная строка сканируется, функция будет сопоставлять со звездочкой аргументы в порядке появления. Например, для следющего вызова функции

printf(“%*.*f”,10,4, 123.3);

минимальная ширина поля равна 10, точность – 4, а вводимое значение – 123.3.

      1. Форматированный ввод

Стандартный ввод с клавиатуры, как правило, осуществляется с помощью функции scanf().Она читает все стандартные типы данных и автоматически преобразует числа к правильному внутреннему формату. Она чем-то похожа на функциюprintf(). Стандартный видscanf()следующий:

int scanf(const char *форматная_строка, …);

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

Форматная строка состоит из трех типов символов:

  • Спецификаторы формата

  • Специальные символы

  • Стандартные символы

Функция scanf() возвращает число введенных полей. Она возвращаетEOF, если обнаруживается преждевременный конец файла.

Спецификаторы формата

Перед спецификаторами формата ввода ставится знак %, и они сообщают функции scanf() о типе читаемых далее данных. Эти спецификаторы перечислены в таблице 2. Спецификаторы формата рассматриваются слева направо, и в таком же порядке с ними сопоставляются аргументы из списка аргументов.

Таблица 2 – Спецификаторы формата функции scanf()

Код

Значение

%c

%d

%i

%е

%f

%g

%o

%s

%u

%x

%p

%n

%[]

Читает одиночные символы

Читает десятичное число

Читает десятичное число

Читает число с плавающей точкой

Читает число с плавающей точкой

Читает число с плавающей точкой

Читает восьмеричное число

Читает строку

Читает беззнаковое целое

Читает шестнадцатиричное число

Читает указатель

Получает целочисленное значение, равное числу прочитанных символов

Сканирует множество символов

Ввод чисел

Традиционно для чтения десятичного числа используются спецификаторы %dили %i.

Для чтения числа с плавающей точкой, представленного в стандартной или научной нотации, используются спецификаторы %e, %f или %g.

Можно использовать scanf()для чтения целых чисел в восьмеричном или шестнадцатиричном формате, используя спецификаторы %ои %хсоответственно. %хможет быть записан как строчными, так и прописными буквами. Следующая программа осуществляет ввод восьмеричного и шестнадцатиричного чисел:

#include <stdio.h>

int main(void)

{

int i, j;

scanf(“%o%x”, &i, &j);

printf(“%o %x”, i, j);

}

Ввод беззнаковых целых

Для ввода беззнаковых целых используется спецификатор формата %u. Например:

unsigned num;

scanf(“%u”, &num);

Чтение одиночных символов

Как показано ранее, можно читать отдельные символы, используя функции getchar()илиgetche().Для этих целей также можно использовать иscanf(), для чего нужно указать спецификатор формата %с.

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

scanf(“%c%c%c”, &a, &b, &c);

вернет символ хва, пробел вbи символувс.

Чтение строк

Функция scanf()может использоваться для чтения строк и потока ввода, для чего надо указать спецификатор формата %s. %sзаставляет функциюscanf()читать символы, пока не встретится специальный символ. Прочитанные символы помещаются в массив символов, на который указывает соответствующий аргумент, и результат завершается нулевым пробелом. Применительно кscanf()специальные символы – это пробел, новая строка, табуляция, вертикальная табуляция или перевод формата. В противоположностьgets(),которая читает строку, пока не встретиться возврат каретки (нажатие <Enter>), функцияscanf()читает строку до первого специального символа. Это означает, что нельзя использоватьscanf()для чтения строки типа «this is a test», поскольку первый пробел завершит процесс ввода.

Ввод адреса

Для ввода адреса следует использовать спецификатор формата %р. Данный спецификатор позволяет функцииscanf() читать адрес в формате, определяемом архитектурой процессора. Например, следующая программа читает адрес и отображает содержимое по этому адресу:

#include <stdio.h>

int main(void)

{

char *p;

printf(“Enter an adress: ”);

scanf(“%p”, &p);

printf(“Value at location %p is %c\n”, p, *p);

}

Спецификатор %n

Спецификатор %nговорит функцииscanf()о необходимости присвоения переменной, на которую указывает соответствующий аргумент, числа прочитанных символов из потока ввода на момент обнаружения %n.

Использование множества сканирования

Функция scanf()поддерживает спецификатор формата общего назначения, называемый множеством сканирования.Множество сканированияопределяет набор символов. Когдаscanf()обрабатывает множество сканирования, она вводит символы до тех пор, пока символы являются частью множества сканирования. Читаемые символы сохраняются в символьном массиве, на который указывает соответствующий аргумент. Для определения множества сканирования необходимо поместить сканируемые символы в квадратные скобки. Открываемой квадратной скобке должен предшествовать %. Например, следующее множество сканирования сообщает функцииscanf()о необходимости только чтения символовX,YиZ:

%[XYZ]

При использовании множества сканирования функция scanf()продолжает читать символы и помещает их в соответствующий массив символов, пока не встретится символ, не принадлежащий множеству сканирования. После возврата каретки изscanf()массив будет содержать оканчивающуюся нулевым символом строку, состоящую из введенных символов. Чтобы понять, как это работает, рассмотрим программу:

#include <stdio.h>

int main(void)

{

int i;

char str[80], str2[80];

scanf(“%d%[abcdefg]%s”, &i, str, str2);

printf(“%d %s %s”, i, str, str2);

}

Введем 123abcdtye, после чего нажмем <Enter>. Программа отобразит123 abcd tye. Поскольку символ «t» не является частью множества сканирования, scanf()останавливает чтение символов вstr при обнаружении «t». Оставшиеся символы помещаются вstr2.

Можно указать диапазоны множества сканирования, используя дефис. Например, следующая команда говорит функции scanf()о необходимости чтения символов от «А» до «Z»:

%[A-Z]

Пропуск нежелательных специальных символов

Специальный символ в управляющей строке заставляет scanf()пропустить один или несколько специальных символов из потока ввода. Специальные символы – это пробел, табуляция, вертикальная табуляция, перевод формата и новая строка. В сущности, один специальный символ в управляющей строке заставляет функциюscanf()прочитать, но не сохранить любое число (включая ноль) до первого обычного символа.

Обычные символы в управляющей строке

Обычные символы в управляющей строке заставляют функцию scanf()читать и отбрасывать соответствующие символы из потока ввода. Например, “%d,%d” заставляет функциюscanf()прочитать целое число, прочитать и пропустить запятую, а затем начать читать другое целое число. Если указанный символ не найден, то функцияscanf()завершает работу.

В scanf() следует передавать адреса

Все переменные, используемые для получения значений из , должны передавться в виде адресов. Это означает, что все аргументы должны быть указателями на переменные, используемые как аргументы. Например, для чтения целого в переменную countнадо использовать следующий вызовscanf():

scanf(“%d”, &count);

Строки будут читаться в массивы символов, причем имя массива (без индексов) является адресом первого элемента массива. Таким образом, для чтения строки в символьный массив strследует использовать

scanf(“%s”, str);

В данном случае strявляется указателем и нет необходимости ставить перед ним оператор&.

Модификаторы формата

Как функция printf(), так и функция scanf()допускают наличие нескольких спецификаторов формата, немного изменяющих ввод.

Спецификаторы формата могут содержать модификатор максимальной длины поля. Это целое число, помещаемое между % и спецификатором формата, ограничивающее число символов, читаемых в поле. Например, для чтения не более 20 символов в strследует написать:

scanf(“%20s”, str);

Если поток ввода содержит более 20 символов, последующее обращение к вводу начнется с места, где было завершено предыдущее обращение. Например, если ввести

ABCDEFGHIJKLMNOPQRSTUVWXYZ

В ответ на запрос функции , приведенной в предыдущем примере, в strпоместятся только 20 символов (включая «Т») из-за наличия спецификатора максимальной ширины поля. Это означает, что оставшиеся символыUVWXYZне были использованы. Если вызвать еще одну scanf(), например:

scanf(“%s”, str);

То буквы UVWXYZпоместятся вstr. Вод в поле может окончится до достижения максимальной длины поля, если обнаружится специальный символ. В данном случаеscanf()переходит к следующему полю.

Для чтения длинных целых следует поместить lперед спецификатором формата. Для чтения коротких целых следует поместитьhперед спецификатором формата. Данные модификаторы могут использоваться с кодами форматаd,i,o,uих.

По умолчанию спецификаторы f,eиgсообщают о необходимости присвоения данной переменной типуfloat. Если поместить перед одним из этих спецификаторовl, тоscanf()присвоит данные типуdouble. ИспользованиеLсообщает о необходимости представления полученных данных какlong double.

Подавление ввода

Можно заставить scanf()прочитать поле, но не присвоить его какой-либо переменной, поставив перед кодом формата поля *. Например, имея

scanf(“%d%*c%d”, &x, &y);

можно ввести пару координат 10,10. Запятая будет корректно прочитана, но ничему не присвоена. Подавление присваивания особенно полезно, когда необходимо обработать только часть вводимой информации.