Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [С++] Найти произведение


Автор: Sandr12 2.3.2010, 22:21
Задача:Найти произведение двух наибольших из 5 чисел.

 smile напишите пожалуйста код со всеми комментариями чтоб разобраться.

Добавлено через 1 минуту и 23 секунды
желательно с оператором выбора case.

Добавлено через 2 минуты и 41 секунду
Visual C++

Автор: ИванМ 2.3.2010, 23:11
Код

#include <list>
#include <iostream>
#include <algorithm>

int main()
{
    std::list<double> arr;
    for(int i=1;i<=5;i++)
    {
        std::cout<<"Enter the item #"<<i<<":";
        double val;
        std::cin>>val;
        arr.push_back(val);
    }
    double m[2];
    arr.sort();
    arr.reverse();
    std::list<double>::iterator it=arr.begin();    
    m[0]=(*it);    
    m[1]=(*(++it));
    std::cout<<"Result = "<<m[0]*m[1]<<std::endl;
    system("pause");
}


Автор: t_gran 3.3.2010, 06:19
ИванМ, ей богу, человек просит реализовать школьную задачку и плюс ещё разжевать, а вы ему STL. smile Не, я не спорю, реализация верная, но поймёт ли её создатель темы?
Код

#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main ()
{
   const int CLength= 5;            // Количество чисел
   int arr[CLength];                // Список чисел

   srand(time(NULL));               // А-ля randomize в Pasca-cale
   for (int i= 0; i < CLength; ++i) // Генерируем случайным обраом числа 0..9
   {                                // и выводим их на экран
      arr[i]= rand() % 10;
      cout << arr[i] << " ";
   }
   cout << endl;

   // Идея поиска наибольшего числа заключается в сравнении
   // певого эл-та с остальными и перемещением самого большого на
   // эту (т.е. первую) позицию. Аналогичные действия выполняются и
   // для второго эл-та. В результате выполнения двух вложенных циклов
   // на первых двух местах будут распологаться самые большие числа из
   // представленных в нашем массиве
   for (int j= 0; j < 2; ++j)             // Сначала обрабатываем первый, затем второй
      for (int i= j+1; i < CLength; ++i)  // Начинаем со следующей позиции и до конца
         if (arr[j] < arr[i])             // Если больший эл-нт то меняем местами
         {
            int buff= arr[j];
            arr[j]= arr[i];
            arr[i]= buff;
         }

   cout << "result: " << arr[0]*arr[1] << endl;
   return 0;
}

Автор: Sandr12 3.3.2010, 14:46
Visual C++

Добавлено позже
t_gran, ошибка:
--------------------Configuration: laba - Win32 Debug--------------------
Compiling...
laba.cpp
c:\microsoft visual studio\myprojects\laba\laba.cpp(33) : fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.

laba.obj - 1 error(s), 0 warning(s)


а почему нет оператора case?

название темы в методичке:
"Условные операторы.Оператор выбора case."

Добавлено через 1 минуту и 49 секунд
t_gran, ошибка:
--------------------Configuration: laba - Win32 Debug--------------------
Compiling...
laba.cpp
c:\microsoft visual studio\myprojects\laba\laba.cpp(33) : fatal error C1010: unexpected end of file while looking for precompiled header directive
Error executing cl.exe.

laba.obj - 1 error(s), 0 warning(s)


а почему нет оператора case?

название темы в методичке:
"Условные операторы.Оператор выбора case."

Добавлено через 2 минуты и 42 секунды
упс))
дабл)

Автор: jhonyxakep 3.3.2010, 15:01
Цитата(Sandr12 @  3.3.2010,  14:46 Найти цитируемый пост)
а почему нет оператора case?

 smile А зачем он тут нужен. Код просто сортирует массив, и умножает 2 последних эл-та - которые являются наибольшими.

Цитата(Sandr12 @  3.3.2010,  14:46 Найти цитируемый пост)
t_gran, ошибка:--------------------Configuration: laba - Win32 Debug--------------------Compiling...laba.cppc:\microsoft visual studio\myprojects\laba\laba.cpp(33) : fatal error C1010: unexpected end of file while looking for precompiled header directiveError executing cl.exe.laba.obj - 1 error(s), 0 warning(s)


Возм. осбоенность компилятора, попробуй так:

