Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Спецификатор Тип выводимой информации

Поиск

 

%d,%i Десятичное целое число

%c Один символ

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

%f,%F Число с плавающей точкой, десятичная запись

%e,%E Число с плавающей точкой, экспоненциальная запись

%u Десятичное целое число без знака.

%o Восьмеричное число без знака.

%x,%X Шестнадцатеричное число без знака.

 

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

Пример.

int a = 5, b = 7;

printf(“Результаты: \n”);

printf(“сумма %d и %d равна %d\n”, a, b, a + b);

 

Кратко о необязательных полях спецификации преобразования:

Флаги служат для выравнивания выводимых данных (минус – по левой границе

поля вывода) и управления печатью знаков (пробел, +, –) перед числом.

Пример. printf(“%-20s\n”, fio);

Ширина определяет минимальную ширину поля вывода. Параметр игнорируется,

если выводимое значение не помещается в отведённое поле.

Пример. printf(“%5d”, 127);

Точность задаёт количество цифр в дробной части числа с плавающей точкой;

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

Пример.

float z=123.4567;

printf(“%8.2f”, z);

printf(“%20.3s\n”, “математика”);

Из модификаторов будем использовать только l для представления “длинных” типов (long, doubleL для long double.

Пример.

long alng=1234567890; double fdbl=987654321.12345678;

printf(“%ld\t %lf\n”,alng, fdbl);

 

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

 

scanf (форматная_строка, список_адресов_переменных);

 

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

Спецификация преобразования чаще всего имеет вид:

 

%[ширина] [модификатор] спецификатор

 

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

Модификатор. Нами будет использован только модификатор l (см. описание функции printf()).

Спецификаторы. Для ввода числовых данных чаще всего используют: %d, %u, %f, %e; для ввода символов - %с; для ввода строк - %s.

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

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

Замечание. Ширину поля вывода и точность в спецификации формата можно задавать и с помощью переменных, значения которых определяются, быть может, в процессе выполнения программы. Для этого в спецификации формата вместо полей ширина и точность ставят символ *, которым в списке вывода соответствуют имена упомянутых переменных. Например, для вставки в поле вывода переменного количества пробелов перед выводом символа @ можно поступить следующим образом:

 

int W;

printf ("Укажи количество пробелов ");

scanf ("%d", &W);

printf ("%*c", W, '@');

 

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

 

#include <conio.h>

#include<stdio.h>

void main()

{ clrscr(); //Очистка экрана

int width, precis;

double pi=3.1415926536;

printf("Введи ширину поля вывода ");

scanf("%d",&width);

printf("Введи точность ");

scanf("%d",&precis);

printf("pi= % *. * lf\n", width, precis, pi);

getch();

}

 

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

 

#include <conio.h>

#include<stdio.h>

void main()

{ clrscr(); //Очистка экрана

int n;

printf("Введи 3 целых числа ");

scanf("%*d %*d %d",&n);

printf("Последнее число есть %d\n ",n);

getch();

}

 

Протокол работы программы:

 

Введи 3 целых числа 333 666 999

Последнее число есть 999

 

 

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

 

 

Реализуем рассмотренный ранее пример вычисления площади и периметра треугольника с использованием ввода-вывода с стиле языка С.

 

#include <conio.h>

#include <stdio.h>

#include <math.h>

void main()

{

float a,b,c,s,p;

printf("Введи через пробел a, b\n ");

scanf("%f %f",&a, &b);

s = 0.5*a*b;

c = sqrt(a*a + b*b);

p = a + b + c;

printf("Площадь = %10.2f\n",s);

printf("Периметр = %10.2f\n",p);

}

 

О проблеме вывода текста на русском языке.

 

В среде Windows при подготовке текстов программ для кодировки символов используется стандарт ANSI. Отладку и выполнение программ как в среде Visual Studio 2008 (2010), так и в среде Borland C++ Builder мы собираемся осуществлять в режиме консольных приложений. Но дело в том, что в режиме консольного приложения используется кодировка символов в стандарте ASCII. Что касается кодировки латиницы, то она одинакова и в ASCII, и в ANSI, а вот кодировка кириллицы различна. Именно этим и объясняется, что в ранее приведенных примерах вместо нормальных фраз русского языка на экран выводятся какие-то странные символы.

Для вывода на экран сообщений на русском языке в среде Visual Studio 2008(2010) воспользуемся следующим приемом. Сначала выполним так называемую локализацию выходного потока с установкой кодовой страницы России:

 

wcout.imbue (locale (“rus_rus.866”));

 

После этого всюду в тексте программы для вывода строки символов на русском языке будем использовать объект wcout вместо cout с символом L перед строкой-литералом:

 

wcout << L”Добро пожаловать в Visual Studio 2010”<<endl;

 

 

Гораздо удобней для вывода на экран сообщений на русском языке в среде Visual Studio 2008 выполнить локализацию выходного потока с установкой кодовой страницы России следующим образом:

 

setlocale (NULL, “.1251”);

 

После этого вывод текста на русском языке всеми доступными средствами осуществляется уже без проблем (в частности, оператором cout), например:

 

cout << ”Добро пожаловать в Visual Studio 2008”<<endl;

puts (”Добро пожаловать в Visual Studio 2008”);

 

К сожалению, теперь возникают проблемы со вводом текста на русском языке.

 

Еще один вариант вывода (и ввода!) текста на русском языке: выполнить локализацию выходного потока с установкой кодовой страницы России следующим образом:

system("chcp 1251");

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

СВОЙСТВА ->ШРИФТЫ с ТОЧЕЧНЫХ заменить на LUCIDA CONSOLE.

 

 

Для нормального вывода на экран фраз на русском языке в среде Borland C++ Builder 6 будем использовать готовую функцию rus() (см. ниже), которая используется для перекодировки ANSI-строки в ASCII-код для вывода сообщений на русском языке. И хотя, быть может, эта функция не очень понятна (т.к. мы еще не изучали указатели), будем смело использовать её в наших программах, предварительно подключив её код с помощью препроцессорной команды, например:

 

#include "d:\\My_C_Builder_6\\rus.h"

Здесь мы явно указали путь к каталогу, где постоянно хранится функция rus().

 

Рассмотрим снова пример, уже обсуждавшийся ранее (см. раздел 1. “ Структура программ на языке C/C++”).

 

// Программа отлажена в Borland C++ Builder 6

//---- используется функция rus перекодировки ANSI-строки ---

// в ASCII-код для вывода сообщений на русском языке

#pragma hdrstop

#include <stdio.h>

#include <iostream.h>

#include <conio.h>

const double PI=3.14159;

#define DEZL "C++ - это круто!"

 

#pragma argsused

 

#include "d:\\My_C_Builder_6\\rus.h"

 

int main()

{ char name[15]; int r;

double c, s;

clrscr();

cout<<rus(DEZL)<<endl;

cout<<rus("Как тебя зовут? "); cin>>name;

cout<<rus("Привет, ")<<name<<endl;

cout<<name<<rus(", введи радиус ==>");

cin>>r;

c= 2*PI*r; s=PI*r*r;

cout<<rus(" Площадь круга = ")<<s<<'\n';

cout<<rus(" Длина окружности = ")<<c<<'\n';

getch();

return 0;

}

 

/*

char* rus(char* st) //функция rus

{

unsigned char* p = st; // при объявлении символов как char русские

// буквы кодируются отрицательными числами

while (*p)

{

if (*p >= 192) // здесь русская буква

if (*p <= 239) // А,Б,... Я,а,б,... п

*p -= 64;

else // р...я

*p -= 16;

p++;

}

return st;

}

*/

 

 


 



Поделиться:


Последнее изменение этой страницы: 2016-12-16; просмотров: 463; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.219.13.244 (0.008 с.)