Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба 7 / Лабораторная_работа_№7_Токарев_0421.docx
Скачиваний:
0
Добавлен:
26.06.2025
Размер:
363.02 Кб
Скачать

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.