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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.69
Zhenechka
 Аватар для Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
11.12.2009, 20:04     Пройденный роботом путь #1
Всем привет. Совсем недавно начала изучать язык С++ и попалась такая задача, никак не могу понять, как к ней подойти вообще, возможно, кто-то сможет помочь?

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

C++ Путь
путь к файлу C++
Путь до файла C++
C++ коротчайший путь
Управление мобильным роботом, построенным на базе Pololu. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
11.12.2009, 21:03     Пройденный роботом путь #2
пример файла пожалуйсто
Zhenechka
 Аватар для Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
11.12.2009, 21:07  [ТС]     Пройденный роботом путь #3
В том-то и дело, что мне неизвестно ровным счетом ничего, я не могу разобраться в этой задаче начиная с ее начала и заканчивая, естественно, концом(((
Самому придумать видимо надо все параметры, неважно какие...
TanT
эволюционирую потихоньку
 Аватар для TanT
464 / 462 / 43
Регистрация: 30.06.2009
Сообщений: 1,399
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

хотя чёт шибко просто получается, требуется уточнение, не понятно в какую сторону копать
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
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 и задайте до какого значения надо увел.то и будет длинаа пути
Zhenechka
 Аватар для Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
11.12.2009, 22:24  [ТС]     Пройденный роботом путь #6
TanT
преподаватель в институте задает...(((((

Sekt
спасибо, хмм, это Вы мне написали как задать параметры?
Sekt
 Аватар для Sekt
156 / 155 / 10
Регистрация: 29.04.2009
Сообщений: 637
11.12.2009, 23:09     Пройденный роботом путь #7
Да,вам.
Zhenechka
 Аватар для Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
11.12.2009, 23:37  [ТС]     Пройденный роботом путь #8
Sekt
хехе, вопрос был с ударением на слово "параметры", а то, что написано мне, я не сомневалась )
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 04.01.2009
Сообщений: 415
11.12.2009, 23:49     Пройденный роботом путь #9
Есть другая идея:
Пусть в файл записываються данные о количестве совершенных оборотов колес каждую секунду...
Тогда считывая данные можно вычислить и время и пройденный путь*!!!


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

**Если использовать только целые обороты колес, то вычисления будут более понятными
Хотя значение пройденного пути можно считать по разному...
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.12.2009, 06:29     Пройденный роботом путь #10
Цитата Сообщение от Zhenechka Посмотреть сообщение
Напишите программу, которая будет вычислять пройденный некоторым условным роботом путь и затраченное время на основании записанных в файл данных о количестве оборотов каждого из двух колес робота.
На основании только этих данных однозначного расчета не сделаешь. Например: диаметр каждого колеса 1 м. Допустим полный оборот одного колеса совершается за 1 сек. В файле допустим записано что каждое колесо совершило один оборот. Тогда ответ такой:
Путь пройденный роботом: от 0 м до 1 м включительно.
Затраченное время: от 1 сек до 2 сек включительно.
manfeese
 Аватар для manfeese
128 / 127 / 16
Регистрация: 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 шаги)
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
12.12.2009, 12:30     Пройденный роботом путь #12
manfeese, Что именно записано в файле, это можно гадать сколько угодно. Пока что автор вопроса написал:
Цитата Сообщение от Zhenechka Посмотреть сообщение
Напишите программу, которая будет вычислять пройденный некоторым условным роботом путь и затраченное время на основании записанных в файл данных о количестве оборотов каждого из двух колес робота.
Т.е. вычислять путь и время, а в файле даны количества оборотов колес.
Этих данных мало, я об этом писал. Скорее всего автор сам не доконца понял условие задачи и что-то недописал. Вполне возможно, что условие выглядит именно так как Вы его и представляете, но может быть и нет.
Zhenechka
 Аватар для Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
13.12.2009, 19:33  [ТС]     Пройденный роботом путь #13
valeriikozlov
да вот и я думаю, что как-то неоднозначно дано... хотя вторым заданием идет создание функции, случайным образом задающей параметры этого робота.

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

Добавлено через 1 минуту
Так же вычисляется и средняя линия трапеции...
Zhenechka
 Аватар для Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
21.12.2009, 14:46  [ТС]     Пройденный роботом путь #15
valeriikozlov
ну, я думаю пользователь в файле может задать все необходимое, что только требуется...
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 321
Регистрация: 18.08.2009
Сообщений: 4,550
21.12.2009, 15:07     Пройденный роботом путь #16
Цитата Сообщение от Zhenechka Посмотреть сообщение
ну, я думаю пользователь в файле может задать все необходимое, что только требуется...
Тогда можно воспользоваться вариантом manfeese. И если действительно нужно только:
Цитата Сообщение от Zhenechka Посмотреть сообщение
которая будет вычислять пройденный некоторым условным роботом путь и затраченное время
то решение данной задачи сводится к следующему:
1. затраченное время вычисляется так: считываем по парам числа из файла. если в паре хоть одно число не равно 0, то к счетчику прибавляем 1. В итоге счетчик покажет общее время когда хоть одно колесо крутилось. Если нужно время которое было затрачено именно на прохождение пути (т.е. повороты на месте не учитываем), то учитываем только пары,где оба числа равны или 1,или -1.
2. пройденный путь будем вычислять так: счетчиком подсчитываем кол-во пар чисел из файла, в которых оба числа равны или 1, или -1. Затем зная диаметр колеса, скорость его движения вычисляем пройденный путь.
Zhenechka
 Аватар для Zhenechka
0 / 0 / 0
Регистрация: 11.12.2009
Сообщений: 9
21.12.2009, 17:12  [ТС]     Пройденный роботом путь #17
ну, допустим, разберемся с временем и вычислением пути. А как с файлом работать, в котором вся информация хранится? Вот пишем в проге адрес файла и программа считывает с него данные. А все объявленные в файле переменные и константы и чего атм еще задается, не суть - в программе их объявлять как-нибудь надо вообще? Как она работает с ними?
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 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;
а дальше все вычисления, используя данные из файла.
Zhenechka
 Аватар для 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2009, 06:16     Пройденный роботом путь
Еще ссылки по теме:

путь фишки C++
Путь к файлу C++
Путь символа C++

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

Или воспользуйтесь поиском по форуму:
valeriikozlov
Эксперт C++
 Аватар для valeriikozlov
4660 / 2486 / 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 и которые показывают, состояние колес за дискретный промежуток времени.
Yandex
Объявления
23.12.2009, 06:16     Пройденный роботом путь
Ответ Создать тему
Опции темы

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