Код

#include "stdafx.h" 
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main (void)
{
   const int CLength= 5;            // Количество чисел
   int arr[CLength];                // Список чисел

   srand(time(NULL));               // А-ля randomize в Pasca-cale
   for (int i= 0; i < CLength; ++i) // Генерируем случайным обраом числа 0..9
   {                                // и выводим их на экран
      arr[i]= rand() % 10;
      cout << arr[i] << " ";
   }
   cout << endl;

   // Идея поиска наибольшего числа заключается в сравнении
   // певого эл-та с остальными и перемещением самого большого на
   // эту (т.е. первую) позицию. Аналогичные действия выполняются и
   // для второго эл-та. В результате выполнения двух вложенных циклов
   // на первых двух местах будут распологаться самые большие числа из
   // представленных в нашем массиве
   for (int j= 0; j < 2; ++j)             // Сначала обрабатываем первый, затем второй
      for (int i= j+1; i < CLength; ++i)  // Начинаем со следующей позиции и до конца
         if (arr[j] < arr[i])             // Если больший эл-нт то меняем местами
         {
            int buff= arr[j];
            arr[j]= arr[i];
            arr[i]= buff;
         }

   cout << "result: " << arr[0]*arr[1] << endl;
  
  system("PAUSE"); //или cin.get(); 
  
   return 0;
}



t_gran, зачем хидер тайм поставил?


Sandr12, проще говоря забиваешь то что тебе нужно в массив,

Код

 for (int j= 0; j < 2; ++j)             // Сначала обрабатываем первый, затем второй
      for (int i= j+1; i < CLength; ++i)  // Начинаем со следующей позиции и до конца
         if (arr[j] < arr[i])             // Если больший эл-нт то меняем местами
         {
            int buff= arr[j];
            arr[j]= arr[i];
            arr[i]= buff;
         }

сортируешь (пузырекsmile),


Цитата(t_gran @  3.3.2010,  06:19 Найти цитируемый пост)
cout << "result: " << arr[0]*arr[1] << endl;


вычисляешь про-е, и выводишь.

Автор: Sandr12 3.3.2010, 19:21
jhonyxakep, спасибо большое)))
всё получилось!)

Автор: t_gran 4.3.2010, 03:40
Не могу не прокомментировать. smile

Цитата

t_gran, зачем хидер тайм поставил?

Для этого:
Код

   ...
   srand(time(NULL));               // А-ля randomize в Pasca-cale
   ...


Автор: mrbrooks 4.3.2010, 09:23
t_gran, для хакера это просто не очевидно  smile 

Автор: jhonyxakep 4.3.2010, 11:12
Цитата(t_gran @  4.3.2010,  03:40 Найти цитируемый пост)
srand(time(NULL));               // А-ля randomize в Pasca-cale

 smile кстати MinGW имеет тенденцию не обращать внимания на srand.

Автор: t_gran 5.3.2010, 03:31
Цитата

t_gran, для хакера это просто не очевидно   

 smile 

Цитата

кстати MinGW имеет тенденцию не обращать внимания на srand. 

Да ну?!  smile

Первый раз такое слышу!  smile

Автор: jhonyxakep 5.3.2010, 11:46
Цитата(t_gran @  5.3.2010,  03:31 Найти цитируемый пост)
Да ну?!  Первый раз такое слышу!  

 smile Уже какой раз натыкаюсь на такую проблему, потом просто стал генерить рандом по времениsmile

Автор: Dov 6.3.2010, 00:43
Ещё вариант с STL:
Код
int main()
{
    srand((unsigned)time(NULL));
    vector<int> v(5);     

    cout << "source: " ;
    for(vector<int>::size_type i = 0; i < v.size(); i++)
        cout << (v[i] = rand() % 20 + 1) << " ";    

    partial_sort(v.begin(), v.begin() + 2, v.end(), greater<int>());

    cout << "\nresult: " << v[0] << " x " << v[1] << " = " << v[0] * v[1] << endl;
    return 0;
}


Цитата(t_gran @  3.3.2010,  05:19 Найти цитируемый пост)
 В результате выполнения двух вложенных циклов

Поскольку однопроходный вариант (т.е. с одним циклом) никто не предложил, то я объявляю конкурс.
Три человека, которые первыми напишут работающий вариант(без использования STL и других сторонних библиотек) c одним проходом по массиву, получат от меня в репу.  smile 
Если кто-то захочет поучаствовать в этом безобразии, то не публикуйте здесь свои ответы(что бы не подсказывать другим), а посылайте мне на PM, а здесь  напишите только одно слово:  замутил, что бы народ видел сколько человек уже написали свои варианты. Потом я выложу здесь правильные решения. 
Задачка довольно простая, по-этому время на её решение будет, скорее всего, ограничено... так что, поторопитесь...  smile  

Итак, время пошло!!!   Желаю удачи!!! 

з. ы. хотя в этой задаче нужно выбирать из пяти чисел, но не забывайте, что выбор может состоять из гораздо большего количества чисел. 
   Это я для тех, кто захочет вообще без циклов написать...   smile 




Автор: Dov 6.3.2010, 01:12
Можно использовать такой шаблон:
Код
int main()
{
    srand((unsigned)time(NULL)); 
    
    const int SIZE = 5;
    int       arr[SIZE];
    // ... другие переменные, если нужно...

    // заполнение и вывод исходного массива...    
    cout << "source: " ;
    for(int i = 0; i < SIZE; i++) 
        cout << (arr[i] = rand() % 20 + 1) << ' ';
    
    // рабочий процесс и решение задачи, состоящее из одного цикла
    // ...


    // вывод результата:
    cout << "\nresult: " << /* max1 */ << " x " << /* max2 */ << " = " << /* max1 * max2 */ << endl;
    return 0;
}

Автор: Letov 6.3.2010, 03:24
Цитата(Dov @ 6.3.2010,  01:43)
Ещё вариант с STL:
Код
int main()
{
    srand((unsigned)time(NULL));
    vector<int> v(5);     

    cout << "source: " ;
    for(vector<int>::size_type i = 0; i < v.size(); i++)
        cout << (v[i] = rand() % 20 + 1) << " ";    

    partial_sort(v.begin(), v.begin() + 2, v.end(), greater<int>());

    cout << "\nresult: " << v[0] << " x " << v[1] << " = " << v[0] * v[1] << endl;
    return 0;
}


Цитата(t_gran @  3.3.2010,  05:19 Найти цитируемый пост)
 В результате выполнения двух вложенных циклов

Поскольку однопроходный вариант (т.е. с одним циклом) никто не предложил, то я объявляю конкурс.
Три человека, которые первыми напишут работающий вариант(без использования STL и других сторонних библиотек) c одним проходом по массиву, получат от меня в репу.  smile 
Если кто-то захочет поучаствовать в этом безобразии, то не публикуйте здесь свои ответы(что бы не подсказывать другим), а посылайте мне на PM, а здесь  напишите только одно слово:  замутил, что бы народ видел сколько человек уже написали свои варианты. Потом я выложу здесь правильные решения. 
Задачка довольно простая, по-этому время на её решение будет, скорее всего, ограничено... так что, поторопитесь...  smile  

Итак, время пошло!!!   Желаю удачи!!! 

з. ы. хотя в этой задаче нужно выбирать из пяти чисел, но не забывайте, что выбор может состоять из гораздо большего количества чисел. 
   Это я для тех, кто захочет вообще без циклов написать...   smile

замутил

Автор: Dov 9.3.2010, 14:25
Ну что? Выходные и праздники прошли. Завтра вечером подведём наши не утешительные итоги...   smile 

Автор: t_gran 10.3.2010, 08:56
замутил smile

Автор: Dov 10.3.2010, 22:40
Итак, как и обещал, подводим итоги. 
В решении задачи приняли участие лишь два участника: Letov и t_gran. И оба прислали правильное решение, и оба же получают заслуженные плюсы в репу. 
Выкладываю здесь присланные ими решения:
Letov:
Код
// Test.cpp: определяет точку входа для консольного приложения.
//

#include "stdafx.h"
#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <conio.h>

