https://pastein.ru/t/w7
скопируйте уникальную ссылку для отправки
#include <iostream>
#include <math.h>
#include <sstream>
#include <iomanip>
using namespace std;
int Convert(float input) //Метод, который получает 5 цифр после запятой и преобразует их в число типа int
{
int temp = input; //таким методом
input = fabs(input - temp); //избавляемся от целой части
stringstream ss; //это нужно чтобы преобразовать тип float в string
string str;
ss << setprecision(5) << input; // ставим ограничение на количество символов после запятой
ss >> str; // и записываем в переменную типа string
if (str != "0") // если в строке не "0",
{
str = str.substr(2); //то уберем первые 2 символа, то есть из строки "0.12345" получим "12345"
}
return atoi(str.c_str()); //а здесь строку "12345" преобразуем в целое число 12345
}
bool Uslovie(float input) //метод в котором проверяется условие, в нашем случае кратность 3
{
int convert_input = Convert(input); //вызываем метод Convert (см.выше)
int sum = 0;
while (convert_input != 0) //считаем сумму цифр
{
sum += convert_input % 10;
convert_input /= 10;
}
if (sum % 3 == 0) //если сумма делится на 3
{
return true; //вернем true
}
return false; //иначе false
}
int ReverseSearch(float input[], int length) //метод, который проходит по массиву с конца, так как в задаче сказано "последний слева элемент", что значит первый справа
{
for (int i = length - 1; i >= 0; i--) //проходим массив в обратном порядке
{
if (Uslovie(input[i])) //если элемент подходит по условию (см.выше)
{
return i; //вернем его индекс
}
}
return length; //если не один не подошел, то вернем длину массива (позже поясню)
}
float GetNumber()
{
cout << "Enter a float ";
float o;
cin >> o;
return o;
}
int main()
{
//Smirnova
//i,m-индексы для сортировки/вывода массива
//r-дополнительная временная переменная для сортировки массива "Пузырьком"
//o-используется для получения числа с клавиатуры
float S[10] = { 12.9,-12.0,-34.87,6.45,0.4,-8.98978,-56.8,7.56,42.8, 21.4 };
int length = sizeof(S) / sizeof(*S); // sizeof - возвращает длину в байтах, а * - это указатель на что-либо, нагуглил, что если сделать "sizeof(S) / sizeof(*S);" , то получится длина массива
cout << "Massive" << "\n";
cout.precision(5);
for (int i = 0; i < length; i++)
{
cout << S[i] << " ";
}
cout << "\n";
cout << "Sorted massive" << "\n";
for (int i = 0; i < length - 1; i++)
{
for (int m = i + 1; m < length; m++)
{
if (S[i] < S[m])
{
float r;
r = S[i];
S[i] = S[m];
S[m] = r;
}
}
}
for (int i = 0; i < length; i++)
{
cout << S[i] << " ";
}
cout << "\n";
int deleted = ReverseSearch(S, length); // запускаем поиск с конца
if (deleted != length) //как я писал выше, если мы не найдем нужный элемент, то вернем длину массива, тут нам это пригодилось, если мы получили индекс элемента, то
{
cout << "We should delete S[" << deleted << "] = " << S[deleted] << "\n"; //пишем какой элемент мы должны удалить
}
else
{
cout << "We should not delete anything!" << "\n"; //иначе мы ничего не удаляем
}
float o = GetNumber();
if (deleted != length) //(см.выше)
{
S[deleted] = o; //заменяем элемент, который нужно удалить, на элемент, который ввели с клавиатуры
}
else //иначе приходится увеличивать массив
{
length++; //увеличиваем переменную длины
float * temp; //эти 2 строки
temp = new float[length]; //нужны чтобы создать временный массив не от константы, а от переменной (в качестве длины я имею ввиду)
for (int i = 0; i < length - 1; i++) //переносим элементы
{
temp[i] = S[i];
}
temp[length - 1] = o; //добавляем элемент в конец
delete[] S; //удаляем из памяти первоначальный массив
float * S; //и выделяем для него память снова
S = new float[length]; //но только уже больше чем было (было 10 ячеек, стало 11)
for(int i = 0; i < length; i++) //переносим элементы
{
S[i] = temp[i];
}
delete[] temp; //удаляем временный массив
}
for (int i = 0; i < length - 1; i++)
{
for (int m = i + 1; m < length; m++)
{
if (S[i] < S[m])
{
float r;
r = S[i];
S[i] = S[m];
S[m] = r;
}
}
}
cout << "Sorted massive with number from User" << "\n";
for (int i = 0; i < length; i++)
{
cout << S[i] << " ";
}
cout << "\n";
}