- •Санкт-Петербург
- •Void number(int a) // функция, выводящее целое число в четырех разных форматах
- •Void number(float a) // функция, выводящая вещественное число в трех разных форматах
- •Void number(int width, int precision, float a) // функция, выводящая вещественное число в трех разных форматах, ширина поля и точность задаются пользователем
Void number(float a) // функция, выводящая вещественное число в трех разных форматах
{
cout << "Введенное число в обычном вещественном формате равно: ";
printf("%-10.5f\n", a); // вывод числа в обычном вещественном формате, выравнивание по левому краю, ширина 10 знаков, точность 5 знаков, перенос строки
cout << "Введенное число в экспоненциальном вещественном формате равно: ";
printf("%5.3e\n", a); // вывод числа в экспоненциальном вещественном формате, ширина 5 знаков, точность 3 знака, перенос строки
cout << "Введенное число в смешанном вещественном формате равно: ";
printf("%6.4g\n", a); // вывод числа в смешанном вещественном формате, ширина 6 знаков, точность 4 знака, перенос строки
}
int main()
{
float a, b, c;
system("chcp 1251");
system("cls");
cout << "Введите число в обычном вещественном формате: " << endl;
scanf("%f", &a);
number(a);
cout << "Введите число в экспоненциальном вещественном формате: " << endl;
scanf("%e", &b);
number(b);
cout << "Введите число в смешанном вещественном формате: " << endl;
scanf("%g", &c);
number(c);
system("pause");
return 0;
}
Рисунок 3 – Результат работы программы по вводу/выводу вещественных чисел в различных форматах
Дополним программу, реализовав вариант, когда ширина поля и точность вводятся с клавиатуры:
#include <stdio.h>
#include <iostream>
using namespace std;
Void number(int width, int precision, float a) // функция, выводящая вещественное число в трех разных форматах, ширина поля и точность задаются пользователем
{
cout << " Введенное число в обычном вещественном формате равно: ";
printf("%*.*f\n", width, precision, a); // вывод числа в обычном вещественном формате, ширина и точность задаются пользователем, перенос строки
cout << "Введенное число в экспоненциальном вещественном формате равно: ";
printf("%*.*e\n", width, precision, a); // вывод числа в экспоненциальном вещественном формате, ширина и точность задаются пользователем, перенос строки
cout << "Введенное число в смешанном вещественном формате равно: ";
printf("%*.*g\n", width, precision, a); // вывод числа в смешанном вещественном формате, ширина и точность задаются пользователем, перенос строки
}
int main()
{
float a, b, c, width_1, width_2, width_3, precision_1, precision_2, precision_3;
system("chcp 1251");
system("cls");
cout << "Введите число в обычном вещественном формате: " << endl;
scanf("%f", &a);
cout << "Введите ширину поля: " << endl;
cin >> width_1;
cout << "Введите точность: " << endl;
cin >> precision_1;
number(width_1, precision_1, a);
cout << "Введите число в экспоненциальном вещественном формате: " << endl;
scanf("%e", &b);
cout << "Введите ширину поля: " << endl;
cin >> width_2;
cout << "Введите точность: " << endl;
cin >> precision_2;
number(width_2, precision_2, b);
cout << "Введите число в смешанном вещественном формате: " << endl;
scanf("%g", &c);
cout << "Введите ширину поля: " << endl;
cin >> width_3;
cout << "Введите точность: " << endl;
cin >> precision_3;
number(width_3, precision_3, c);
system("pause");
return 0;
}
Рисунок 4 – Результат работы программы по вводу/выводу вещественных чисел в различных форматах, ширина поля и точность задаются с клавиатуры
Задание 3.
Разработаем программу, в которой реализуем ввод с клавиатуры и вывод на экран строк:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
char str[5][10];
system("chcp 1251");
system("cls");
cout << "Введите строки: " << endl;
for (int i = 0; i < 5; i++)
{
scanf("%9s", str[i]);//ввод строк, выравнивание по правому краю, ширина поля равна 9
}
cout <<"Введенные строки:" << endl;
for (int i = 0; i < 5; i++)
{
printf("%9s\n", str[i]);//вывод строки, выравнивание по правому краю, ширина поля равна 9
}
system("pause");
return 0;
}
Рисунок 5 – Результат работы программы по вводу/выводу строк
Реализуем вариант, когда в один символьный массив вводится строка, состоящая из нескольких слов, разделенных пробелом:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
char str[50];
char *str_1; //указатель, в который будет помещен адрес массива, в который считана строка
system("chcp 1251");
system("cls");
cout << "Введите строку с пробелами: " << endl;
str_1 = gets(str);//ввод строки
cout <<"Введенная строка:" << endl;
printf("%s\n", str_1);//вывод строки
system("pause");
return 0;
}
Рисунок 6 – Результат работы программы по вводу/выводу строки, в которой несколько слов разделено пробелами
Реализуем посимвольный ввод строки с помощью цикла while и формата «%с»:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
char str[5];
char ch;
int i = 0;
system("chcp 1251");
system("cls");
cout << "Введите строку: " << endl;
while (i < 5)
{
scanf("%c\n", &ch);
str[i] = ch;
i++;
}
cout << "Введенная строка:" << endl;
printf("%s\n", str);//вывод строки
system("pause");
return 0;
}
Рисунок 7 – Результат работы программы, в которой реализован посимвольный ввод строки
Задание 4.
Реализуем программу из задания 1 с помощью функций sprintf и puts:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a;
char str [20];
system("chcp 1251");
system("cls");
cout << "Введите число в десятичном беззнаковом формате: " << endl;
scanf("%d", &a);
sprintf(str, "%u", a);
cout << "Введенное число в десятичном беззнаковом формате: " << endl;
puts(str);
sprintf(str, "%+d", a);
cout << "Введенное число в десятичном знаковом формате: " << endl;
puts(str);
sprintf(str, "%o", a);
cout << "Введенное число в восьмеричном беззнаковом формате: " << endl;
puts(str);
sprintf(str, "%x", a);
cout << "Введенное число в шестнадцатеричном беззнаковом формате: " << endl;
puts(str);
system("pause");
return 0;
}
Рисунок 8 – Результат работы программы, демонстрирующей примеры функций spritnf и puts
Задание 5.
Реализуем программу из задания 1 с помощью функций sscanf и gets:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a, b, c, d;
char str [50];
char str_arg [10];
system("chcp 1251");
system("cls");
cout << "Введите числа разных форматах: " << endl;
gets(str);
cout << "Введите спецификаторы формата: " << endl;
gets(str_arg);
sscanf(str, str_arg, &a, &b, &c, &d);
sprintf(str, "%u %u %u %u" , a, b, c, d);
cout << "Введенные числа в десятичном беззнаковом формате: " << endl;
puts(str);
sprintf(str, "%+d %+d %+d %+d" , a, b, c, d);
cout << "Введенные числа в десятичном знаковом формате: " << endl;
puts(str);
sprintf(str, "%o %o %o %o" , a, b, c, d);
cout << "Введенные числа в восьмеричном беззнаковом формате: " << endl;
puts(str);
sprintf(str, "%x %x %x %x" , a, b, c, d);
cout << "Введенные числа в шестнадцатеричном беззнаковом формате: " << endl;
puts(str);
system("pause");
return 0;
}
Рисунок 9 – Результат работы программы, демонстрирующей примеры функций sscanf и gets
Задание 6.
Разработаем программу, в которой реализуем вывод массива структур в виде таблицы:
#include <stdio.h>
#include <iostream>
using namespace std;
struct A
{
short a;
float b;
char c[20];
};
int main()
{
int i = 0;
A data[] =
{
{200, -25.178, "Язык С++"},
{-22, 321.123, "Язык FORTRAN"},
{0, 12.286, "Язык Pascal"}
};
system("chcp 1251");
system("cls");
cout << "*-------------------------------*" << endl;
while(i < 3)
{
printf("| %3d |", data[i].a);
printf(" %-8.3f |", data[i].b);
printf(" %-12s |\n", data[i].c);
i++;
}
cout << "*-------------------------------*" << endl;
system("pause");
return 0;
}
Рисунок 10 – Результат работы программы, демонстрирующей вывод таблицы
Реализуем в цикле ввод данных в массив структур с консоли. Чтобы избежать переполнения массива, будем запрашивать у пользователя количество вводимых строк:
#include <stdio.h>
#include <iostream>
using namespace std;
struct A
{
int a;
float b;
char c[20];
};
int main()
{
int i = 0, n;
system("chcp 1251");
system("cls");
cout << "Введите количество строк массива: " << endl;
cin >> n;
A *data = new struct A[n];
for (i = 0; i < n; i++)
{
cout << "Введите данные №1 для строки №: " << i + 1 << endl;
scanf("%d", &data[i].a);
cout << "Введите данные №2 для строки №: " << i + 1 << endl;
scanf("%f", &data[i].b);
cout << "Введите данные №3 для строки №: " << i + 1 << endl;
fflush(stdin);
gets(data[i].c);
}
cout << "*-------------------------------*" << endl;
for(i = 0; i < n; i++)
{
if(i != 0)
{
cout << "---------------------------------" << endl;
}
printf("| %3d |", data[i].a);
printf(" %-8.3f |", data[i].b);
printf(" %-12s |\n", data[i].c);
}
cout << "*-------------------------------*" << endl;
system("pause");
return 0;
}
Рисунок 11 – Результат работы программы, демонстрирующей вывод таблицы при вводе данных в массив структур с консоли
Задание 7.
Разработаем программу для исследования работы различных функций языка С для преобразования строк в числа (atof, atoi, strtod). Сравним работу этих функций с функцией sscanf для случаев, когда данные для преобразования заданы некорректно:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
char str[10];
char *end;
int b_1;
float a_1, c_1;
end = str;
system("chcp 1251");
system("cls");
cout << "Введите вещественное число:" << endl;
gets(str);
double a = atof(str);
sscanf(str, "%f", &a_1);
cout << "Введите целое число:" << endl;
gets(str);
int b = atoi(str);
sscanf(str, "%d", &b_1);
cout << "Введите вещественное число:" << endl;
gets(str);
double c = strtod(str, &end);
sscanf(str, "%f", &c_1);
cout << "Результат работы функций: " << endl;
printf("%f\n", a);
printf("%f\n", a_1);
printf("%d\n", b);
printf("%d\n", b_1);
printf("%f\n", c);
printf("%f\n", c_1);
system("pause");
return 0;
}
Рисунок 12 – Результат работы программы при правильном вводе данных
Рисунок 13 – Результат работы программы при неправильном вводу данных
Как можно видеть, функции преобразования данных всегда выдают 0, если введены неверные данные, в отличии от функции sscanf.
Дополнительное задание.
Реализуем задание 6 с помощью форматирования потокового воода-вывода языка С++:
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
struct A
{
int a;
float b;
string c;
};
int main()
{
int n;
system("chcp 1251");
system("cls");
cout << "Введите количество строк массива: " << endl;
cin >> n;
A *data = new struct A[n];
for (int i = 0; i < n; i++)
{
cout << "Введите данные №1 для строки №: " << i + 1 << endl;
cin >> data[i].a;
cout << "Введите данные №2 для строки №: " << i + 1 << endl;
cin >> data[i].b;
cout << "Введите данные №3 для строки №: " << i + 1 << endl;
fflush(stdin);
getline(cin, data[i].c);
}
cout << "*---------------------------------*" << endl;
for(int i = 0; i < n; i++)
{
if(i != 0)
{
cout << "-----------------------------------" << endl;
}
cout << "| " << setw(5) << data[i].a << " | ";
cout << setw(8) << setprecision(3);
cout.setf(ios::showpoint);
cout << fixed << data[i].b;
cout.unsetf(ios::showpoint);
cout << " | ";
cout << setw(12) << setiosflags(ios::left) << data[i].c << resetiosflags(ios::left) << " |" << endl;
}
cout << "*---------------------------------*" << endl;
delete[] data;
system("pause");
return 0;
}
Рисунок 14 – Результат работы программы по выводу таблицы с помощью форматирования потока вывода С++
Выводы:
В данной лабораторной работе были изучены библиотечные функций для ввода/вывода и преобразования данных языка С. Было изучено форматирование целых чисел в разные системы счисления с разной шириной поля, выравнивание по левому или правому краю, отображение/не отображение знака для чисел со знаком.
Также было изучено форматирование вещественных чисел разного вида с разной шириной поля, точностью, выравниванием, отображением/не отображением знака для чисел со знаком.
Помимо этого, было изучено форматирование символов и строк, выравнивание по левому/правому краю, установка различной ширины поля, дополнение пробелами до нужной ширины. Кроме этого, были изучены такие функции стандартной библиотеки работы с данными, как sscanf, sprintf, puts, gets.
Для формирования таблицы из строк разных типов была реализована программа с вводом с консоли значений полей массива структур, была использована динамическая память с помощью функций new и delete.
Таблица также была сформирована с помощью потокового ввода языка С++. Были использованы флаги, манипуляторы и функции работы со строками из заголовочного файла string.
