Форум программистов, компьютерный форум CyberForum.ru

Почему не правильно считает что не так? - C++

Восстановить пароль Регистрация
 
Dgaizer
41 / 41 / 1
Регистрация: 25.03.2014
Сообщений: 328
29.11.2014, 13:11     Почему не правильно считает что не так? #1
В данной программе я пытаюсь найти процентное отношение ассоциативного массива map<string,int>rezultat;
rezultat=123421 из текстового файла записывается
к baza["mazda"]=121121;
baza["lada"]=113432;
baza["toyota"]=122112;
baza["bmw"]=113313;
baza["dodge"]=114244;
baza["chevrolet"]=123421;



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <clx.h>
#pragma hdrstop
#include <iostream.h>
#include <string.h>
#include <map>
#include <fstream.h>
#include <iomanip.h>
//---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{  map<string,int>baza;
   map<string,int>::iterator b;
   baza["mazda"]=121121;
    baza["lada"]=113432;
     baza["toyota"]=122112;
      baza["bmw"]=113313;
      baza["dodge"]=114244;
      baza["chevrolet"]=123421;
 
 
        ifstream in("rezultat.txt");
        if(!in)
        {
             cerr<<"Error can't open file";
             system("pause");
             exit(1);
        }
        map<string,int>rezultat;
        map<string,int>::iterator s;
        string rezulta;
        int count=0;
        while(in>>rezulta)
        {
             rezultat[rezulta]++;
        }
 
              for(s=rezultat.begin();s!=rezultat.end();s++)
              {  count+=(*s).second;
 
               }
             for(b=baza.begin();b!=baza.end();b++)
              {
                cout<<(*b).first<<" : "<<(float)((float)(*b
                ).second/(float)count)*100<<"%"<<endl;
 
              }
 
 
 
 
        system("pause");
        return 0;
}
Миниатюры
Почему не правильно считает что не так?  
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
01.12.2014, 19:06     Почему не правильно считает что не так? #2
Dgaizer, прикрепите исходный файл из которого данные записываются в карту.
Dgaizer
41 / 41 / 1
Регистрация: 25.03.2014
Сообщений: 328
01.12.2014, 21:29  [ТС]     Почему не правильно считает что не так? #3
S_el, я не могу его загрузить пишет ошибку что уже много раз выкладывал в нем просто записаны числа 12354
файл по этому адресу находится
Сравнений 2 файлов
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
01.12.2014, 21:37     Почему не правильно считает что не так? #4
Цитата Сообщение от Dgaizer Посмотреть сообщение
я не могу его загрузить пишет ошибку что уже много раз выкладывал в нем просто записаны числа 12354
Это одно число,на которое нужно поделить каждое из значений карты baza?
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2787 / 1433 / 393
Регистрация: 18.10.2014
Сообщений: 2,639
01.12.2014, 22:03     Почему не правильно считает что не так? #5
Цитата Сообщение от Dgaizer Посмотреть сообщение
найти процентное отношение ассоциативного массива
Что такое "процентное отношение ассоциативного массива"? Отношение чего к чему? И как это все связано с тем, что вы делаете в своем коде?

Вы читаете содержимое файла 'rezultat.txt' как последовательность строк и считаете статистику (число вхождений) по каждой уникальной строке. Затем вы суммируете всю эту статистику, т.е. получаете 'count' - просто общее количество строк в файле 'rezultat.txt'. Затем вы делите каждое из значений базы на этот 'count' и умножаете на 100.

Таки образом, конкретное содержимое файла 'rezultat.txt' значения не имеет вообще. Важно только сколько в нем строк. Т.е. файл с "1 2 1" эквивалентен файлу с "хрю мяу гав". Зачем вы собирали статистику по каждой уникальной строке, если вам нужно только общее количество строк, мне не ясно - у вас эта статистика никакой роли в коде не играет.

Согласно вашим объяснениям, в вашем 'rezultat.txt' находится только одна строка. Т.е. все будет делиться на 1 и затем умножаться на 100. Именно это вы и видите в выводе. Так в чем проблема-то?
Dgaizer
41 / 41 / 1
Регистрация: 25.03.2014
Сообщений: 328
01.12.2014, 23:08  [ТС]     Почему не правильно считает что не так? #6
S_el,TheCalligrapher, в файл результат будут записываться разные значения в ходе выполнения первой программы теста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream.h>
#include <stdio.h>
#include <windows.h>
#include <fstream.h>
#include <string.h>
#pragma argsused
 
 
int main(int argc, char* argv[])
{
ofstream fout;
fout.open("rezultat.txt");
 
int v=0;
char str[500];
  char str1[500];
  CharToOem("Не правильный вариант ответа",str1);
  CharToOem("Машину производства какой страны вы хотите??\n"
  "1)Япония\n"
  "2)Германия\n"
  "3)Россия\n"
  "4)Америка\n"
  ,str);
  cout<<str;
 
   CharToOem("Введите ваш ответ :\n",str);
  cout<<str;
  cin>> v;
  switch(v)
  {
  case 1:fout<<"1" ; break;
  case 2:fout<<"2"  ; break;
  case 3:fout<<"3"  ;break;
  case 4: fout<<"4" ;break;
  default: cout<<str1;
  }
 
  CharToOem("Выберите рулевое управление :\n"
  "1)Справа\n"
  "2)Слева\n"
  ,str);
  cout<<str;
 
   CharToOem("Введите ваш ответ:\n",str);
  cout<<str;
  cin>>v;
   switch(v)
  {
  case 1:fout<<"1" ; break;
  case 2:fout<<"2"  ; break;
 
  default : cout<<str1;
  }
и мне каждый раз нужно будет просто считать на сколько данные ответы подходят к массивом т.е прошел тест записались результаты я их считываю и сравниваю с массивами и вывожу % к каждому массиву

Добавлено через 1 минуту
TheCalligrapher, я не знаю как это задание сделать поэтому сделал похожее чтобы мне помогли сделать хотя бы на примере исправили его мне нужно считать с файла значения и посчитать % к массиву вот как это сделать обьясните код какой будет?
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
01.12.2014, 23:09     Почему не правильно считает что не так? #7
Цитата Сообщение от Dgaizer Посмотреть сообщение
и мне каждый раз нужно будет просто считать на сколько данные ответы подходят к массивом т.е прошел тест записались результаты я их считываю и сравниваю с массивами и вывожу % к каждому массиву
Тогда встречный вопрос,вы уверены что хотите хранить значением int? Сравнивать каждую цифру будет неудобно,может проще сделать тоже string и сравнивать посимвольно?
Dgaizer
41 / 41 / 1
Регистрация: 25.03.2014
Сообщений: 328
01.12.2014, 23:12  [ТС]     Почему не правильно считает что не так? #8
S_el, я повторюсь я не знаю правильного решения и делал как думал сам напишите как правильно сравнивать посимвольно я просто представления не имею как это будет выглядеть т.к я уже говорил в программировании я не очень
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
01.12.2014, 23:49     Почему не правильно считает что не так? #9
Цитата Сообщение от Dgaizer Посмотреть сообщение
я повторюсь я не знаю правильного решения
так и я его не знаю
Давайте начнем с формулировки задачи:
Задана структура данных map где ключи - марки автомобилей,а значения - "значение" из тестовой таблицы.
Есть файл в котором находятся строки-цифровые комбинации прохождения теста для разных авто.
Необходимо определить процент совпадений для заданных вариантов и вариантов из файла.

Это в простой постановке,дальше её можно будет усложнять,но по-крайней мере будет от чего оттолкнутся.
Пока все верно?
Dgaizer
41 / 41 / 1
Регистрация: 25.03.2014
Сообщений: 328
01.12.2014, 23:50  [ТС]     Почему не правильно считает что не так? #10
S_el, да и больше ничего не надо
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
02.12.2014, 00:13     Почему не правильно считает что не так? #11
Dgaizer, переделал,проверяйте

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <string>
#include <map>
#include <fstream>
#include <iomanip>
using namespace std;
 
int main()
    {  
    setlocale(LC_ALL,"rus");
    map<string,string>baza;
    baza["mazda"]="121121";
    baza["lada"]="113432";
    baza["toyota"]="122112";
    baza["bmw"]="113313";
    baza["dodge"]="114244";
    baza["chevrolet"]="123421";
 
    ifstream in("rezultat.txt");
    if(!in)
        {
        cerr<<"Error can't open file";
        return 1;
        }
 
    string temp;
    
    while(getline(in,temp))
    {
    for(auto i=baza.begin();i!=baza.end();i++)
        {
        int count=0;
        for(size_t j=0;j<(i->second.size());j++)
            {
            if(i->second[j]==temp[j])
                count++;
            }
        cout<<"Соответствие варианта "<<temp<<" с "<<i->first<<
            "с показателями "<<i->second<<
            " составляет "<<((double)(count)/i->second.size())<<endl;
 
        }
    cout<<endl;
    }
 
    return 0;
    }
Dgaizer
41 / 41 / 1
Регистрация: 25.03.2014
Сообщений: 328
02.12.2014, 00:19  [ТС]     Почему не правильно считает что не так? #12
S_el, ошибки пишет
[C++ Error] Unit111.cpp(36): E2034 Cannot convert '_Rb_tree_iterator<pair<const string,string>,_Nonconst_traits<pair<const string,string> > >' to 'int' [C++ Error] Unit111.cpp(36): E2096 Illegal structure operation 30 строка
и
[C++ Error] Unit111.cpp(41): E2288 Pointer to structure required on left side of -> or ->* в 33 строке 38 39 40
на стрелки ругается
S_el
1906 / 1501 / 295
Регистрация: 15.12.2013
Сообщений: 5,913
02.12.2014, 00:24     Почему не правильно считает что не так? #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Dgaizer, похоже ваш компилятор не поддерживает C++11,я мог бы и догадатся по заголовочным файлам
Замените auto на:
C++
1
map<string,string>::iterator
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.12.2014, 00:34     Почему не правильно считает что не так?
Еще ссылки по теме:

C++ Перегрузка операторов - Оба случая работают правильно, почему так?
C++ Обьясните, почему код так странно считает факториалы
Почему методом Гаусса считает правильно только первый корень? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dgaizer
41 / 41 / 1
Регистрация: 25.03.2014
Сообщений: 328
02.12.2014, 00:34  [ТС]     Почему не правильно считает что не так? #14
S_el, все супер вообще красавчик просто бог отвечаю я даже не знаю как вас отблагодарить
Yandex
Объявления
02.12.2014, 00:34     Почему не правильно считает что не так?
Ответ Создать тему
Опции темы

Текущее время: 12:17. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru