Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2

Трабл с map

16.06.2011, 19:38. Показов 1732. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток
В input.txt лежат названия поездов, время их отправления и прибытия. Расстояние - константа. Нужно вывести самый быстрый поезд. Полное условие тут
Пытаюсь решить в си стиле с использованием map
Как - то так получилось.
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
#include <map>
#include <cstdio>
float q,i,a,n,t;
char s[53];
int main(){
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    std::map<float,char *> m;
    int o;
    for (scanf("%f",&n);n--;){
        o = 0;
        scanf("\n%c",&s[o++]);       //считывание с первой
        for(;;){
            scanf("%c",&s[o++]);
            if (s[o-1]=='"') break; //по последнюю кавычку
        }                               //считывается корректно, проверено
        s[o] = 0;
        scanf("%f:%f",&a,&i);
        a += i/60;
        scanf("%f:%f",&i,&t);
        i += t/60;
        if (i <= a) i += 24;
        q = i-a;  //теперь в q лежит время поезда
        m[650/q]=s; //пытаюсь засунуть в это место строку     
    }
    //То, что нужно вывести - printf("The fastest train is %s.\nIt's speed is %d km/h, approximately.",(*--m.end()).second,int((*--m.end()).first+0.5));
    //Просто вывод того, что получилось:
    for (std::map<float,char*>::iterator it = m.begin();it!=m.end(); ++it)
        printf("%s - %d\n",it->second,(int)(it->first+0.5));//2й аргумент- быдлоокругление
    return 0;
}
Конкретно проблемы с 24й строкой.
Видимо делаю что-то неправильно, т.к. присваивается одно значение(что интересно, последнее введенное, но всем элементам зараз =0 ). Примеры тестов есть по ссылке выше. Пробовал использовать strcpy - Segmentation fault
В чем моя ошибка, и как это можно исправить?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.06.2011, 19:38
Ответы с готовыми решениями:

SFML + Tiled Map Editor + tinysml2 (трабл с версиями)
Здравствуйте, я сейчас разбираю уроки по SFML https://www.youtube.com/playlist?list=PLskEAOuS4gQMoAE68-71KRxQegr8rSw54 . Для создания...

Обращение к элементам vector, который находится в map, находящийся в map
Всем добрый день! Имеется такой контейнер. Как обращаться к элементам вектора и как пушбэчить его? map...

Поместить вектора в map и реализовать перегрузку вывода для map
Всем привет! Нужна помощь в написании программы. У меня есть вот такая прога и мне нужно каким-то образом поместить вектора в map и...

12
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
16.06.2011, 19:49
в следующий раз выкладывай что-нибудь более читабельное. Ну кто называет переменную о. Это же постоянная путаница с 0
1
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
16.06.2011, 19:51
diagon, Ну раз значение мапы это указатель, следовательно надо сначала выделить память под него и потом strcpy(), не ?
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.06.2011, 19:51  [ТС]
Ну за читабельность я извиняюсь, просто сайт весьма специфичный, там критерием оценки задачи является количество символов... Вот я и делаю сразу заготовку, чтобы потом можно было просто ее сжать. о я позже ввел, а i уже использовалась=\ Да и считывается строка нормально, проблема именно с map
Цитата Сообщение от asics Посмотреть сообщение
diagon, Ну раз значение мапы это указатель, следовательно надо сначала выделить память под него, не ?
Хм... Этож просто указатель...
А... Строка ведь изменяется=(
Т.е. получается, что они все указывают на одну ячейку памяти, в которой лежит последнее введенное значение?
0
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
16.06.2011, 20:01
diagon, Ты попробуй так как я написал, мб и не поможет, я же просто предложил.
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.06.2011, 20:02  [ТС]
Да нет, помогло вроде
Написал так
C++
1
strcpy(m[650/q]=new char[strlen(s)],s);
Заработало. Правда теперь wa на 5 тесте, но это уже другая тема =)
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
16.06.2011, 20:02
замени char на string и всё
1
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
16.06.2011, 20:03
Цитата Сообщение от pito211 Посмотреть сообщение
замени char на string и всё
Видимо ТС не ищет легких путей
1
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
16.06.2011, 20:04
Под строку, завершающуюся нулём, надо выделять strlen(s)+1
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.06.2011, 20:04  [ТС]
String много символов жрет, так что не вариант.
Это не та задача, которую интересно решать через STL =)
Под строку, завершающуюся нулём, надо выделять strlen(s)+1
Я тоже так подумал, но все же и так работает. А лишние 2 символа не помешают =)
0
 Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612
16.06.2011, 20:06
cout и cin короче printf и scanf, но почему то ты не используешь их
1
Эксперт С++
 Аватар для grizlik78
2382 / 1666 / 279
Регистрация: 29.05.2011
Сообщений: 3,402
16.06.2011, 20:08
strlen копирует все символы строки, плюс завершающий ноль. А место под него не выделялось. Ноль записался в чужую ячейку. Сегодня работает, а завтра перестанет. Хотя, хозяин — барин
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
16.06.2011, 21:29  [ТС]
Цитата Сообщение от pito211 Посмотреть сообщение
cout и cin короче printf и scanf, но почему то ты не используешь их
Еще короче fstream без подключения using namespace std;
Но есть одно но - под это нужны дополнительные хедеры.
На проверяющей системе стоит VC++, у которого замечена интересная особенность - при подключении <map> stdio включается автоматом=) Итого только 1 хедер
Да и время там в формате 10:00, потоками это некорректно читает.
P.S. Раз уж тема про map получилась, то еще 1 вопрос - как можно обратится к последнему элементу? Что-то вроде map.end()-1->first
выдает километровый error, по разному извращался, дошел только до префиксного декремента(как в 1 посте)

Добавлено через 20 минут
Поменял float на double, Accepted=)

P.S.
Вот рабочий код, возможно кому понадобится.
Также в нем видно, зачем мне эти извращения=) Правда в итоге все равно даже до 10го места немного недотянул, зато получил глубокое моральное удовлетворение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <map>
#define x(b) freopen(#b"put.txt","a+",std##b);
#define y scanf(
double i,a,n,t;
char s[53];
main(){
    x(in)
    x(out)
    std::map<float,char *> m;
    for (y "%lf",&n);n--;strcpy(m[650/t]=new char[strlen(s)+1],s)){
        int j = 0;  
        for(y "\n%c%c",&s[j++],&s[j+++1]);s[j-1]!='"';)
            y "%c",&s[j++]);
        s[j] = 0;
        y "%lf:%lf",&a,&i);
        a += i/60;
        y "%lf:%lf",&i,&t);
        i += t/60;
        if (i <= a) i += 24;
        t = i-a;    
    }
    printf("The fastest train is %s.\nIt's speed is %d km/h, approximately.",(*--m.end()).second,int((*--m.end()).first+0.5));
}
P.P.S. grizlik78 был прав, strlen(s) не хватило, на 7 тесте из-за этого заваливался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.06.2011, 21:29
Помогаю со студенческими работами здесь

Обращение к map, который внутри другого map
std::map&lt;int, std::map&lt;std::string, int&gt;&gt; m1; std::map&lt;std::string, int&gt; m2; void main() { m1 = m2; m2 = 7; ...

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map?
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

Как вставить элемент и вывести элементы на экран в map<string, map<string,int>> ?
У меня есть map&lt;string, map&lt;string,int&gt;&gt;, в него надо добавить элементы (типа Ivanov potato 200) Использовать именно map&lt;string,...

Как вставить map в map
есть такой map map &lt; INT64 , map &lt;INT64 , map&lt; wArray , int &gt; &gt; &gt; tMenu; как его заполнить? пробовал так ...

Emplace в std::map. Как добавить элемент в std::map без копирования?
здравствуйте... есть ли способ не писать так: std::map&lt;int, char&gt; ksa; ksa.emplace(std::piecewise_construct, ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru