C++, присвоение

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Туршинская
Сообщения: 3
Зарегистрирован: 29 мар 2015, 16:11

Заменить все элементы массива их квадратами и упорядочить элементы массива по возрастанию. Как произвести замену??

Код: Выделить всё

#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;
}
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Здесь так много ошибок, что даже если правильно написать сортировку, программа всё равно не заработает.

Начнём с того, что массивы в C/C++ имеют индексы от 0 до N-1, где N - размер массива. Этот факт использован правильно только при считывании массива, так как, по всей видимости, это кусочек был переписан откуда-то. В циклах же, которые должны отсортировать массив, про это вообще забыто, в результате чего мы в некоторых случаях вылазим за границы массива. Внимательно прокрути в голове, как будут выполняться циклы и поправь.

Далее, непонятно выражение k=a*a. Мало того, что оно стоит НЕ внутри цикла, так что не может претендовать на оператор, вычисляющий квадрат ДЛЯ КАЖДОГО элемента массива. Так ко всему прочему нужно заметить, что i после выполнения цикла будет равен n, а обращение по n-ому индексу - это опять-таки вылезание за границы.

Вывод массива вообще удивителен. В цикле выводится одно и то же значение k, которое было вычисленно из мусорного значения за границей массива. Сами же элементы массива не выводятся. Видимо поэтому ты думаешь, что сортировка вообще неверная, хотя она неверная лишь на границах массива.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

Лучше юзать уже готовые паттерны, значительно ускоряется процесс разработки
как-то так:

Код: Выделить всё

#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:100:7744:
Press enter

*/
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Хорошее решение, ещё и на 11 стандарте, однако сомневаюсь, что оно будет ценно для человека, который даже 2 + 2 написать не может ещё. Осваивать STL нужно тогда, когда уже сформировалось понимание того, как всё работает. Для топикстартера данный код настолько же бесполезен, как Бентли для неандертальца - он в нём ничего не поймёт. Да и нужда в решении этой задачи уже давно отпала, судя по времени сообщения.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Аватара пользователя
Din666
Сообщения: 52
Зарегистрирован: 17 июл 2015, 13:25
Откуда: Moscow
Контактная информация:

)) ниче страшного, пусть лежит на форме, мож кому еще пригодится. ))
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Туршинская писал(а):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 раз.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а): В циклах же, которые должны отсортировать массив, про это вообще забыто, в результате чего мы в некоторых случаях вылазим за границы массива. Внимательно прокрути в голове, как будут выполняться циклы и поправь.
i меняется от 0 до n-2, i+1 - от 1 до n-1.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Аватара пользователя
Сионист
Сообщения: 1211
Зарегистрирован: 31 мар 2014, 06:18

Romeo писал(а): Видимо поэтому ты думаешь, что сортировка вообще неверная, хотя она неверная лишь на границах массива.
Сортировки там нет вообще. Есть перемешивание, да и то не верное.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Ответить