Функции преобразования строки в число
Используются в качестве операторов для преобразования символьной строки в число соответствующего типа (atoiцелого, atol длинного целого, atofвещественного двойной точности). Структура функции:
имя (string);
где имя – обозначение функции (atoi, atol, atof);
string – аргумент (строка, подлежащая преобразованию);
( ) – ограничители аргумента;
; – символ оператора.
Все функции располагаются в стандартной библиотеке stdlib.h. Функция atof продублирована в библиотеке math.h.
Внимание!
Использование функций требует предварительного под
ключения конкретной библиотеки (универсально –
stdlib.h):
#include <stdlib.h>
или
#include <math.h>
Аргумент string требует описателя до его использования:
char *string /* размер строки не определен*/
или
char string [10] /* размер зафиксирован
(10 символов)*/
Правила записи и использования
Функции обязательны при вводе данных с использованием графического интерфейса.
String – последовательность символов конкретного поля, заменяемых числовым значением определенного типа.
Функция atof предполагает использование строки со структурой стандартной записи числа с фиксированной (плавающей) точкой:
[ПС][знак][мантисса] [e|E [знак] степень]
где ПС – пустая строка (пробелы, знаки табуляции);
знак – обозначение "+" или "–";
мантисса – десятичные цифры с разделителем.
e (E) – обозначение основания системы счисления;
степень – показатель степени (целое число со знаком);
[ ] – признак необязательности содержимого.
5 Функции atoi и atol предполагают в качестве аргумента структуру стандартного целого числа (с учетом начальных пробелов):
[ПС][знак] число
где ПС – пустая строка (пробелы, знаки табуляции);
знак – обозначение "+" или "-";
число – последовательность цифр, образующих целочисленное значение.
Невозможность преобразования аргумента в значение данного типа подтверждается возвращаемым значением 0 (0L для atol).
Использование в качестве аргумента чисел, превышающих диапазон каждого типа, приводит к переполнению. Возвращаемое значение не определено.
Общий вид фрагмента программы ввода трех переменных:
#include <stdlib.h> /* директива препроцессора*/
…
float n1; /*описатель переменной n1 */
int n2; /*описатель переменной n2 */
long n3; /*описатель переменной n3 */
char buf[10]; /*описатель создаваемого массива buf */
…
PoleN1–>GetText(buf, 10); /*перемещение данного в buf*/
n1=atof(buf); /*преобразование в вещественный тип*/
PoleN2–>GetText(buf, 10); /*перемещение данного в buf*/
n2=atoi(buf); /*преобразование в целый тип*/
PoleN3–>GetText(buf, 10); /*перемещение данного в buf*/
n3=atol(buf); /*преобразование в длинный целый тип*/
…
Описатели типа переменных определяют переменную n1 как вещественную с обычной точностью, n2 – как целую, n3 – длинную целую, а buf как одномерный массив длиной 10 символов.
Восьмая, десятая и двенадцатая строки предписывают последовательное копирование содержимого полей ввода с именами PoleN1, PoleN2, PoleN3 в символьную строку buf, длиной 10 символов. Девятая, одиннадцатая, тринадцатая – последовательное преобразование символьной строки buf в формат вещественного числа n1, целого n2 и длинного целого n3.
Методика ввода переменных в диалоговые поля (при машинной обработке):
установить курсор в поле ввода (клавишей Tab или мышью);
ввести последовательность цифр и знаков числа;
проконтролировать правильность ввода, откорректировав при необходимости;
повторить ввод последующих переменных;
дать команду на выполнение (нажатием кнопки ОК).
Пример 6.6. Организовать ввод вещественных переменных а = 15.8, b = 0.365е-2, целой переменной i = -1.
Фрагмент программы имеет вид:
#include <stdlib.h> /* директива препроцессора*/
…
float а,b; /*описатель переменных а и b */
int i; /*описатель переменной i */
char buf[12]; /*описатель массива buf */
…
PoleA–>GetText(buf, 12);/*перемещение данного а в buf*/
a=atof(buf); /*преобразование в вещественный тип*/
PoleB–>GetText(buf, 12);/*перемещение данного b в buf*/
b=atof(buf); /*преобразование в вещественный тип*/
PoleI–>GetText(buf, 12); /*перемещение данного i в buf*/
i=atoi(buf); /*преобразование в целый тип*/
…
Размер буфера выбран с учетом возможных изменяемых значений вводимых переменных.
Пример 6.7. Организовать ввод вещественного массива А[4] с данными а1=2.1, а2=5.6, а3=7.5, а4=16.
Фрагмент программы имеет вид:
#include <stdlib.h> /* директива препроцессора*/
…
float а [4]; /*описатель переменных массива А */
int i; /* описатель переменной параметра цикла*/
char buf[10]; /*описатель массива buf */
…
for(i=0; i < 4; i++)
{
PoleA–>GetLine(buf, 10, i); /*перемещение а(i) в buf*/
a[i]=atof(buf);/*преобразование в вещественный тип*/
}
…
Внимание! Использование многострочного активного окна для ввода значений массивов требует предварительной установки его свойств Multiline (многострочное) и Want Return (возвращает значение) на этапе машинной обработки.
Функции преобразования числа в строку
Используются в качестве операторов для преобразования числа соответствующего типа (itoaцелого, ltoa длинного целого, gcvtвещественного двойной точности) в символьную строку.
Функция gcvt
Используется в качестве оператора для преобразования вещественного числа двойной точности в символьную строку. Структура оператора:
gcvt(имя, размер, buffer);
где gcvt – обозначение функции;
имя – обозначение преобразуемого (выводимого) данного вещественного типа;
размер – количество выводимых значащих разрядов данного;
buffer – имя формируемой (выводимой) строки;
( ) – ограничители аргумента;
; – символ оператора.
Функция располагается в библиотеке stdlib.h.
Правила записи и использования
Функция применяется при выводе вещественных данных в поля графического интерфейса.
Имя преобразуемого данного – аналог обозначения выводимой переменной.
Размер буфера – целое число, определяющее длину выводимой строки (без учета нулевых символов справа/слева от значащих цифр).
Переполнение буфера не контролируется.
Возникновение ошибок подтверждается отсутствием возвращаемого значения.
Функции itoa / ltoa
Используются в качестве операторов для преобразования целого /длинного целого числа в символьную строку.
Структура оператора:
ИФ (имя, buffer, ОСЧ);
где ИФ – имя функции (itoa, ltoa);
имя – обозначение преобразуемого (выводимого) данного целого/длинного целого типа;
buffer – имя формируемой (выводимой) строки;
ОСЧ – основание системы счисления выводимого данного;
( ) – ограничители аргумента;
; – символ оператора.
Функции располагаются в библиотеке stdlib.h.
Правила записи и использования
Функции применяются при выводе целочисленных данных в поля графического интерфейса.
Имя преобразуемого данного – аналог обозначения выводимой переменной.
Размер формируемого буфера определяет длину численного значения выводимой переменной с учетом символа окончания строки '\0', добавляемого автоматически.
Диапазон изменения основания системы счисления – целое число (2¸36).
Переполнение буфера не контролируется.
Возникновение ошибок подтверждается отсутствием возвращаемого значения.
Максимальная длина возвращаемой строки определяется используемой функцией (itoa – 17 байт, ltoa – 33 байта).
Общий вид фрагмента программы вывода трех переменных (целых, вещественных):
#include <stdlib.h> /* директива препроцессора*/
…
float n1; /*описатель переменной n1 */
int n2; /*описатель переменной n2 */
long n3; /*описатель переменной n3 */
char buf[12]; /*описатель массива buf */
…
gcvt(n1, 8, buf); /*преобразование числа n1 в строку buf*/
PoleN1–>SetText(buf); /*перемещение данного в PoleN1*/
itoa(n2, buf, 10);/*преобразование числа n2 в строку buf*/
PoleN2–>SetText(buf); /*перемещение данного в PoleN2*/
ltoa (n3, buf, 10);/*преобразование числа n3 в строку buf*/
PoleN3–>SetText(buf); /*перемещение данного в PoleN3*/
…
Описатели типа переменных определяют переменную n1 как вещественную с обычной точностью, n2 – как целую, n3 – длинную целую, а buf как одномерный массив длиной 12 символов.
Восьмая, десятая, двенадцатая строки предписывают преобразовать вещественную, целую и длинную целую переменные n1, n2, n3 в формат символьной строки buf. Максимальная длина символьной строки – 12 символов. Выводимое вещественное число должно содержать не более 8 значащих символов. Выводимые целые числа относятся к десятичной системе счисления. Девятая, одиннадцатая, тринадцатая – предписание скопировать содержимое символьной строки buf в поля вывода с именами PoleN1, PoleN2, PoleN3.
Функция sprintf
Используется в качестве оператора для форматного преобразования выводимого числа в символьную строку. Формат представления числа задается пользователем.
Структура оператора:
sprintf(buffer, “управляющая строка”, П1 [,П2, . . . ,Пn]);
где sprintf – имя функции (писать в строку);
buffer – имя формируемой (выводимой) строки;
“управляющая строка” – список спецификаторов выводимых переменных, оформленный в виде символьной строки;
П1 … Пn – список идентификаторов выводимых переменных;
, , – разделители идентификаторов (аргументов);
( ) – ограничители идентификаторов (аргументов);
[ ] – признак необязательности содержимого;
; – символ оператора.
Функция располагается в библиотеке stdio.h.
Правила записи и использования
Применяется при выводе числовых данных в поля графического интерфейса.
Имя преобразуемого данного – аналог обозначения выводимой переменной.
Структура каждой переменной определяется соответствующим спецификатором в управляющей строке.
Последовательность спецификаторов управляющей строки определяется перечислением переменных в списке.
Вывод (указание в списке) нескольких переменных допускается, но не рекомендуется (нарушается принцип одно поле – одна переменная).
Результат действия функции – подготовка содержимого буфера (buffer) к копированию в поле вывода.
Общий вид фрагмента программы вывода двух переменных (целой и вещественной):
#include <stdio.h>/* директива препроцессора*/
…
float n1; /*описатель переменной n1 */
int n2; /*описатель переменной n2 */
char buf[12]; /*описатель массива buf */
…
sprintf(buf,”%5.3f”, n1);/*преобразование числа n1 в buf*/
PoleN1–>SetText(buf);/*перемещение данного в PoleN1*/
sprintf(buf,”%10d”, n2);/*преобразование числа n1 в buf*/
PoleN2–>SetText(buf);/*перемещение данного в PoleN1*/
…
Седьмая и девятая строки предписывают преобразовать вещественную и целую переменные n1, n2 в символьную строку buf по форматам, указанным в управляющей строке. Восьмая и десятая – скопировать содержимое символьной строки buf в поля вывода с именами PoleN1, PoleN2.
Пример 6.8. Организовать вывод вещественных переменных а = 15.8, b = 0.365е-2, целой переменной i = -1.
Фрагмент программы имеет вид:
#include <stdlib.h> /* директивы*/
#include <stdio.h> /* препроцессора*/
…
float а,b; /*описатель переменных а и b */
int i; /*описатель переменной i */
char buf[12]; /*описатель массива buf */
…
sprintf(buf,”%5.3f”, а); /* преобразование числа в buf*/
PoleA–>SetText(buf); /*перемещение данного в PoleА*/
gcvt(b, 8, buf); /* преобразование числа в buf*/
PoleB–>SetText(buf); /*перемещение данного в PoleB*/
itoa(i, buf, 10); /* преобразование числа в buf*/
PoleI–>SetText(buf); /*перемещение данного в PoleI*/
…
Фрагмент реализует преобразование выводимых переменных в символьные строки разными способами (функции sprintf, gcvt, itoa), позволяя определить достоинства и недостатки каждого. Пользователь выбирает любой из предложенных способов в соответствии с целью задачи.
Результаты вывода вещественных переменных а = 15.8, b = 0.365е-2, целой переменной i = -1 в активные поля имеют вид:
Количество разрядов в дробной части переменной «а» обусловлено заданным спецификатором (три знака после разделителя), в переменной «b» увеличено на 2 разряда (нулевых) в соответствии с правилом 3 использования функции gcvt.
Анализ переменной «b» определяет низкую эффективность ее представления (бесформатный вывод), подтверждая целесообразность форматного вывода вещественных переменных.
Исходя из изложенного, варианты программной реализации задачи о вычислении площади прямоугольника имеют вид:
а) программа с классическим вводом/выводом:
# include <iostream.h>
#include <conio.h>
main()
{
float a,b,s;
cin >>a>>b;
s = a*b;
cout <<" a= "<<a<<" b= "<<b<<" s= "<<s;
getch();
}
б) фрагмент программы с использованием созданного ранее шаблона графического интерфейса (см. начало разд. 6.3) имеет вид:
#include<stdlib.h>
…
{
float a,b,s;
char buf[12];
PoleA–>GetText(buf,12); /* Скопировать содержимое окна ввода с именем PoleA в символьную строку buf */
a=atof(buf); /* Преобразовать символьную строку в вещественное число «а»*/
PoleB->GetText(buf,12); /* Скопировать содержимое окна ввода с именем PoleB в символьную строку «buf» */
b=atof(buf); /* Преобразовать символьную строку в вещественное число «b» */
s=a*b;
gcvt(s, 12, buf); /* Преобразовать число «s» в формат символьной строки*/
PoleS->SetText(buf); /*Отобразить результат в поле с именем PoleS*/
}