• Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.

Задача со структури во С++

  • Ја почнал/а темата
  • #1

maximilian

Gaining Experience
26 март 2008
1,064
74
Имам едно домашно по С++ и ми излезе еден проблем.

Прво, да ви ја објаснам задачата: Коњ може да пасе трева од 10 различни ливади. Секоја ливада има различна трева. Тревата има калоричност калории/уста, време на задржување на коњот на таа ливада, а ливадите имаат координати по Х и У во километри, а првата ливада (коњушницата) е со координати (0,0). Коњот има карактеристики - секунди за џвакање на една уста, брзина на движење во km/h од една ливада до друга и неопходни калории за ден. За да се нахрани, освен калориите, треба да апнал барем 4 вида трева.

A) Да се воведат карактеристиките
Б) Да се пресмета необходното време за барем едно пасење.

Е сеа, тоа под А) е гола вода, го напраив :D. Финтата е, кога сакам да ми пресмета колку калории примил коњот од една ливада, на сите ливади ми дава резултат 0. :zbunet: . Еве го кодот па ве молам ако можете помогнете, кажете ми кај сум заебал :D

Код:
#include<iostream>
#include<stdlib.h>
#include<cmath>

using namespace std;

struct horse
{
       int sec;
       double speed;
       double calories;
       int time;
};

struct field
{
       double calPerMouth;
       int x;
       int y;
       double time;
       double cals;
};

int main()
{
    horse konj;
    cout << "Input: second per mouth" << endl;
    cin >> konj.sec;
    cout << "Input: speed km/h" << endl;
    cin >> konj.speed;
    cout << "Input: calories per day" << endl;
    cin >> konj.calories;
    
    field a[10];
    a[0].x=0;
    a[0].y=0;
    cout << "Input: calories per mouth for field No:1" << endl;
    cin >> a[0].calPerMouth;
    cout << "time for the horse eating on this field in hours: ";
    cin >> a[0].time;
    a[0].cals=(konj.sec/3600) * a[0].time * a[0].calPerMouth;  
    cout << endl << endl;
    for (int i=1; i<10; i++)     
        {
             cout << "Input: the X, Y coordinate for field No:" << i+1 << " ";
             cin >> a[i].x >> a[i].y;
             cout << "Input: the calories per mouth from the grass from field No:" << i+1 << " ";
             cin >> a[i].calPerMouth;
             cout << "time for the horse eating on this field in hours: ";
             cin >> a[i].time;
             a[i].cals=(konj.sec/3600)*a[i].time*a[i].calPerMouth; 
             cout << endl << endl << endl;
             
        }
    cout << "Seconds per mouth: " << konj.sec << endl;
    cout << "Speed km/h" << konj.speed << endl;
    cout << "Calories per day: " << konj.calories << endl << endl;
    for (int i=0; i<10; i++)
        {
             cout << "Field No: " << i+1;
             cout << "(x,y)=(" << a[i].x << "," << a[i].y << ")" << endl;
             cout << "calories per mouth:"  << a[i].calPerMouth << endl;
             cout << "time for the horse eating on this field in hours:" << a[i].time << endl;
             cout << "Calories inputed on this field: " << a[i].cals << endl << endl;
        }
    double distance[9];
    for (int i=0; i<9; i++)
        for (int j=i+1; j<10; j++)
            distance[i]=sqrt(fabs((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y)));
    for (int i=0; i<9; i++)
        {
             cout << "Distance between " << i+1 << " and " << i+2 << " is " << distance[i] <<"km" << endl;
        }
    cout << endl << endl;
    double time[9];
    for (int i=0; i<9; i++)
        time[i]=distance[i]/konj.speed;
    for (int i=0; i<9; i++)
        cout << "The time that the horse have to go between the field " << i+1 << " and " << i+2 << " is:" << time[i] << endl << "hours";
    
    cout << endl << endl;
    system ("pause");
    return 0;
}
 
  • Ја почнал/а темата
  • #2

maximilian

Gaining Experience
26 март 2008
1,064
74
Аман бе, никој ли не може да ми каже? :D
 

loverboy

Intern
6 февруари 2008
147
11
Еве да ти помогнам школски :)
Малку е чуден текстот на задачата :D
Претпоставувам логиката на задачата ти е во ред, не ја проверив баш, бидејќи и јас сум сред колоквиумска недела :) ама зошто ти дава резултат нула има едноставен одговор.
Разгледај го овој дел
Код:
konj.sec/3600
Колку што видов, konj.sec ти е променлива int па кога int ќе се подели со int секогаш дава int. Па на пример, ако внесиш кој и да било број за konj.sec помал од 3600, секогаш ќе ти даде резултат 0. Тебе тука ти треба да врати децимален број. Тоа ќе се постигнеш или доколку konj.sec го конвертираш во double или 3600 го конвертираш во double
А променлива се конвертира од еден облик во друг со:
Код:
(double)3600
или пак наместо 3600 стави 3600.0 (точка нула после 3600), ова ќе ти го конвертира бројот во double. Се надевам ти помогнав, ако има некој проблем пиши повторно.
Поздрав :)
Со среќа на колоквиумите! :)
 
  • Ја почнал/а темата
  • #4

maximilian

Gaining Experience
26 март 2008
1,064
74
Школски фала, тоа бил проблемот, не приметив таква банална работа :). Ај ако заглавам на уште нешто од задачата, пак ќе прашам. Конкретно овој проблем со 0-та е решен :)

EDIT: Со среќа и тебе со колоквиумите, ја сум сеа на испити, колоквиумите завршија кај мене ;)
 
  • Ја почнал/а темата
  • #5

maximilian

