Страница 1 из 1
C++, присвоение
Добавлено: 19 апр 2015, 17:46
Туршинская
Заменить все элементы массива их квадратами и упорядочить элементы массива по возрастанию. Как произвести замену??
Код: Выделить всё
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int i, j;
const int n=5;
float a[n],t,k, l;
for (i=0;i<n;i++)
cin>>a[i];
k=a[i]*a[i];
for (j=n;j>0;j--)
for (i=0;i<n-1;i++)
if (a[i]>a[+1])
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
for(i=0;i<n;i++)
cout<<"k="<<k<<" ";
system ("pause");
return 0;
}
Re: C++, присвоение
Добавлено: 20 апр 2015, 12:47
Romeo
Здесь так много ошибок, что даже если правильно написать сортировку, программа всё равно не заработает.
Начнём с того, что массивы в C/C++ имеют индексы от 0 до N-1, где N - размер массива. Этот факт использован правильно только при считывании массива, так как, по всей видимости, это кусочек был переписан откуда-то. В циклах же, которые должны отсортировать массив, про это вообще забыто, в результате чего мы в некоторых случаях вылазим за границы массива. Внимательно прокрути в голове, как будут выполняться циклы и поправь.
Далее, непонятно выражение k=a*a. Мало того, что оно стоит НЕ внутри цикла, так что не может претендовать на оператор, вычисляющий квадрат ДЛЯ КАЖДОГО элемента массива. Так ко всему прочему нужно заметить, что i после выполнения цикла будет равен n, а обращение по n-ому индексу - это опять-таки вылезание за границы.
Вывод массива вообще удивителен. В цикле выводится одно и то же значение k, которое было вычисленно из мусорного значения за границей массива. Сами же элементы массива не выводятся. Видимо поэтому ты думаешь, что сортировка вообще неверная, хотя она неверная лишь на границах массива.
Re: C++, присвоение
Добавлено: 17 июл 2015, 13:29
Din666
Лучше юзать уже готовые паттерны, значительно ускоряется процесс разработки
как-то так:
Код: Выделить всё
#include <iostream> // for std::cin, std::cout
#include <vector> // std::vector
#include <algorithm> // for std::sort
#include <iterator> // for ostream_iterator
#include <functional> // for std::bind
#include <math.h> // for powf
int main() {
static const size_t nCount = 5;
// резервируем массив из nCount элементов
std::vector<float> vec(nCount);
// заполним массив из stdin
std::cout << "Enter " << nCount << " elements:" << std::endl;
for(int a = 0; a < nCount; ++a) {
std::cin >> vec[a];
}
// возведем в квадрат каждый элемент
namespace ph = std: :p laceholders;
std::transform(vec.begin(), vec.end(), vec.begin(), std::bind(&: :p owf, ph::_1, 2));
// отсортируем по возрастанию
std::sort(vec.begin(), vec.end());
// выведем результат
std::cout << "Print result:" << std::endl;
std::copy(vec.begin(), vec.end(), std: :o stream_iterator<float>(std::cout, ":"));
std::cout << std::endl;
// очистим буфер от последних переводов строки
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
// вместо system("pause");
std::cout << "Press enter ";
std::cin.get();
}
/* результат работы:
#g++ -std=c++11 -o test1 test1.cpp
#./test1
Enter 5 elements:
4
2
7
88
10
Print result:
4:16:49

7744:
Press enter
*/
Re: C++, присвоение
Добавлено: 17 июл 2015, 13:49
Romeo
Хорошее решение, ещё и на 11 стандарте, однако сомневаюсь, что оно будет ценно для человека, который даже 2 + 2 написать не может ещё. Осваивать STL нужно тогда, когда уже сформировалось понимание того, как всё работает. Для топикстартера данный код настолько же бесполезен, как Бентли для неандертальца - он в нём ничего не поймёт. Да и нужда в решении этой задачи уже давно отпала, судя по времени сообщения.
Re: C++, присвоение
Добавлено: 17 июл 2015, 14:24
Din666
)) ниче страшного, пусть лежит на форме, мож кому еще пригодится. ))
Re: C++, присвоение
Добавлено: 19 авг 2015, 10:57
Сионист
Туршинская писал(а):for (j=n;j>0;j--)
for (i=0;i<n-1;i++)
if (a>a[+1])
{
t=a;
a=a[i+1];
a[i+1]=t;
}
А зачем сравнивать 1-м все остальные элементы и каждый не равный ему менять местами со следующим? Да ещё и n раз.
Re: C++, присвоение
Добавлено: 19 авг 2015, 10:59
Сионист
Romeo писал(а): В циклах же, которые должны отсортировать массив, про это вообще забыто, в результате чего мы в некоторых случаях вылазим за границы массива. Внимательно прокрути в голове, как будут выполняться циклы и поправь.
i меняется от 0 до n-2, i+1 - от 1 до n-1.
Re: C++, присвоение
Добавлено: 19 авг 2015, 11:02
Сионист
Romeo писал(а): Видимо поэтому ты думаешь, что сортировка вообще неверная, хотя она неверная лишь на границах массива.
Сортировки там нет вообще. Есть перемешивание, да и то не верное.