Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pytanie o możliwość ominięcia tablicy.

Ostatnio zmodyfikowano 2013-05-17 19:18
Autor Wiadomość
Arturrostrzalk
Temat założony przez niniejszego użytkownika
Pytanie o możliwość ominięcia tablicy.
» 2013-05-15 20:28:30
Mam pewne zadanie, i wiem, że można to rozwiązać za pomocą tablic. Chodzę na pewne warsztaty dla początkujących, gdzie dostajemy zadania do robienia i nie mieliśmy tablic, więc na pewno da się rozwiązać to zadanie bez nich.

Oto zadanie:

Zadanie
Jaś na urodziny dostał nową grę. Wspaniała, dynamiczna strzelanka. Jednak mama chłopca była sprytna –
wiedząc, że chłopiec zmarnuje na nią mnóstwo czasu, postanowiła jednocześnie zadbać o jego zdolności
matematyczne. Na początku każdej tury pojawia się kilka ułamków, które Jasio musi porównać. Jest to dość irytująca
sprawa, ponieważ po każdej złej odpowiedzi gra blokuje się na 15 minut. Potrzebna jest mu metoda, by szybko i
bezbłędnie rozwiązać problem – tu właśnie zaczyna się Twoje zadanie.

Wejście
Pierwszy wiersz danych zawiera liczbę całkowitą N z zakresu 1 do 1000 oznaczającą ilość zestawów danych.
Każdy z kolejnych N wierszy zawiera cztery liczby naturalne A, B, C, D z zakresu od 1 do 30000, oddzielone
pojedynczymi odstępami.

Wyjście
Program dla każdej czwórki porównuje między sobą ułamki A/B oraz C/D. Jeśli pierwszy ułamek jest większy,
wtedy program powinien wypisać znak >. Jeśli drugi ułamek jest większy, program powinien wypisać znak <. Jeśli
ułamki są równe, program powinien wypisać znak =.

Przykład

Dla danych wejściowych:
3
1 2 3 6
4 5 6 7
1 2 1 3

poprawnym wynikiem jest:
=
<
>



Chodzi mi o to, że potrafię to zrobić ale nie tak jak trzeba.

C/C++
#include <iostream>
using namespace std;
int main()

{
    int n, a, b, c, d, A, B, C, D;
   
    cin >> n;
    for( int i = 1; i <= n; i++ )
    {
        cin >> a >> b >> c >> d;
       
        A = a * d;
        B = b * d;
        C = c * b;
        D = d * b;
       
        if( A > C ) cout << ">\n";
        else if( A < C ) cout << "<\n";
        else if( A == C ) cout << "=\n";
       
    }
   
    cin.ignore( 2 );
    return 0;
}

Chodzi o to, że program wypisuje wynik po jednym obliczeniu, potem każe wczytać następne dane itd. Jak zrobić, żeby najpierw wczytał wszystko, a dopiero potem wypisał wyniki?
P-83042
Admixior
» 2013-05-15 21:48:33
Jeśli chodzi o logikę to nie potrzebnie liczysz B i D.
Jeśli chodzi o rozwiązanie to takie jest jak najbardziej poprawne. Jeżeli maszyna sprawdza wyniki to takie coś bez problemu przejdzie. Strumień cin i cout korzystają z jednej konsoli i wydają się być jakoś połączone. W praktyce są to dwie zupełne nie zależne od siebie rzeczy. Np. cout możesz sobie dać zapis do pliku abc.txt i wczytywać znaki z ekranu. Tak samo możesz posłużyć się strumieniem cin(pobierać dane z pliku) i nie będzie najmniejszego problemu. A cin nie będzie nic pisało do cout (tak to ujmie najprościej).

PS> Bez tablic ( i nic tablico podobnego ) nie da się takiego czegoś zrobić.

PS2> w przyszłości (jeśli chodzi o algorytmy i szybkość programu) zauważysz że takie rozwiązanie jest dużo lepsze niż najpierw pakowanie ddo tablicy później mielenie a na końcu wypisywanie. Samo "pakowanie" i iteracja(chodzenie po kolei) po elementach chwile będzie trwała.
P-83044
usmiech
» 2013-05-15 23:22:15
Jasiowi potrzebny jest program, ktory po wpisaniu 4 kolejnych liczb w przedziale od 1 do 30000 da mu wlasciwy znak, wiec po co tablice ? Hahaha ;)
P-83048
usmiech
» 2013-05-16 12:32:11
Skup się na dokładności obliczeń, bo Jas nie pogra ;)
P-83057
pekfos
» 2013-05-16 14:35:30
Jeżeli maszyna sprawdza wyniki to takie coś bez problemu przejdzie.
A z człowiekiem nie przejdzie? Możesz to wyjaśnić, bo albo nie rozumiem, albo piszesz bzdury.

PS> Bez tablic ( i nic tablico podobnego ) nie da się takiego czegoś zrobić.
No nie żartuj..
P-83058
polkom21
» 2013-05-16 15:36:04
Kolego, ze tak powiem popieprzylo ci sie chyba cos. Czegos takiego jak zapis ulamka przez mnozenie. Zawsze w szkole mnie uczyli ze ulamek to dzielenie a nie mnozenie. W zadaniu masz wyraznie napisane, ze masz porownac stosunek a do b i c do d a ty mnozysz wszystko bez zadnego sensu
P-83063
Monika90
» 2013-05-16 16:01:07
Skup się na dokładności obliczeń, bo Jas nie pogra ;)
Z dokładnością obliczeń jest wszystko w porządku. Zero miejsc po przecinku wystarczy. Z zakresem też bo 30000 * 30000 = 900000000 co mieści się w 32 bitowym int.

/edit:
Ponieważ int może być 16-bitowe, to jeżeli chcesz mieć w pełni przenośny program, to musisz użyć long. Standard gwarantuje, że long ma co najmniej 32 bity.


Zawsze w szkole mnie uczyli ze ulamek to dzielenie a nie mnozenie.
A przerabiałeś już sprowadzanie do wspólnego mianownika?
P-83067
usmiech
» 2013-05-16 17:21:11
Ciekawe, int i dzielenie.. 1/2 to jednak troche i naczej niz np 12121/ 25125... ale moze sie myle, a tak nawiasem mowiac co jest wieksze  12121/25125 czy 12130/25144 ?, a moze sa rowne ? Pozdrawiam :)

I tak dla przykladu :

C/C++
#include "stdafx.h"
#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;
void znak( double a, double b, double c, double d );

int main()
{
    double a = 0;
    double b = 0;
    double c = 0;
    double d = 0;
   
    cout << "Wprowadz 4 liczby naturalne w przedziale od 1 do 30 000 /przedzielone spacja/: \n";
    cin >> a >> b >> c >> d;
    cout << fixed << showpoint << setprecision( 12 );
   
    cout << a / b << " " << c / d << endl;
    znak( a, b, c, d );
   
    system( "pause" );
    return 0;
}

void znak( double a, double b, double c, double d )
{
    if( static_cast < double >( a / b ) == static_cast < double >( c / d ) )
         cout << " = \n";
    else if( static_cast < double >( a / b ) > static_cast < double >( c / d ) )
         cout << " > \n";
    else
         cout << " < \n";
   
}
// casting malo potrzebny w tym przypadku ;)
P-83095
« 1 » 2 3
  Strona 1 z 3 Następna strona