Loading...
zlobjul avatar zlobjul 4 Точки

Затруднение с 4та задача от втора лекция

Малко ми остава да го завърша , но вече изпуших . Кода работи ...освен в случаите, когато не работи :) 

Как да направя така , че да ми остава само най-често срещаното число във вектора mostCommonNumS . Като цяло в него вкарва най-често срещаното число , но заедно с него вкарва и най-често срещаното число - 1 . Как да структурирам частта с откриването и извеждането САМО на най-често срещанНИТЕ числа ? 

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

using namespace std;

int random(int min, int max){ //range : [min, max)
   static bool first = true;
   if ( first )
   {
      srand(time(NULL)); //seeding for the first time only!
      first = false;
   }
   return min + rand() % (max - min);
}

//int searchForLongestSentence(vector<int> eqIndex){
//
//int mostCommonNum = eqIndex.back();
//int mostFreq,mostHighest=0;
//
//std::sort(eqIndex.begin(), eqIndex.end());
//
//
//    for ( int i = 1; i < eqIndex.size(); i++){
//
//            if ( eqIndex[i] == eqIndex[i-1] ){
//                int num;
//                mostFreq++;
//                if (mostHighest <= mostFreq ){
//                mostHighest=mostFreq;
//                mostCommonNum=eqIndex[i];
//                }
//            }
//    }
//return mostCommonNum;
//
//}

int main(){

vector<int> Vector;
int NumCount;
cout << "Please enter the length of random numbers to be generated (number generated range will be 0-9):";
cin >> NumCount;


// Generate and display random numbers from 0-9


for (int i = 0; i < NumCount; i++ ){
int number;
number = random(0,9);
Vector.push_back(number);

cout << Vector[i];

if ( i < NumCount - 1 ){
        cout << ' ' ;
    }
}
cout << endl;
std::sort(Vector.begin(), Vector.end());

int mostFreq,mostHighest = 0;
vector<int> mostCommonNumS;

for ( int i = 1; i < Vector.size(); i++){

        if ( Vector[i] == Vector[i-1] ){
            mostFreq++;
            if (mostHighest <= mostFreq ){
            mostHighest=mostFreq;
            mostCommonNumS.push_back(Vector[i]);
            }
            }
        else  {
            mostFreq = 1;
        }
}

//delete duplicates
//sort( mostCommonNumS.begin(), mostCommonNumS.end() );
//
//
//mostCommonNumS.erase( unique( mostCommonNumS.begin(), mostCommonNumS.end() ), mostCommonNumS.end() );
//
//int test = searchForLongestSentence(mostCommonNumS);
//
//cout << "The longest sentence is " << test << endl;

for (int i = 0; i < mostCommonNumS.size(); i++){

    cout << mostCommonNumS[i];
}

cout << "The number(s) ";

for (int i =0; i < mostCommonNumS.size(); i++) {

    cout << mostCommonNumS[i];

    if ( i < mostCommonNumS.size() - 1 ){
        cout << ' ' ;
    }

 }

cout << " are/is the most frequent and occurs " << mostHighest << " times.";

    return 0;
}

Благодаря ! 

Тагове:
0
C++ Fundamentals
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Здравей,

Като за начало в задачата трябва потребителя да въвежда числата, не ти да ги генерираш произволно. Ако си го направил за да си улесниш тестването, имам по-добро предложение - измисляш си (или си генерираш) примерни входни данни и след това само copy-paste-ваш. Това има предимството, че едни и същи данни можеш да ги тестваш многократно и да ако имаш проблем можеш да се фокусираш конкретно върху него, а не всеки път (както при теб при всяко произволно генериране) да подхващаш различен проблем да оправяш.

Доколкото разбирам логиката на това, което правиш, проблемът ти е, че всеки път като ти се промени максимума срещания, добавяш числото в списъка от най-срещани. Това е проблем, защото за числата 1 2 2 3 3 3 първо най-срещано ще бъде 1, след това 2, след това 3. На база на твоята логика, това, което бих направил, е веднъж да намеря най-срещаното число и колко пъти се среща, и след това да мина още веднъж с цикъл и да добавя само тези числа, които се срещат толкова пъти - така избягваш проблема с излишните числа (и пак, това е нещо, което ако имаш едни и същи тестове ще можеш много по-лесно да го дебъгнеш отколкото да се надяваш поредното random генериране да ти даде правилните входни данни за да възпроизведеш проблема).

Обаче, тази задача има доста по-просто и ефикасно решение (което сигурно ще се събере в 20 реда код). Това което ти правиш може да се направи да работи, но става доста код, а и включва неща, които не сме учили (не че е лошо да ги ползваш, но аз се старая да давам задачи, които могат да се решат със знанията, които имате).

Как може да се реши това по-ефикасно? Обърни внимание на числата, които могат да бъдат във входа. Единствените възможни числа са 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. И за всяко едно на практика трябва да преброиш колко пъти се среща, и накрая просто да изкараш това, което се среща най-много пъти. Имаш числа, и бройките им. На какво ти прилича това? Как би я решил тази задача на лист хартия ако имаш много на брой числа, но знаеш, че те са от 0 до 9?

Поздрави,

Жоро

0
zlobjul avatar zlobjul 4 Точки

Благодаря Жоро , 

Ами направих го , но съм доста далече от 20-те реда код ... Явно не виждам простото решение :) 

Ето и кода , който направих : 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> arrayInput(int num){
    vector<int> arr;
    int arrSize;

    cout << "Please enter the length of Array" << num << ": ";
    cin >> arrSize;

    cout << "Please enter "<< arrSize << " numbers, separated by spaces: " ;


    for ( int i = 0; i < arrSize ; i++) {
        int number;
        cin >> number;
        arr.push_back(number);
        }
return arr;
}

vector<int> searchForLongestSentence(vector<int> eqIndex ){

std::sort(eqIndex.begin(), eqIndex.end());

vector<int> mostCommonNumS;
int max_count = 0;

for (int i = 0; i < eqIndex.size(); i++){
      int temp_cnt = 0;

      for (int j = 0; j < eqIndex.size(); j++){
         if (eqIndex[i] == eqIndex[j])
            ++temp_cnt;
      }
      if (temp_cnt){
         if (temp_cnt > max_count){
            max_count = temp_cnt;
            mostCommonNumS.clear();
            mostCommonNumS.push_back(eqIndex[i]);
         }
         else if (temp_cnt == max_count){
            mostCommonNumS.push_back(eqIndex[i]);
         }
      }
   }

return mostCommonNumS;
}

int main(){


vector<int> array1 = arrayInput(1);
vector<int> FreqNums;

for (int i = 0; i < array1.size(); i++){

    for (int q = 0; q < 10 ; q ++ ){
        if ( array1[i] == q ){
            FreqNums.push_back(array1[i]);
        }
    }
}

vector<int> result = searchForLongestSentence(FreqNums);
result.erase( unique( result.begin(), result.end() ), result.end() );

cout << "The most common numbers are : ";

for (int i = 0; i < result.size(); i++){
cout << result[i];
    if ( i < result.size() - 1 ){
        cout << ",";
    }
}

    return 0;
}

 


Поздрави, 

Любо

0
26/11/2017 15:13:27
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.