Kod jest zbyt długi - jak go skrócić?

0

Napisałem program ale niestety jest on zbyt długi czy ktoś ma jakiś pomysł jak go skrócić o to kod :

#include <iostream>
#include <vector>
#include <sstream>
#include<cmath>
#include <cstdio>
using namespace std;

int main()
{vector <float> t;
string l;
    float a;
    stringstream s;
   while(getline(cin,l).good() && !l.empty()){s<<l;s>>a;t.push_back(a);s.clear();}
    for(int i=1;i<t.size()-1;i++)
        t[0]=t[0]*t[t.size()-1]+t[i];
    printf("%.3lf",t[0]);
    return 0;
}
 
2

Dobrze byłoby napisać co ten program miał robić ;)

4

Ale co jest za długiego tutaj? Czas wykonania czy liczba linijek? Bo jeżeli to drugie, to chyba żartujesz - to już jest maksymalnie nieczytelne. Jakości kodu nie mierzy się ilością znaków, a już na pewno nie "im mniej tym lepiej".

0

rozmiar pliku źródłowego

1

Ale po jakiego grzyba ma być mniejszy?!

1

Może chodzi o rozmiar pliku wykonywalnego?
W takim wypadku nie usuwać białych znaków, a dodać odpowiednią flagę kompilatora.

0

Mam jeszcze jedno pytanie czy jest jakiś inny sposób na wprowadzenie nie znanej ilości liczb po spacji do tablicy/wektora

0

Napisałem program ale niestety jest on zbyt długi

To najpierw wyjaśnij jaki jest limit (i skąd się on bierze). Inaczej to głupiego robota.

5

Wersja skrócona (a do tego faktycznie czytelna):

	vector<float> t;
	copy(istream_iterator<float>(cin), istream_iterator<float>(), back_inserter(t));

	float result = accumulate(next(t.begin()), prev(t.end()), t.at(0),
			   [&](float total, float v){
		return total * t.back() + v;
	});
	
	cout << result << endl;

http://melpon.org/wandbox/permlink/0cbZ2NGaXilN1E8T
oryginał: http://melpon.org/wandbox/permlink/dU6qHVG8pBdnMaVV

Przy okazji, Twój kod jest tragicznie nieczytelny, zobacz o ile lepiej jest już po samym przepuszczeniu go przez clang-format (via http://format.krzaq.cc):

#include <iostream>
#include <vector>
#include <sstream>
#include <cmath>
#include <cstdio>
using namespace std;

int main()
{
    vector<float> t;
    string l;
    float a;
    stringstream s;
    while (getline(cin, l).good() && !l.empty())
    {
        s << l;
        s >> a;
        t.push_back(a);
        s.clear();
    }
    for (int i = 1; i < t.size() - 1; i++)
        t[0] = t[0] * t[t.size() - 1] + t[i];
    printf("%.3lf", t[0]);
    return 0;
}
0

Ten kod jest bezsensu, bo na pewno nie działa.

  • dziwnie wczytujesz dane na pewno nie o to chodziło
    - liczysz coś bezsensu (jedynie ostatnia iteracja pętli for ma wpływ na wynik końcowy)

Lepiej zacznij od podania pełnej treści twojego zadania, a następnie napisz sam normalnie napisany kod, który działa poprawnie.
Dopiero po tym bierz się za jego skracanie, pokaż co zrobiłeś, a wtedy pomożemy (bo dopiero wtedy będziemy w stanie pomóc).

0

Masz racje źle zabrałem się za to zadanie i zadałem głupie pytanie o skrócenie programu, ale nie chce podawać treści ponieważ nie liczę na gotowe rozwiązanie.
W moim programie wczytywanie danych kończy się po pustym enterze po doczytaniu zadania okazało się, że liczby podawane są po spacji i wczytywanie kończy enter. Napisałem program który wczytuje te liczby o to kod:

 #include <iostream>
#include <vector>
#include<cmath>


using namespace std;

int main()
{
    vector<float> t;
    float a;
    for(;cin.get()!='\n';)
    {
        cin>>a;
        t.push_back(a);
    }
    for(int i=0;i<t.size();i++)
    {
        cout<<t[i]<<endl;
    }
    return 0;
}

Po wpisaniu liczb 1 2 3 wyświetla tylko 2 i 3 i nie wiem dlaczego tak jest.

0

@Reclab Spacje nie wymuszają wczywytania za pomocą get(), patrz : https://ideone.com/HxnDx8, są spacje, a działa.

1
Reclab napisał(a):

Masz racje źle zabrałem się za to zadanie i zadałem głupie pytanie o skrócenie programu, ale nie chce podawać treści ponieważ nie liczę na gotowe rozwiązanie.
W moim programie wczytywanie danych kończy się po pustym enterze po doczytaniu zadania okazało się, że liczby podawane są po spacji i wczytywanie kończy enter. Napisałem program który wczytuje te liczby o to kod:

 
[...]
    for(;cin.get()!='\n';)
[...]

Po wpisaniu liczb 1 2 3 wyświetla tylko 2 i 3 i nie wiem dlaczego tak jest.

bo jedynka jest pobierana w miejscu, które zostawiłem w cytacie.

0

Dzięki za wskazówkę wystarczyło zrobić to do while.

1

Skoro @Shalom wspomniał to się wypowiem:

#include <iostream>
using namespace std;

double specpow()
  {
   static double base=0,pow=0;
   double val;
   if(!(cin>>val)) return 0;
   while(cin.get()!='\n') {}
   base=val;
   pow=0;
   double ret=specpow()+val*pow;
   pow=pow?pow*base:1;
   return ret;
  }

int main()
  {
   printf("%.3lf",specpow());
   return 0;
  }

Jest nieco dłuższy ale nie używa żadnych wektorów/stringów/kontenerów, faktycznie nic nie używa oprócz prostych kalkulacji - zaś robi teoretycznie to samo.

0

_13th_Dragon nie do końca rozumiem tenprogram... Czemu się nie wykonuje od razu po wpisaniu ciagu tylko trzeba podać jakiś inny znak jeszcze?

1 użytkowników online, w tym zalogowanych: 0, gości: 1