Gaining Experience
26 март 2008
1,064
74
EDIT:Најдов уште една грешка околу формулата:
Код:
 a[i].cals=(konj.sec/3600)*a[i].time*a[i].calPerMouth;
наместо тоа, треба да биде
Код:
 a[i].cals=(3600/konj.sec)*a[i].time*a[i].calPerMouth;
Сум се збркал нешто, зашто не конвертирам од часови во секунди, него од секунди во часови :)
 
  • Ја почнал/а темата
  • #6

maximilian

Gaining Experience
26 март 2008
1,064
74
Проблемот е решен. Игор, фала за сугестијата, ми помогна стварно. Темата слободно може да се затвори.

BTW, aко некој го интересира решението:

Код:
#include<iostream>
#include<stdlib.h>
#include<cmath>

using namespace std;

struct horse
{
       double sec;
       double speed;
       double calories;
};

struct field
{
       double calPerMouth;
       int x;
       int y;
       double time;
       double cals;
       double time2;
};

int main()
{
    //Voveduvanje na strukturata za konjot
    horse konj;
    cout << "Input: second per mouth" << endl;
    cin >> konj.sec;
    cout << "Input: speed km/h" << endl;
    cin >> konj.speed;
    cout << "Input: calories per day" << endl;
    cin >> konj.calories;
    
    //Voveduvanje na strukturata za livadite; inicijalizacija za konjusnicata
    field a[10];
    a[0].x=0;
    a[0].y=0;
    a[0].time2=0;
    cout << "Input: calories per mouth for field No:1 ";
    cin >> a[0].calPerMouth;
    cout << "time for the horse eating on this field in hours: ";
    cin >> a[0].time;
    a[0].cals=(3600/konj.sec) * a[0].time * a[0].calPerMouth;  
    cout << endl << endl;
    for (int i=1; i<10; i++)     
        {
             cout << "Input: the X, Y coordinate for field No:" << i+1 << " ";
             cin >> a[i].x >> a[i].y;
             cout << "Input: the calories per mouth from the grass from field No:" << i+1 << " ";
             cin >> a[i].calPerMouth;
             cout << "time for the horse eating on this field in hours: ";
             cin >> a[i].time;
             a[i].cals=(3600/konj.sec) * a[i].time * a[i].calPerMouth; 
             cout << endl << endl << endl;
             
        }
    cout << "Seconds per mouth: " << konj.sec << endl;
    cout << "Speed km/h" << konj.speed << endl;
    cout << "Calories per day: " << konj.calories << endl << endl;
    
    //Izveduvanje na redicata od tip struktura
    for (int i=0; i<10; i++)
        {
             cout << "Field No: " << i+1;
             cout << "(x,y)=(" << a[i].x << "," << a[i].y << ")" << endl;
             cout << "calories per mouth:"  << a[i].calPerMouth << endl;
             cout << "time for the horse eating on this field in hours:" << a[i].time << endl;
             cout << "Calories inputed on this field: " << a[i].cals << endl << endl;
        }
    
    //Nova redica od tip double vo koja se zapisuvaat rastojanijata pomegu n-1 i n-ta livada
    double distance[9];
    for (int i=0; i<9; i++)
        for (int j=i+1; j<10; j++)
            distance[i]=sqrt(fabs((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y)));
    cout << endl << endl;
    
    //Nova redica time od tip double vo koja se zapisuva vremeto koe treba da go pomine konjot pomegu n-1 i n-ta livada
    double time[9];
    for (int i=0; i<9; i++)
        time[i]=distance[i]/konj.speed;
  
    //Voveduvanje na poleto time2 od strukturata field koe e za vremeto pominato megu 2 sosedni livadi
    for (int i=1; i<10; i++)
        a[i].time2=time[i-1];
    
    //Presmetuvanje za dovolno vreme za edno pasenje
    double s=0;
    double t=0;
    int k;
    
    for (int i=0; i<10; i++)
        {
             s=s+a[i].cals;
             t=t+a[i].time+a[i].time2;
             if (i>=3)
                if (s>=konj.calories)
                      {
                        k=i; 
                        break;
                      }
        }
    cout << endl;
    
    //Izlez
    cout << endl << endl << "The least time for one feading is: " << t << " from " << k+1 << " fileds" ;
    cout << endl << endl;
    system ("pause");
    return 0;
}
 
  • Ја почнал/а темата
  • #8

maximilian

Gaining Experience
26 март 2008
1,064
74
fabs ти е функцијата абсолутна вредност од некој израз, а тоа е во библиотеката cmath, е сеа у Dev C++ кај мене го тера без проблем. Ти сигурно работиш во Visual C++, а таму не знам како стојат работите :)
 

Fiasco

Gaining Experience
2 март 2008
3,036
203
404
www.igorjanevski.com
епа во визуал е исто само без f... значи abs и така е ок.
а сега даде еден друг ерор на sqrt за квадратен корен, но исто се пишува и во визуал :chudenje:
 

Alexandar

Gaining Experience
21 мај 2007
2,514
90
Аргументот на fabs треба да е floating point, така да конвертирај го во float и ќе работи.

distance=sqrt(fabs((float)((a[j].x-a.x)*(a[j].x-a.x)+(a[j].y-a.y)*(a[j].y-a.y))));
 
  • Ја почнал/а темата
  • #12

maximilian

Gaining Experience
26 март 2008
1,064
74
@fiascooo

Фала за пофалбата, а иначе крајниот резултат за времето е во часови, не во минути.
 

Нови мислења

Последни Теми

Статистика

Теми
43,522
Мислења
822,546
Членови
28,051
Најнов член
Marko Janevski
На врв Дно