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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
#1

Пройденный роботом путь - C++

11.12.2009, 20:04. Просмотров 1731. Ответов 20
Метки нет (Все метки)

Всем привет. Совсем недавно начала изучать язык С++ и попалась такая задача, никак не могу понять, как к ней подойти вообще, возможно, кто-то сможет помочь?

Напишите программу, которая будет вычислять пройденный некоторым условным роботом путь и затраченное время на основании записанных в файл данных о количестве оборотов каждого из двух колес робота. Робот может поворачивать, полностью останавливая одно из своих колес или совершая обороты ими в противоположных направлениях. Диаметры колес и другие параметры робота известны (задаются пользователем).
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.12.2009, 20:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Пройденный роботом путь (C++):

Вычислить пройденный по МКАД путь - C++
МКАД Длина Московской кольцевой автомобильной дороги —109 километров. Байкер Вася стартует с нулевого километра МКАД и едет со...

Вывести на экран путь, пройденный пешеходом, если известны его скорость и время движения - C++
:( "Составление программ с использованием функций, не возвращающих значения" Написать программу, выводящую на экран путь, пройденный...

Определить путь, пройденный телом, падающим с ускорением, после первой и второй секунд падения - C++
Тело падает с ускорением g. Определить пройденный телом путь h = gt ^ 2/2 после первой и второй секунд падения

Разработать архитектуру программы управления роботом - C++
Робот принимает команды типа "go north 1000", "turn left", "beep 5", "analyze oxygen", "analyze earth" и так далее. Архитектура должна...

Рекурсивный обход роботом плоской фигуры - C++
Всем доброго времени суток. Помогите, пожалуйста, в решении задачи на рекурсию. Необходимо, чтобы пользователь нарисовал какую-либо...

Управление мобильным роботом, построенным на базе Pololu. - C++
Доброе время суток. Нужно написать или заставить работать готовую программу для управления мобильным роботом построенного на базе Pololu. К...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.12.2009, 15:07 #16
Цитата Сообщение от Zhenechka Посмотреть сообщение
ну, я думаю пользователь в файле может задать все необходимое, что только требуется...
Тогда можно воспользоваться вариантом manfeese. И если действительно нужно только:
Цитата Сообщение от Zhenechka Посмотреть сообщение
которая будет вычислять пройденный некоторым условным роботом путь и затраченное время
то решение данной задачи сводится к следующему:
1. затраченное время вычисляется так: считываем по парам числа из файла. если в паре хоть одно число не равно 0, то к счетчику прибавляем 1. В итоге счетчик покажет общее время когда хоть одно колесо крутилось. Если нужно время которое было затрачено именно на прохождение пути (т.е. повороты на месте не учитываем), то учитываем только пары,где оба числа равны или 1,или -1.
2. пройденный путь будем вычислять так: счетчиком подсчитываем кол-во пар чисел из файла, в которых оба числа равны или 1, или -1. Затем зная диаметр колеса, скорость его движения вычисляем пройденный путь.
0
Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
21.12.2009, 17:12  [ТС] #17
ну, допустим, разберемся с временем и вычислением пути. А как с файлом работать, в котором вся информация хранится? Вот пишем в проге адрес файла и программа считывает с него данные. А все объявленные в файле переменные и константы и чего атм еще задается, не суть - в программе их объявлять как-нибудь надо вообще? Как она работает с ними?
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.12.2009, 18:45 #18
Цитата Сообщение от Zhenechka Посмотреть сообщение
Диаметры колес и другие параметры робота известны (задаются пользователем).
Судя по этой фразе диаметр колес и скорость вращения колеса задаются пользователем, во время выполнения программы. Тут стандартно:
C++
1
2
3
4
5
double diametr, skorost;
cout<<"Diametr= ";
cin>>diametr;
cout<<"Skorost (m/sek)= ";
cin>>skorost;
а дальше все вычисления, используя данные из файла.
0
Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
22.12.2009, 21:47  [ТС] #19
спасибо, буду разбираться

Добавлено через 22 часа 42 минуты
Вобщем, пришла к выводу псиать программу так: в файле содержится 2 строки, одна - числа оборотов первого колеса (с минусами и плюсами в зависимости от направления движения колеса), а вторая строка для второго. Я считываю из файла эти числа, записываю в 2 массива и дальше проделываю с ними операции по нахождению пути. Программа написана, компилируется, но при запуске обнаруживает ошибку, а в чем дело неизвестно:

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
54
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <time.h>
#include <iostream>
#include <math.h> 
int n1[255], n2 [255], c; //Задаем два массива, в которые в дальнейшем записываем обороты левого(n1) и парвого (n2) колес
int i=0, k, N;
double S1, S2, S, d;
const long double PI = 3.1415926;
 
 
int main(void)
{
FILE *fin; //Объявляем файл 'in'   
d=0.2; //Диаметр колес
k=0;
c=0;                                            
 
 
if ( ( fin = fopen("in.txt", "r"))== NULL )     //Проверка файла
        printf("Can't open input file!\n");
 
 while ( (n1[i])!= '\n') //Цикл выаполняется, пока не наткнемся на новую строчку
   { 
   fscanf(fin, "%d", &n1[i]);      //Считывается цифра из первой строки в файле в массив
   i++; 
   }
        k=i; //Присваеваем переменной k значение i? полученное на выходе из цикла (чтобы вывести время движения)
        i=0; //Обнуляем i, чтобы войти во второй цикл
        
   while (( n2[i])!= '\n') //Аналогиный цикл для второй строки
      { 
      fscanf(fin, "%d", &n2[i]);                   
 
      i++;
      }     
        
            S = 0; //Обнуляем переменные
            S1 = 0;
            S2 = 0;
 
            for (i=0; i<k; i++) //Цикл, вычисляющий путь, пройденный роботом
 
                 {
                      S1 =  PI*d*n1[i]; //Путь, пройденный левый колесом
                      S2 = PI*d*n2[i]; //Путь, пройденный правыйм колесом
                      S += fabs((S1) + (S2))/2; //Общий путь, который и требуется найти
                 }
 
 
printf("S=%1.5f", S); //Вывод пути
printf("\n");
system ("PAUSE");
Добавлено через 2 минуты
Предположительно что-то не так со считыванием и записью в массивы, но не пойму, что.
а В файле с именем "in" содержатся две строки что-то вроде этого:
-5 6 2 0 3 1
3 6 -2 3 7 -1
0
valeriikozlov
Эксперт C++
4670 / 2496 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
23.12.2009, 06:16 #20
Вот исправленный код:
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
54
55
56
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <time.h>
#include <iostream>
#include <math.h> 
int n1[255], n2 [255], c; //Г‡Г*Г¤Г*ГҐГ¬ äâГ* Г¬Г*Г±Г±ГЁГўГ*, Гў êîòîðûå Гў Г¤Г*ëüГ*åéøåì Г§Г*ïèñûâГ*ГҐГ¬ îáîðîòû ëåâîãî(n1) ГЁ ГЇГ*ðâîãî (n2) êîëåñ
int i=0, k, N;
double S1, S2, S, d;
const long double PI = 3.1415926;
 
 
int main(void)
{
FILE *fin; //Îáúÿâëÿåì ГґГ*éë 'in'   
d=0.2; //ÄèГ*ìåòð êîëåñ
k=0;
c=0;                                            
 
 
if ( ( fin = fopen("in.txt", "r"))== NULL )     //ÏðîâåðêГ* ГґГ*éëГ*
        printf("Can't open input file!\n");
 
 while (( c= getc(fin)) !='\n') //Г–ГЁГЄГ« ГўГ»Г*ïîëГ*ГїГҐГІГ±Гї, ïîêГ* Г*ГҐ Г*Г*ГІГЄГ*åìñÿ Г*Г* Г*îâóþ ñòðî÷êó
   { 
   fscanf(fin, "%d", &n1[i]);      //Ñ÷èòûâГ*ГҐГІГ±Гї öèôðГ* ГЁГ§ ïåðâîé ñòðîêè Гў ГґГ*éëå Гў Г¬Г*Г±Г±ГЁГў
   i++; 
   }
        k=i; //ÏðèñâГ*ГҐГўГ*ГҐГ¬ ïåðåìåГ*Г*îé k Г§Г*Г*Г·ГҐГ*ГЁГҐ i? ïîëó÷åГ*Г*îå Г*Г* âûõîäå ГЁГ§ öèêëГ* (÷òîáû âûâåñòè âðåìÿ äâèæåГ*ГЁГї)
        i=0; //ГЋГЎГ*óëÿåì i, ÷òîáû âîéòè ГўГ® âòîðîé öèêë
        
   while ((c = getc(fin)) != EOF) //ГЂГ*Г*ëîãèГ*ûé öèêë äëÿ âòîðîé ñòðîêè
      { 
      fscanf(fin, "%d", &n2[i]);                   
 
      i++;
      }     
        
            S = 0; //ГЋГЎГ*óëÿåì ïåðåìåГ*Г*ûå
            S1 = 0;
            S2 = 0;
 
            for (i=0; i<k; i++) //Г–ГЁГЄГ«, âû÷èñëÿþùèé ГЇГіГІГј, ïðîéäåГ*Г*ûé ðîáîòîì
 
                 {
                      S1 =  PI*d*n1[i]; //ГЏГіГІГј, ïðîéäåГ*Г*ûé ëåâûé êîëåñîì
                      S2 = PI*d*n2[i]; //ГЏГіГІГј, ïðîéäåГ*Г*ûé ГЇГ°Г*âûéì êîëåñîì
                      S += fabs((S1) + (S2))/2; //ГЋГЎГ№ГЁГ© ГЇГіГІГј, êîòîðûé ГЁ òðåáóåòñÿ Г*Г*éòè
                 }
 
 
printf("S=%1.5f", S); //Âûâîä ïóòè
printf("\n");
system ("PAUSE");
return 0;
}
Но вот эта формула:
C
1
 S += fabs((S1) + (S2))/2;
не правильная. Она подходит только для случаев, если два колеса равномерно вращались (в одну и туже сторону или разные). Для остальных случаев она считает неверно. Например: 1 колесо совершило сколько-то оборотов и проехало 4 метра (S1=4), 2 колесо стояло на месте (S2=0). По этой формуле получим что робот передвинулся на 2 метра, хотя на самом деле должно получится 0.
Лучше тогда уж воспользоваться вариантом, который предлагал manfeese. Т.е. в файле храняться данные в виде пар чисел, каждое из которых 0, 1 или -1 и которые показывают, состояние колес за дискретный промежуток времени.
0
Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
23.12.2009, 16:09  [ТС] #21
valeriikozlov
Как раз формула верная. Потому что я решаю задачу, исходя из того, что есть два колеса и центр между ними. Так вот если одно колесо стоит на месте, а второе крутится, то, нарисовав рисунок, сразу видно, что центр робота при этом передвигается по окружности, радиус которой равен половине радиуса окружности, по которой двигается вращающееся колесо. Откуда получаем, что центр робота смещается на половину пройденного вторым колесом пути. И эта формула так же верна для всех остальных случаев. Иначе задача становится еще более сложной. А за код спасибо большое!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2009, 16:09
Привет! Вот еще темы с ответами:

Определить путь S, пройденный лодкой (путь=время*скорость). - Delphi
Скорость лодки в стоячей воде V км/ч, скорость течения реки U км/ч (U&lt;V). Время движения лодки по озеру Т1 ч, а по реке против течения Т2...

Определить путь S, пройденный лодкой - C#
Помогите решить задачу в C#. Скорость лодки в стоячей воде V км/ч, скорость течения реки U км/ч (U &lt; V). Время движения лодки по озеру T1...

Определить пройденный телом путь - Механика
Здравствуйте, помогите решить задачу. Телу массой 10 кг придали начальное ускорение 10 м/с. Определите какое расстояние пройдет тело за 20...

Определить путь, пройденный лодкой - Pascal ABC
Здравствуйте!!!помогите пожалуйста никак не могу решить задачу,одна надежда на вас.Заранее спасибо. 1.Шахматный конь за один ход может...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.12.2009, 16:09
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru