Премини към съдържанието

Препоръчан отговор


Имам една задача, която не мога да реша до край... 

 

Да се създаде свързан списък от цели числа, до въвеждането на 0. Да се 

намерят най-малкото положително и най-голямото отрицателно число в списъка. Да
се изтрият от списъка всички елементи, които са по-малки от средното аритметично
на тези две числа. Промененият списък да се изведе на екрана.
 

#include <iostream>

#include <list>
#include <queue>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
    list<int> l ;
    list<int>::iterator it;
    int n;
    int x;
     while(x!=0){
          cout<<"Enter an element: ";
          cin>>x;
     l.push_back(x);
     }
     for ( it = l.begin(); it != l.end(); it++ )   //Обхождане и извеждане на списък
    //cout << *it << " ";   
                               
     ???
 
    return 0;
}
 

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

"Да се създаде свързан списък от цели числа" - го разбирам не да ползваш наготово STL списък, а да си организираш списъка сам - структура, методи за добавяне и триене на елемент от списъка и чак след това да търсиш минимално положително, максимално отрицателно и кои елементи да махнеш.

Редактирано от ined (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да се създаде свързан списък от цели числа, до въвеждането на 0. Това го направих, а това означава да въведеш числата от клавиатурата докато въведеш 0. След това незнам как да намеря най-малкото положително и най-малкото отрицателно, просто забих...

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да се създаде свързан списък от цели числа, до въвеждането на 0. Това го направих, а това означава да въведеш числата от клавиатурата докато въведеш 0. След това незнам как да намеря най-малкото положително и най-малкото отрицателно, просто забих...

проверявате следното

числото < от предишното най-малко И числото >0

аналогично за отрицателните

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

С масивите е по-лесно май..

Редактирано от Valentino512 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

проверявате следното

числото < от предишното най-малко И числото >0

аналогично за отрицателните

Има малък трик с инициализацията. Особено, ако допуснем, че няма граници.

Искам да попитам дали мога да ги намеря като използвам quicksort ?

Това ще е невероятно неефективен начин. Не стига че сортирането е много по-тежка операция, ами и ще трябва да използваш специална сортираща функция/клас или да ги търсиш в средата на сортирания списък.

Ако ще ползваш готови - то си има функции за максимална и минимална стойност.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Има малък трик с инициализацията. Особено, ако допуснем, че няма граници.

Това ще е невероятно неефективен начин. Не стига че сортирането е много по-тежка операция, ами и ще трябва да използваш специална сортираща функция/клас или да ги търсиш в средата на сортирания списък.

Ако ще ползваш готови - то си има функции за максимална и минимална стойност.

На края ще си го направа сам май  :D

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Има малък трик с инициализацията. Особено, ако допуснем, че няма граници.

...

Аз присвоявам първия елемент и въртя цикъла от втория :)

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Тоя номер не минава ако има допълнително условие и това условие не се изпълнява за първия елемент.

Примерно търсиш най-малкото положително, ако първия елемент е отрицателно число няма как да го използваш.

Редактирано от ined (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Тоя номер не минава ако има допълнително условие и това условие не се изпълнява за първия елемент.

Примерно търсиш най-малкото положително, ако първия елемент е отрицателно число няма как да го използваш.

Под първия елемент имам предвид първия, който изпълнява останалите условия :)

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Не извъртай думите, достатъчно е да бутнеш контекста...


Като гледам в нета, повечето учители учат да се почва с + безкрайност или минус безкрайност, или нула, щото са крайности. Но с първия елемент е по удобно, и не се налага да познаваш крайностите, или да ги търсиш, или да си ги спомняш.

 

Предполагам, че е останало от някой авторитет, който е правел и е преподавал така. Както навсякъде, ползването на чуждия опит и откривателството имат своите предимства и недостатъци.

Редактирано от Реджеп Иведик (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

На края ще си го направа сам май  :D

То това е идеята. Ние само помагаме :)

Под първия елемент имам предвид първия, който изпълнява останалите условия :)

