2. Код програми:
#include <iostream> //бібліотека для потокового введення виведення
#include <conio.h> //бібліотека для введення,виведення
#include <stdio.h> //бібліотека для стандартних функцій введення, виведення
#include <math.h> //бібліотека для роботи з математичними функціями
using namespace std;
void main()
{
//змінні
int i;//змінна типу int; використовується в _cscanf
unsigned u;//змінна типу unsigned int; використовується для зчитування додатного числа в _cscanf
int j;//змінна в котру записується кількість символів у виведеному рядку; використовується в sprintf()
char ch;//змінна типу char; використовується в getch, getchar
char str[21];//рядок, використовується в gets
char buffer[82] = { 80 }; // максимальна кількість рядка становить 80, де 2 перших використовується для зберігання записаного рядка використовується в _cgets
char *result;//використовується я вказівник на перший символ який є результатом виконання _cgets
int return_code;//код котрий повертають функції _cscanf, scanf, sscanf і вказує на кількість коректно зчитаних змінних
char tokenstring[81];//рядок, який використовується для конвертування його у такі типи: string, char, int and float
float fl;//змінна типу float; використовується у sscanf
//інформація про програму
cout<<"Using input/output functions"<<endl;
cout<<"Executer Anton Pererva IS-22"<<endl<<endl<<endl;
//_cprintf/_cscanf
cout<<"using _cprintf/_cscanf"<<endl;
cout<<"enter data in format \"%d %u %c %s\""<<endl;
return_code = _cscanf( "%d %u %c %s", &i,&u,&ch,&str ); //зчитуємо змінні з консолі одразу без очікування введення інших змінних
if (return_code==4) //4 тому що ми маємо зчитати 4 змінні, а _cscanf повертає кількість вдало зчитаних змінних
{
cout<<"output that same data in that same format"<<endl;
_cprintf( "i=%d u=%u c='%c' str='%s'\r\n", i,u,ch,str ); //виводимо змінні форматованим рядком
}
else//якщо кількість вдало зчитаних змінних не рівна 4 виводимо повідомлення про некоректність введених данних
cout<<"\nERROR INCORRECT DATA"<<endl;
cout<<"\n\n";
//_cputs/_cgets
cout<<"using _cputs/_cgets"<<endl;
printf( "Input line of text(max length 80 characters), followed by carriage return:\n");//виводимо рядок за допомогою printf()
result = _cgets( buffer ); // вводимо рядок тексту
printf( "Line length = %d\nText = `%s`\n", buffer[1], result ); //виводимо рядок та кількість символів у ньому
cout<<"output with _cputs()"<<endl;
_cputs(result); //виводимо рядок за допомогою _cputs()
cout<<"\nmove caret to new line"<<endl;
cout<<"\n\n";
//putch/getch
_getch();//”зчитуємо” з буферу символ '\0',використовується _getch() тому що в даному випадку fflush() працює некоректно
fflush(stdin); //очищуэмо буфер
cout<<"using putch/getch"<<endl;
cout<<"enter symbol"<<endl;
ch = getch();//зчитуємо символ з клавіатури за допомогою getch()
cout<<"entered symbol is"<<endl;
putch(ch); //виводимо символ за допомогою putch()
cout<<"\nmove caret to new line"<<endl; //повідомлення про штучне переміщення на новий рядок
cout<<"\n\n";
//putchar/getchar
cout<<"using putchar/getchar"<<endl;
cout<<"enter symbol and press ENTER"<<endl;
ch = getchar();//зчитуємо символ з клавіатури за допомогою getchar()
cout<<"entered symbol is"<<endl;
putchar(ch); // виводимо символ за допомогою putchar()
cout<<"\nmove caret to new line"<<endl; //повідомлення про штучне переміщення на новий рядок
cout<<"\n\n";
//puts/gets
cout<<"using puts/gets"<<endl;
cout<<"enter string(max length is 20 symbols)\n";
fflush(stdin); //очищуэмо буфер
gets( str ); //зчитуємо рядок за допомогою gets()
cout<<"entered string is: `%s`\n";
puts(str); //виводимо рядок за допомогою puts()
cout<<"\n\n";
//printf/scanf
cout<<"using printf/scanf"<<endl;
cout<<"enter data in format \"%d %20s\""<<endl;
return_code = scanf( "%d %s", &i,str ); //зчитуємо за допомогою scanf та запам’ятовуємо кількість коректно введених змінних
if (return_code==2) //2 тому що ми повинні зчитати 2 змінні,а scanf повертає кількість успішно зчитаних змінних
{
cout<<"output that same data in that same format"<<endl;
printf( "a=%d str='%20s'\r\n", i,str ); //виводимо за допомогою printf
}
else
cout<<"ERROR INCORRECT DATA"<<endl;
cout<<"\n\n";
//sprintf/sscanf
cout<<"using sprintf/sscanf"<<endl;
cout<<"Enter string to transform(must consist float value at begining)"<<endl;
fflush(stdin); //очищуємо буфер
cin>>tokenstring; //зчитуємо рядок для перетворень
return_code = sscanf( tokenstring, "%f", &fl );//зчитуємо змінну типу float оскільки вона є необхідною, адже вона в собі має int, char та рядок)
if (return_code==1) //якщо коректно зчитали змінну то продовжуємо зчитувати інші змінні
{
sscanf( tokenstring, "%20s", str ); //перетворюємо зчитаний рядок у змінну типу рядок
sscanf( tokenstring, "%c", &ch ); //типу char
sscanf( tokenstring, "%d", &i ); //int
cout<<"Converted and formated data is\n";
buffer[0] = 0; //очищуємо рядок в котрий виводимо
j=sprintf( buffer,"\n String: %s\n", str ); //заносимо в змінну buffer результат перетворення рядка у рядок для виведення а також запам’ятовуємо кількість символів
cout<<buffer; //виводимо buffer
// аналогічно для наступного тільки заносимо в рядок змінні іншого типу
buffer[0] = 0;
j+=sprintf( buffer, " Character: %c\n", ch ); //типу char
cout<<buffer;
buffer[0] = 0;
j+=sprintf( buffer, " Integer: %d\n", i ); //типу int
cout<<buffer;
buffer[0] = 0;
j+=sprintf( buffer, " Real: %f\n", fl ); //типу float
cout<<buffer;
cout<<"Symbol`s count is "<<j; //виводимо сумарну кількість символів у виведених рядках через змінну buffer
}
else //якщо ж ми ввели некоректну кількість аргументі то виводимо відповідне повідомлення
cout<<"ERROR INCORRECT DATA"<<endl;
float x,a,b,c,d,t;// зміні для розрахунку виразу, t використовується для проміжних розрахунків
//тут змінна ch використовується для зчитування відповіді на питання типу "Please press y/n"
bool repeat;//відповідає за те чи повторювати введення даних для виразу та його переррозрахунку
repeat = true;
cout<<"\n\nCalculate expression:"<<endl;
cout<<"X = (|A|+|B|)^2 / ( D - C^(1/2))"<<endl<<endl<<endl;
while (repeat) //створюємо цикл для тесту на декількох різних значеннях
{
cout<<"Please enter numbers a, b, c(MUST BE >=0), d in format '%f %f %f %f'"<<endl;
return_code = scanf("%f %f %f %f",&a,&b,&c,&d);
if ((return_code == 4)&&(c>=0)) //перевірка кількості корректно зчитаних змінних а також відсіювання значення с меншого за нуль, оскільки якщо від’ємне значення не відсіяти ми не зможемо знайти дійсне число котре в квадраті буде дорівнювати від’ємному числу і оримаємо помилку
{
if ((d-powf(c,0.5))==0) //перевірка знаменника на 0
cout<<"Devision by zero(C=D^2)"<<endl;
else
{
cout<<"Print intermediate calculations? (y/n)"<<endl; //запит на вивід проміжних значень
fflush(stdin); //очищення буферу
ch=getchar();//зчитуємо відповідь на запит
if ((ch=='y')||(ch=='Y')) //якщо отримали позитивну відповідь, то розраховуємо та виводимо проміжні значення
{
x=(abs(a)+abs(b));
cout<<"(|A|+|B|)="<<x<<endl;
x*=x;
cout<<"(|A|+|B|)^2="<<x<<endl;
t=powf(c,0.5);
cout<<"C^(1/2)="<<t<<endl;
t=d-t;
cout<<"D - C^(1/2)="<<t<<endl;
x/=t;
}
else//інакше одразу виводимо результат
x=powf((abs(a)+abs(b)),2)/(d-powf(c,0.5));
cout<<"\n(|A|+|B|)^2 / ( D - C^(1/2)) = "<<x<<"\n"<<endl;
}
}
else//виводимо повідомлення про некоректність данних
cout<<"INCORRECT DATA"<<endl;
cout<<"Repeat? (type `y` or `Y` to repeat)"<<endl; //запит на те чи повторити розрахунок з іншими значеннями
fflush(stdin);
ch=getchar();
if ((ch!='y')&&(ch!='Y')) //якщо отримуємо негативну відповідь
repeat = false; //створюємо умову завершення циклу
else
{
cout<<"Clear console? (y/n)"<<endl; //запит на очищення консолі
fflush(stdin);
ch=getchar();
if ((ch=='y')||(ch=='Y')) //в разі позитивної відповіді
{
system("cls");//очищуємо її
//після очищення консолі виводимо інформацію про вираз та того хто написав програму
cout<<"Calculate expression:"<<endl;
cout<<"X = (|A|+|B|)^2 / ( D - C^(1/2))"<<endl;
cout<<"Executer Anton Pererva IS-22"<<endl<<endl<<endl;
}
}
}
system("pause");// очікування натиску клавіші для завершення програми
}
