zadanie-tablice dynamiczne

0

Cześć, próbuje rozgryżć pewne zadanie mianowicie:
Program pobiera liczby z pliku "plik.txt" do tablicy. Uzytkownik podaje ile liczb ma byc pobrane
Program tworzy tablice o odpowiednim rozmiarze i wypełnia ją liczbami (uzycie tablicy statycznej jest błędem)
Pobierane są liczby z początku pliku i wpisywane do tablicy w kolejnosci pobierania
Program wyswietla liczby z wypełnionej tablicy (po kolei)
Program jest zabezpieczony przed sytuacją gdy w pliku jest za mało liczb(wtedy informuje o problemie i konczy działanie)
Nastepnie program buduje drugą tablicę o rozmiarze o dwa większą , wpisuje do niej kwadraty z pierwszej a na dwie ostatnie pozycje wstawia liczby kontrolne (ilosc parzystych liczb i ilosc nieparzystych liczb w pierwotnej tablicy)

Zupełnie nie wiem jak sie za to zabrać.Mam nadzieje, że ktoś mądry będzie mi w stanie pomóc :)

1

std::ifstream do wczytania danych.
std::vector do ich przetrzymywania. No i w sumie tyle. Zadanie na kilka linijek kodu :​)
Jak chcesz "zabłysnąć" to użyj std::transform do uzupełnienia drugiej tablicy.

0

A moglbys mi wytlumaczyc na szybko jak uzyc tego vector i transform? Nigdy tego nie uzywałem :D

0

Tam na dole masz przykłady :​)

ifstream ⟶ wczytaj pierwszą wartość, utwórz vector o zadanej wielkości.
transform ⟶ z pierwszego do drugiego wektora przenieś dane używając std::pow albo mnożenia do uzyskania wartości kwadratu liczb.

0
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>
#include <cstdlib>

bool IsSuccessfulLoad(std::vector<int>& src, std::ifstream& input)
{
	int tmp;
	std::size_t i{};
	while (input >> tmp && i < src.size()) {
		src[i++] = tmp;
	}

	return (i == src.size()) ? true : false;
}

void Print(std::vector<int>& src)
{
	for (auto const& el : src) {
		std::cout << el << ' ';
	}
	std::cout << '\n';
}

void SquareMyNums(std::vector<int>& src, std::vector<int>& dest)
{
	std::transform(
		src.cbegin(), src.cend(),
		dest.begin(),
		[](auto& element) {return element * element; });
}

auto CountEvenNums(std::vector<int>& src)
{
	return std::count_if(
		src.cbegin(), src.cend(),
		[](auto& element) { return (element % 2) ? true : false; });
}

auto CountNegativeNums(std::vector<int>& src)
{
	return std::count_if(
		src.cbegin(), src.cend(),
		[](auto& element) { return (element % 2) ? false : true; });
}

int main()
{
	std::ifstream fin("plik.txt");
	std::size_t loadedNumsSize;
	std::cin >> loadedNumsSize;
	std::vector<int> loadedNums(loadedNumsSize);
	if (!IsSuccessfulLoad(loadedNums, fin)) {
		std::cerr << "Tablica jest zbyt duza. Program konczy dzialanie\n";
		return EXIT_FAILURE;
	}
	Print(loadedNums);

	std::size_t addedSize{ 2 };
	std::vector<int> squaredNumsAndOtherCalc(loadedNums.size() + addedSize);
	SquareMyNums(loadedNums, squaredNumsAndOtherCalc);
	std::size_t currentPos = squaredNumsAndOtherCalc.size() - addedSize;
	squaredNumsAndOtherCalc[currentPos++] =
		static_cast<int>(CountEvenNums(loadedNums));
	squaredNumsAndOtherCalc[currentPos] =
		static_cast<int>(CountNegativeNums(loadedNums));
	Print(squaredNumsAndOtherCalc);
	return EXIT_SUCCESS;
}
4

Pomijając już złożoność obliczeniową, złożoność tekstowa rozwiązania @carlosmay powala :​o

Ja bym to zrobił tak:

vector<int> nums;
copy(istream_iterator<int>(file), istream_iterator<int>(), back_inserter(nums));

vector<int> results(nums.size() + 2);
transform(nums.cbegin(), nums.cend(), results.begin(), [&](int num) {
	results[results.size() - 2 + num % 2]++;
	return pow(num, 2);
});

http://melpon.org/wandbox/permlink/ntBccXsudXrVr5yG

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