Това имах предвид. :P Особено ако вземем предвид че търсим не една, а две стойности отговарящи на различни условия. Това внася ограничения, например не можеш да продължиш директно след инициализиращия цикъл.
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ето го и решението ми:

(най-накрая :D )

 

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

using namespace std;

bool Max (const int& value) { return (value > 0); }         //  Функция с която изтривам положителните
bool Min (const int& value) { return (value < 0); }           // Функция с която изтривам отрицателните

int main()
{
    list<int> l ;
    list<int>::iterator it;
    list<int> l2;
    list<int>::iterator it2;
    list<int> l3 ;
    list<int>::iterator it3;
    int x;
     while(x!=0){   
          cout<<"Enter an element: ";             
          cin>>x;                                 
          l.push_back(x);
          l2.push_back(x);
          l3.push_back(x);
     }

     l.pop_back();                      
     l2.pop_back();
     l3.pop_back();

     cout << endl;
     l.remove_if (Min);
     it =  min_element( l.begin(), l.end() );
     cout<< "nai-maluk polojitelen element= " << *it ;
     cout<< endl;

     cout << endl;
     l2.remove_if (Max);
     it2 =  max_element( l2.begin(), l2.end() );
     cout<< "nai-golqm otricatelen element= " << *it2 ;
     cout<<endl;

     for ( it3 = l3.begin(); it3 != l3.end(); it3++ )      //Обхождане и извеждане на списък
     cout << *it3 << "  ";                                   // Извеждане на елементите на списъка
     return 0;
}
gallery_167987_1965_10618.png

 

Редактирано от Valentino512 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Направо си я предобрил, вместо един списък цели три.

Проблема е че не се вързва с условието.

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Направо си я предобрил, вместо един списък цели три.

Проблема е че не се вързва с условието.

Между другото направи ли ти впечатление, че последната част от условието е особено смислена?

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Има една неяснота, Ако имаш положителни и отрицателни елементи - махаш отрицателните и останалия списък го извеждаш.

Но ако имаш само отрицателни или само положителни как да определиш средното аритметичното?

Ако са само положителни да кажем го оставяш списъка както си е, ама ако са отрицатени празен ли да го оставиш или най-голямото отрицателно трябва да остане.?

