INFORMATIKA OPTIMALITÁS FELADAT (C++)?

Figyelt kérdés
Van egy numere. In állomány, mely legtöbb 5000 darab valós számot tartalmaz, mindegyiket külön sorban. Ki kell írni képernyőre az állományból a legnagyobb szám első és utolsó sorszámát, szóközzel elválasztva. A megoldás optimális kell legyen. A megoldásban nem lehet tömböket (sem 1, sem kétdimentziósat) használni, illetve egy végigfutással kéne megoldani...

2016. okt. 22. 09:22
 1/3 anonim ***** válasza:

Sajnos öt egyetemi évem alatt nem találkoztam a numere szóval. Amennyit értek:


Csinálj egy láncolt listát, amiben minden elem tárol egy double/float számot. Egyszer kell végigiterálni az összes számon. Egy változóba elmented a szám első előfordulását és békén hagyod (mondjuk mielőtt elkezdesz iterálni beállítasz -1-et, és egy if ággal ellenőrzöd, hogy nagyobb egyenlő-e nullával (ha 0-tól kezded a sorszámozást). A másiknál mindig, ha elérsz a számhoz felülírod a sorszámmal.

2016. okt. 22. 10:03
Hasznos számodra ez a válasz?
 2/3 anonim ***** válasza:

1 millió adatra: 0.265231s wall, 0.210000s user + 0.000000s system = 0.210000s CPU (79.2%)


Nem kell minden include, csak van ami bennmaradt. Illetve a kódot könnyen meg tudod formázni ha rákeresel: online clang formatter.


#include <iostream>

#include <fstream>

#include <string>

#include <cstdlib>

#include <sstream>

#include <cmath>

#include <algorithm>

#include <numeric>

#include <random>


template<class T>

typename std::enable_if<!std::numeric_limits<T>::is_integer, bool>::type

almost_equal(T x, T y, int ulp)

{

// the machine epsilon has to be scaled to the magnitude of the values used

// and multiplied by the desired precision in ULPs (units in the last place)

return std::abs(x-y) < std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp

// unless the result is subnormal

|| std::abs(x-y) < std::numeric_limits<T>::min();

}


int main()

{

int sorszam = 0;

double legnagyobb_szam = 0;

int elso_sorszam = 0;

int utolso_sorszam = 0;


std::ifstream is{"asd.txt"};

for(std::string s; std::getline(is, s);) {

++sorszam;

const double szam = std::stod(s);

if(sorszam == 1) {

legnagyobb_szam = szam;

elso_sorszam = sorszam;

utolso_sorszam = sorszam;

continue;

}


if(szam > legnagyobb_szam) {

legnagyobb_szam = szam;

elso_sorszam = sorszam;

utolso_sorszam = sorszam;

} else if(almost_equal(szam, legnagyobb_szam, 2)) {

utolso_sorszam = sorszam;

}

}


if(sorszam != 0) {

std::cout << elso_sorszam << ' ' << utolso_sorszam << '\n';

} else {

std::cout << "ures volt a fajl\n";

}

}

2016. okt. 22. 13:54
Hasznos számodra ez a válasz?
 3/3 A kérdező kommentje:

Elsősorban is köszönöm a válaszokat! :-)

Másodsorban, Első Válaszoló, a feladat romániai informatika érettségi tételből van, csak a magyar érettségizőknek leford1tják magyarra. Viszont például a megadott neveken nem változhatnak, mivel lehet, hogy román nyelvű a javítótanár, és a javítókulcs nincs lefordítva. A numere simán annyit jelent, hogy számok... :-)

2016. okt. 22. 22:28

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!