int _tmain(int argc, _TCHAR* argv[])
{
        using namespace std;
 srand((unsigned)time(NULL)); 

    const int SIZE = 5;
    int       arr[SIZE];
    // ... другие переменные, если нужно...
    int x1, x2;
    // заполнение и вывод исходного массива...    
    cout << "source: " ;
    for(int i = 0; i < SIZE; i++) 
        cout << (arr[i] = rand() % 20 + 1) << ' ';
    cout<<endl;
    
    // рабочий процесс и решение задачи, состоящее из одного цикла
    // ...
    int j, k, r;
    j = 0;
    k = 1;
    while(1)
    {  
        if(j == 0) k = 0;
        if (arr[j]<arr[j+1])
        {
            r=arr[j];
            arr[j]=arr[j+1];
            arr[j+1]=r;
            k++;
        }
        j++;
        if(j>=SIZE-1)
        {
            if (k==0) break;
            j = 0;        
        }
    }

    for(int i = 0; i < SIZE; i++) 
        cout << arr[i]<< ' ';

    // вывод результата:
    cout << "\nresult: " << arr[0] << " x " << arr[1] << " = " << arr[0]*arr[1] << endl;
    getch();
    return 0;
}


t_gran:
Код
#include <iostream>
#include <stdlib.h>
#include <time.h>

using namespace std;

int main()
{
    srand((unsigned)time(NULL)); 
    
    const int SIZE = 10;
    int arr[SIZE];
    // ... другие переменные, если нужно...
    // заполнение и вывод исходного массива...    
    cout << "source: " ;
    for (int i= 0; i < SIZE; ++i) 
        cout << (arr[i]= rand() % 20 + 1) << ' ';

    // рабочий процесс и решение задачи, состоящее из одного цикла
    // ...
    int max1= 0, max2= 0;
    for (int i= 0; i < SIZE; ++i)
    {
       if (max1 < arr[i])
       {
          if (max2 < max1)
             max2= max1;
          max1= arr[i];
       }
       else
          if (max2 < arr[i])
             max2= arr[i];
    }
    // вывод результата:
    cout << "\nresult: " <<  max1  << " x " <<  max2  << " = " <<  max1 * max2  << endl;
    return 0;
}


Ребята,  спасибо за участие...  smile 

з.ы. Со своей стороны хочу сказать, что решение t_gran`a мне понравилось больше(не в обиду Letov`у). 

Всем удачи и хороших программ!!!  

Автор: orthrus 11.3.2010, 07:56
Хоть я немного и не успел поучаствовать в таком интересном конкурсе, но свои 5-ть копек внесу в решение данной задачи однопроходным методом smile Вот моё решение:
Код

#include <iostream>
#include <stdlib.h>
#include <time.h>
#include <math.h>

using namespace std;

int main ()
{
    const int CLength= 5;            // Количество чисел
    int arr[CLength] ;               // Список чисел
    srand(time(NULL));               // А-ля randomize в Pasca-cale
    for (int i= 0; i < CLength; ++i) // Генерируем случайным обраом числа 0..9
    {                                // и выводим их на экран
        arr[i]= rand() % 20;
        cout << arr[i] << " ";
    }
    cout << endl;

    int max1 = arr[0];
    int max2 = arr[CLength - 1];
    int a,b;
    a = 0 ;
    b = CLength - 1 ;
    for (int i = 0; i < CLength; ++i)
    {
        if ((max1 < arr[i]) && (i != b)) {max1 = arr[i]; a = i;}
        if ((max2 < arr[(CLength - 1) - i]) && (((CLength - 1) - i) != a)) {max2 = arr[(CLength - 1) - i]; b = (CLength - 1) - i;}

    }
    cout << "\nresult: " <<  max1  << " x " <<  max2  << " = " <<  max1 * max2  << endl;
    return 0;
}

Автор: orthrus 11.3.2010, 08:48
был дубльsmile

Автор: Dov 11.3.2010, 08:50
orthrus, потестировать забыл?  smile 


Автор: orthrus 11.3.2010, 08:54
почему?

Автор: t_gran 11.3.2010, 11:16
Цитата

почему? 

orthrus, http://codepad.org/4k6fmmgW на ответ smile

Автор: orthrus 11.3.2010, 11:42
Поправил код smile

Автор: Dov 11.3.2010, 14:33
Цитата(Dov @  5.3.2010,  23:43 Найти цитируемый пост)
Три человека, которые первыми напишут работающий вариант...

orthrus, третьим будешь.  smile   

з.ы.  но в следующий раз не опаздывай...   smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)