Редактирано от ined (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Има една неяснота, Ако имаш положителни и отрицателни елементи - махаш отрицателните и останалия списък го извеждаш.

Но ако имаш само отрицателни или само положителни как да определиш средното аритметичното?

Ако са само положителни да кажем го оставяш списъка както си е, ама ако са отрицатени празен ли да го оставиш или най-голямото отрицателно трябва да остане.?

Да, едно че не е определено поведението във всички случаи и две че изтриване на всички по-малки от средно аритметичното е винаги еквивалентно на изтриване на всичките отрицателни числа, което изобщо прави безсмислено намирането му.

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Поправям се! 

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

using namespace std;

int abc;
bool Max (const int& value) { return (value > 0); }         //  Функция с която изтривам положителните
bool Min (const int& value) { return (value < 0); }           // Функция с която изтривам отрицателните
bool srd (const int& value) { return (value < abc); }            // Функция с която изтривам по-малки от средното аритметично

int main()
{
    list<int> l ;
    list<int>::iterator it;
    list<int> l2;
    list<int>::iterator it2;
    list<int> l3 ;
    list<int>::iterator it3;
    int x;
     while(x!=0){
          cout<<"Enter an element: ";
          cin>>x;
          l.push_back(x);
          l2.push_back(x);
          l3.push_back(x);
     }

     l.pop_back();
     l2.pop_back();
     l3.pop_back();

     cout << endl;
     l.remove_if (Min);
     it =  min_element( l.begin(), l.end() );
     int m = *it;
     cout<< "nai-maluk polojitelen element= " << *it ;
     cout<< endl;
     cout<< endl;

     cout << endl;
     l2.remove_if (Max);
     it2 =  max_element( l2.begin(), l2.end() );
     int n = *it2;
     cout<< "nai-golqm otricatelen element= " << *it2 ;
     cout<<endl;
     cout<<endl;

     int srda = (m+n)/2;
     abc = srda;
     l3.remove_if(srd);
     for ( it3 = l3.begin(); it3 != l3.end(); it3++ )      //Обхождане и извеждане на списък
     cout << *it3 << "  ";                                   // Извеждане на елементите на списъка
     return 0;
}

и живота на Чарли Шийн не е лесен  :D 

Редактирано от Valentino512 (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Подобни теми

    • от Chris Panov
      Здравейте, 
      В момента пиша една програма, в която в една от функциите ми се налага да излезна по-рано при определено условие. Функцията връща string впрочем.
      Ето кодът:
       
      #include "stdafx.h" #include <iostream> #include <string> #include <sstream> #include <vector> #define CONSOLE_LOG(x) std::cout << x #define COMMAND_END command[0] #define COMMAND_SUM command[1] #define COMMAND_SUBTRACT command[2] #define COMMAND_CONCAT command[3] #define COMMAND_DISCARD command[4] #define COMMAND_DISPSEQ command[5] template <typename T> void top_back(std::vector<T>& v) {     v.erase(v.end() - 1); } std::string sum(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt + yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string subtract(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt - yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } } void dispseq(std::vector<std::string>& vec) {     std::vector<std::string>::const_iterator iter;     for (iter = vec.begin(); iter != vec.end(); iter++)     {         std::cout << *iter << std::endl;     } } void enterSequence() {     std::vector<std::string> command =     {         "end",         "sum",         "subtract",         "concat",         "discard",         "dispseq"     };     std::vector<std::string> sequence;     std::string input;     std::string a;     std::string b;     do     {         std::cin >> input;         sequence.emplace_back(input);         if (input == COMMAND_END)         {              top_back(sequence);         }         if (input == COMMAND_SUM)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(sum(a, b, sequence));         }         if (input == COMMAND_SUBTRACT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(subtract(a, b, sequence));         }         if (input == COMMAND_CONCAT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(concat(a, b, sequence));         }         if (input == COMMAND_DISCARD)         {             top_back(sequence);             top_back(sequence);         }         if (input == COMMAND_DISPSEQ)         {             top_back(sequence);             dispseq(sequence);         }     } while (input != COMMAND_END); } int main() {     enterSequence();     std::cin.get();     std::cin.get();     return 0; } И ето проблемната функция:
       
      std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } }  
      Както виждате ако стрингът x(който естествено го превръщам в интиджър) е по-малък от 0, теоритично трябва да излезна от функцията, и това е единственият начин за който се сетих, с return;, обаче пък компилаторът иска функцията да връща стойност, понеже е от тип стринг.
      Как да съчетая двете? - да връща стринг ако всичко е по план, и да излиза ако е по-малко от 0.
    • от Chris Panov
      Здравейте,
      В момента имам сериозен проблем със взимането на броят на елементи в даден вектор.
      vec.size(); и  
      sizeof(vec) / sizeof(vec[0]); не работят. Програмата те пита за брой ключове за даден тест, въвеждаш ключовете, после въвеждаш и отговорите, които са били дадени, и програмата ги сравнява и в зависимост от това колко верни отговори имаш ти дава точки. Ключовете и дадените отговори са тип char. ("A", "B", "C" etc.)
      Ето го и кода, като повечето съм го направил на коментар за да си тествам само функцията която извежда броя на елементите.
      #include "stdafx.h" #include <iostream> #include <vector> #define CONSOLE_LOG(x) std::cout << x; std::vector<char> keys = {'A', 'B', 'C', 'D', 'E'}; std::vector<char> studentAnswers; int n, points = 0; char key, answer; template <typename T> T vecSize(std::vector<T>& vec) { T size = vec.size(); return size; } /* template <typename T1> void enterKeys(std::vector<T1>& k) { CONSOLE_LOG("Please enter the number of keys: "); std::cin >> n; for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Key " << counter << ": "); std::cin >> key; k.emplace_back(key); } } template <typename T2> void enterAnswers(std::vector<T2>& stAns) { for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Answer " << counter << ": "); std::cin >> answer; stAns.emplace_back(answer); } } template <typename T3> void getGrade(std::vector<T3>& x, std::vector<T3>& y) { for (int i = 0; i < n; i++) { if (x[i] == y[i]) { points++; } } CONSOLE_LOG("Points: " << points); } */ int main() { /* enterKeys(keys); enterAnswers(studentAnswers); getGrade(studentAnswers, keys); */ std::cout << keys.size() << std::endl; std::cout << vecSize(keys) << std::endl; std::cin.get(); std::cin.get(); std::cin.get(); return 0; } Опитах всевъзможни начини, и пак не става. Идеята е да заместя n променливата със броя на елементите от вектора. Програмата върви по един и същи начин, защото все пак в n променливата запазваме големината на вектора, но бих искал да си го направя с функция.
      Както виждате на края на програмата си извеждам тестове. Първият, който си е по конвенционалният метод си работи сам по себе си, но пък във for цикъл не бачка.
      А вторият е функцията която съм направил. Проблемът е че ми извежда непознат символ - "�"
      Проблемът е че типът на елементите във вектора е char, защото като го направих с int тип си работеше както трябва.
      Бих бил изключително благодарен ако някой може да ме насочи и да ми бутне едно рамо :)
    • от Goshko
      Да се напише програма, която създава структура "Book" като имате следните полета - Title(заглавието на книгата), Автор(Author), Цена(Price) и уникален номер на книгата(ISBN-num). Да се ваведе цяло число n и след него n на брой данни за ученика. Да се изведе на монитора данните за книгата с цена по-висока от предварително зададена.
    • от Нели Николова
      Здравейте, имам две готови задачи, но не мога да ги компилирам. Дали може да ги проверите?
      зад.1 Да се състави програма, която да сортира едномерен масив от цели числа тип short  с име X състоящ се от 19 елемента. Сортирането да се извърши във възходящ ред чрез метода пряка селекция.
      #include <iostream>
      using namespace std;
      void sortAsc(short[]);
      int main() {
          short x[] = {123,13,23,31,1,55,36,17,8,9,10,11,6,12,14,15,16,35,184,19};
           
          sortAsc(x);
          
          return 0;
      }
      void sortAsc(short x[]){
          for(short i = 0; i < 19 ; i++) {
              for(short j = i; j < 19; j++) {
                  if(x[j] < x) {
                      swap(x[j], x);
                  }
              }    
          }
          
          for(int i=0; i<19; i++)
          {
              cout << x << endl;
          }
      }
      зад. 2 Да се състави програма,която реализира динамичен стек от реални числа тип float. Стекът да се преобразува в два нови стека, един стек P за четните и един стек O за нечетните числа от стек едно. Стековете да се извеждат на екрана.
      int main() {
          stack<float>numbers;
          stack<float>p;
          stack<float>o;
          
          for(short i = 1; i <= 200; i++) {
              numbers.push(i);
          }  
          
          numbers.push(200.64);
          numbers.push(203.34);
          
          while(!numbers.empty()) {
              int number = numbers.top();
              
              if (number % 2 == 0) {
                  p.push(number);
              } else {
                  o.push(number);
              }
              numbers.pop();
          }
          
          cout << "EVEN NUMBERS:" << endl;
          
          while(!p.empty()) {
              cout << p.top() << endl;
              p.pop();
          }
          
          cout << "ODD NUMBERS:" << endl;
          
          while(!o.empty()) {
              cout << o.top() << endl;
              o.pop();
          }
          
      }
      Много Ви благодаря :)
       
    • от Georgi Kirchev
      Здравейте имам да предам курсова работа утре ,но не мога да я реша , ще бъда изключително благодарен ако може някой да ми помогне.

      Дефинирайте клас Телевизор, който да е родител на клас Самсунг и клас Сони. Клас Телевизор да има цена и брой продадени за година в сектор private. Класовете Самсунг и Сони да имат в сектор public функции за определяне на общата сума от продажби за година (цена * брой продадени за година). Всички класове да имат конструктори по подразбиране.
       
      Благодаря предварително !
  • Дарение

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.