0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
1

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

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

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

Напишите программу, которая будет вычислять пройденный некоторым условным роботом путь и затраченное время на основании записанных в файл данных о количестве оборотов каждого из двух колес робота. Робот может поворачивать, полностью останавливая одно из своих колес или совершая обороты ими в противоположных направлениях. Диаметры колес и другие параметры робота известны (задаются пользователем).
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.12.2009, 20:04
Ответы с готовыми решениями:

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

Определить пройденный телом путь
Тело свободно падает. Определить пройденный телом путь после первой и второй секунды падения.

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

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

20
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
11.12.2009, 21:03 2
пример файла пожалуйсто
0
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
11.12.2009, 21:07  [ТС] 3
В том-то и дело, что мне неизвестно ровным счетом ничего, я не могу разобраться в этой задаче начиная с ее начала и заканчивая, естественно, концом(((
Самому придумать видимо надо все параметры, неважно какие...
0
эволюционирую потихоньку
468 / 466 / 91
Регистрация: 30.06.2009
Сообщений: 1,401
11.12.2009, 21:35 4
н-да, это ж кто такое задаёт?

первое и последнее что приходит на ум, это держать в файле два числа - количетсво оборотов первого и второго колеса.
пусть 4 и 5.
путь считаем так: 1. берём меньшее число и по формуле L1=2*pi*r*количетсво оборотов, вычисляем первую чатсь пути
2. считаем разность по модулю abs(5-4)=1 и тут думаем что одно колесо стоит, а второе сделало лишний оборот (собсвенно это условно) в этом случае центр робота сместиться на L2=2*pi*r*разность количетсво оборотов/2, r-радиус колеса робота
3. L=L1+L2

хотя чёт шибко просто получается, требуется уточнение, не понятно в какую сторону копать
0
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
11.12.2009, 21:36 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
xwheelcount=0;
ywheelcount=0;
int number=2;// количество колес.xwheelcount=0;
ywheelcount=0;
int number=2;// количество колес.
if(number==1)// допустим правое
xwheelcount++;
if(number==3)// допустим левое.
ywheelcount++
if(number==2)
{
xwheelcount++;
ywheelcount++;
}
if(number==1)// допустим правое
xwheelcount++;
if(number==3)// допустим левое.
ywheelcount++
if(number==2)
{
xwheelcount++;
ywheelcount++;
}
P.s и задайте до какого значения надо увел.то и будет длинаа пути
0
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
11.12.2009, 22:24  [ТС] 6
TanT
преподаватель в институте задает...(((((

Sekt
спасибо, хмм, это Вы мне написали как задать параметры?
0
159 / 156 / 47
Регистрация: 29.04.2009
Сообщений: 636
11.12.2009, 23:09 7
Да,вам.
0
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
11.12.2009, 23:37  [ТС] 8
Sekt
хехе, вопрос был с ударением на слово "параметры", а то, что написано мне, я не сомневалась )
0
133 / 132 / 29
Регистрация: 04.01.2009
Сообщений: 415
11.12.2009, 23:49 9
Есть другая идея:
Пусть в файл записываються данные о количестве совершенных оборотов колес каждую секунду...
Тогда считывая данные можно вычислить и время и пройденный путь*!!!


*Пройденный путь предлагаю вычислить следующим образом:
1.Если оба значения оборотов колес за данную секунду больше или меньше нуля, тогда можно считать, что робот движеться вперед или назад (при этом количество оборотов может быть полным или частичным, то есть вещественное** число, в зависимости от скорости робота) и этот путь рассчитать как среднюю линию равнобедренной трапеции.
2. Если хоть одно из значений равнозначное от другого либо равно нулю, то можно считать, что робот совершает поворот. При этом пройденный путь будет равен 0, так как он крутиться на месте.

**Если использовать только целые обороты колес, то вычисления будут более понятными
Хотя значение пройденного пути можно считать по разному...
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
12.12.2009, 06:29 10
Цитата Сообщение от Zhenechka Посмотреть сообщение
Напишите программу, которая будет вычислять пройденный некоторым условным роботом путь и затраченное время на основании записанных в файл данных о количестве оборотов каждого из двух колес робота.
На основании только этих данных однозначного расчета не сделаешь. Например: диаметр каждого колеса 1 м. Допустим полный оборот одного колеса совершается за 1 сек. В файле допустим записано что каждое колесо совершило один оборот. Тогда ответ такой:
Путь пройденный роботом: от 0 м до 1 м включительно.
Затраченное время: от 1 сек до 2 сек включительно.
0
133 / 132 / 29
Регистрация: 04.01.2009
Сообщений: 415
12.12.2009, 12:10 11
Цитата Сообщение от valeriikozlov Посмотреть сообщение
На основании только этих данных однозначного расчета не сделаешь. Например: диаметр каждого колеса 1 м. Допустим полный оборот одного колеса совершается за 1 сек. В файле допустим записано что каждое колесо совершило один оборот. Тогда ответ такой:
Путь пройденный роботом: от 0 м до 1 м включительно.
Затраченное время: от 1 сек до 2 сек включительно.
Я так понимаю, что в файле записано не только 2 числа, а целый набор данных об оборотах колес робота, за определенное пройденное время.
Допустим робот ходит 8 секунд, тогда в файле будут записи следующего вида (первое число - обороты левого колеса, второе - правого):
Код
1 1 1 0 -1 -1 1 0 1 1 1 0 -1 1 1 1
В таком случае маршрут робота будет выглядеть так:
Пройденный роботом путь

Примечание: Стрелка указывает не направление движения, а лицевую часть робота

Следовательно, пройденный реальный путь в таком случае составляет 4м (1,3,5 и 8 шаги)
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
12.12.2009, 12:30 12
manfeese, Что именно записано в файле, это можно гадать сколько угодно. Пока что автор вопроса написал:
Цитата Сообщение от Zhenechka Посмотреть сообщение
Напишите программу, которая будет вычислять пройденный некоторым условным роботом путь и затраченное время на основании записанных в файл данных о количестве оборотов каждого из двух колес робота.
Т.е. вычислять путь и время, а в файле даны количества оборотов колес.
Этих данных мало, я об этом писал. Скорее всего автор сам не доконца понял условие задачи и что-то недописал. Вполне возможно, что условие выглядит именно так как Вы его и представляете, но может быть и нет.
0
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
13.12.2009, 19:33  [ТС] 13
valeriikozlov
да вот и я думаю, что как-то неоднозначно дано... хотя вторым заданием идет создание функции, случайным образом задающей параметры этого робота.

manfeese
хмм, интересно тоже.. хотя с трапецией уже как-то сложновато получается.. хотя фиг его знает(
0
133 / 132 / 29
Регистрация: 04.01.2009
Сообщений: 415
13.12.2009, 20:56 14
Цитата Сообщение от Zhenechka Посмотреть сообщение
хотя с трапецией уже как-то сложновато получается
Это лишь теория, фактически получается, что надо найти среднее арифметическое пройденного пути левого и правого колеса, при положительных либо отрицательных значениях обеих...

Добавлено через 1 минуту
Так же вычисляется и средняя линия трапеции...
0
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
21.12.2009, 14:46  [ТС] 15
valeriikozlov
ну, я думаю пользователь в файле может задать все необходимое, что только требуется...
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
21.12.2009, 15:07 16
Цитата Сообщение от Zhenechka Посмотреть сообщение
ну, я думаю пользователь в файле может задать все необходимое, что только требуется...
Тогда можно воспользоваться вариантом manfeese. И если действительно нужно только:
Цитата Сообщение от Zhenechka Посмотреть сообщение
которая будет вычислять пройденный некоторым условным роботом путь и затраченное время
то решение данной задачи сводится к следующему:
1. затраченное время вычисляется так: считываем по парам числа из файла. если в паре хоть одно число не равно 0, то к счетчику прибавляем 1. В итоге счетчик покажет общее время когда хоть одно колесо крутилось. Если нужно время которое было затрачено именно на прохождение пути (т.е. повороты на месте не учитываем), то учитываем только пары,где оба числа равны или 1,или -1.
2. пройденный путь будем вычислять так: счетчиком подсчитываем кол-во пар чисел из файла, в которых оба числа равны или 1, или -1. Затем зная диаметр колеса, скорость его движения вычисляем пройденный путь.
0
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
21.12.2009, 17:12  [ТС] 17
ну, допустим, разберемся с временем и вычислением пути. А как с файлом работать, в котором вся информация хранится? Вот пишем в проге адрес файла и программа считывает с него данные. А все объявленные в файле переменные и константы и чего атм еще задается, не суть - в программе их объявлять как-нибудь надо вообще? Как она работает с ними?
0
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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
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
Эксперт С++
4727 / 2548 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
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
23.12.2009, 06:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.12.2009, 06:16
Помогаю со студенческими работами здесь

Разработать архитектуру программы управления роботом
Робот принимает команды типа &quot;go north 1000&quot;, &quot;turn left&quot;, &quot;beep 5&quot;, &quot;analyze oxygen&quot;,...

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru