Loading...
Daniel111 avatar Daniel111 11 Точки

Въпрос относно задача Modulated Sum

Здрваейте имам два въпроса относно задачата . Колко масива трябва направя или масивите се определят от входа на потребителя ? и как да събъра нулевия елемент от масив 1 с нулевия елемент от масив 2 и да го разделя с модолно деление ?

Благодаря предварително.

Тагове:
0
C++ Fundamentals
mitakvd avatar mitakvd 7 Точки

Тези два въпроса ме тормозиха и мен повече от 2 дни и то защото не знаех как да вкарам така данните от конзолата, че после да ги взема по начина, за който и ти говориш. Накрая го направих с вектор във вектор и с един for цикъл ги извадих по нужния начин и пресметнах. Дано ти помогнах. Успех! 

0
Daniel111 avatar Daniel111 11 Точки

Да с вектор става по лесно , но в документа пишеше с  масиви а пък и няма да е лошо  да го знаем и с масиви как става не се знае кога ще ти потрябва .

0
dmartinov avatar dmartinov 37 Точки

Жокер - направи си двумерен масив (матрица) с размери x и y, които ще прочетеш от входа и съответно спрямо тях, ще пълниш масива. Нужните елементи ще си ги четеш с for цикли. Момента който трябва да съобразиш в тази задача е да внимаваш при четене на елементите, къде точно в масива се намираш или иначе казано - на кой ред си и от съответния ред кой индекс взимаш. 

Ето това четиво ще ти подскаже как да го направиш (виж Multidimensional Arrays)

http://people.scs.carleton.ca/~dehne/projects/cpp-doc/tutorial/tut3-1.html

0
NinessonC avatar NinessonC 4 Точки

А как да направя 2D array с user input за размерите ? В линка, който си споделил го правят с предварително зададени стойности с define

0
dmartinov avatar dmartinov 37 Точки

Входа от конзолата не може да ти задава директно размера на масива било то двумерен или едномерен или колкото си щеш мерен :) Това го обясняваха в лекциите бая пъти. В случая в задачата ти е дадено, че ще получаваш, цитирам:

The first line of the input contains two integers – N and M.

Each of the following N lines contains M integer numbers – the elements of the input arrays.

И след това се казва (отново цитирам):

Restrictions

0 < N < 100;

0 < M < 100;

Та, какво правим в случая - щом имаме граници които са ни зададени, веднага си създаваме масив с тези граници (в случая 100).  Следващата ни стъпка е да си създадем 2 променливи, които ще представляват нашите редици и колони в нашия двумерен масив. Те ще се четат от конзолата. И накрая пълним масива, четейки от конзолата, като въртим for циклите около тези 2 променливи. Изразено в код това изглежда така:

int array[100][100] = {0};

int height = 0;
int width = 0;

std::cin >> height >> width;

    for (int i = 0; i < height; ++i) {
        for (int g = 0; g < width; ++g) {
            std::cin >> array[i][g];
        }
    }

0
NinessonC avatar NinessonC 4 Точки

Ахаа, ясно благодаря ти. Това ми реши проблема с user input size-а, но все още не мога да обходя масива правилно. Доколкото разбирам от твоето предложение за решение на задачата, в матрица например с 3 реда и 4 колони ние трябва да съберем при първата итерация всички първи елементи от всеки ред, тоест се променя само реда, но не и колоната. на втората итерация колоната се мести с +1, тоест отново не я променяме а добавяме съответно +1 и +2 на редовете, за да им достъпим само вторите елементи. 

Ето виж какво съм написал, абсолютно не работи, но не знам защо. Благодаря ти за отделеното внимание :)

 

for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			result[i] = ((arr[i][j] + arr[i + 1][j] + arr[i + 2][j]) % 10);
			
		}
		cout << result[i] << ' ';
	}

 

0
dmartinov avatar dmartinov 37 Точки

Защо въртиш циклите си до достигане на 3 и съответно 4? Върти ги около стойностите на променливите, които ти подават от конзолата. В противен случай ти ще завъртиш първия цикъл 3 пъти, но ако от конзолата ти подадат 10 - какво става....пълно мазало :)

Иначе правилно си разбрал - в задачата се иска да събереш всички първи символи от всички редове и да направиш процентно деление, на число отново подадено от конзолата. После същото нещо с вторите символи, третите и т.н. докато не обходиш целия масив. 

0
30/09/2019 17:54:26
NinessonC avatar NinessonC 4 Точки

ясно разбрах, а иначе кода, който пуснах до 3 и 4 беше само тестов. Предварително зададох двурмерния масив с 3 реда и 4 колони и затова въртях циклите до там. Беше преди да ми отговориш за user input-a. Сега ще преместя изчисленията направо в циклите, с които пълня масива. Отново благодаря :)

0
dmartinov avatar dmartinov 37 Точки

Интересно ще ми е да видя, как си го направил накрая. Ако се получи, сподели твоя вариант и аз ще споделя моя, за да видим различни подходи към задачата :) Ако пък не се получи....пиши пак и ще помагам с каквото мога. Нали знаеш - учим се докато сме живи и сме живи, за да се учим ;)

0
NinessonC avatar NinessonC 4 Точки
#include <iostream>
#include <vector>
using namespace std;

int main() {
	int arr[100][100] = { 0 };
	int n = 0;
	int m = 0;
	int sum = 0;
	int mod = 0;

	cin >> n;
	cin >> m;
	

	int result[100] = { 0 };

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> arr[i][j];
		}
	}

	cin >> mod;

	for (int i = 0; i < m; ++i)
	{
		for (int j = 0; j < n; ++j)
		{
			sum = sum + arr[j][i];
		}
		result[i] = sum % mod;
		sum = 0;
	}

	for (int i = 0; i < m; i++)
	{
		cout << result[i] << ' ';
	}

	return 0;
}

Успях да я направя ! Твоят начин подобен ли е ?

0
dmartinov avatar dmartinov 37 Точки

Общо взето да :) Ето моето творение:

#include <iostream>
#include <array>

void arrayPopulation(int height, int width, int mod) {

    int sumary[100] = {0};

    int array[100][100] = {0};

    for (int i = 0; i < height; ++i) {
        for (int g = 0; g < width; ++g) {
            std::cin >> array[i][g];
        }
    }
    std::cin >> mod;

    int sum = 0;
    int g = 0;
    int checkSum = width;

    while (checkSum > 0) {
        for(int i = 0; i < height; ++i) {
            sum += array[i][g];
        }
        sumary[g] = sum;
        checkSum--;
        g++;
        sum = 0;
    }

    for (int e = 0; e < width; ++e) {
        int result = 0;
        result = sumary[e]%mod;
        std::cout << result << ' ';
    }

}

int main() {

    int height = 0;
    int width = 0;
    int mod = 0;

    std::cin >> height >> width;

    arrayPopulation(height, width, mod);

    return 0;
}

А в твоето решение, аз ли него видях или не ползваш вектор въпреки, че добавяш блиотекта за вектор?

0
30/09/2019 20:03:18
NinessonC avatar NinessonC 4 Точки

Пробвах различни начини и съм я забравил :D

0
kolioi avatar kolioi 641 Точки

Не е нужно да пазите числата от масивите. Достатъчно е да имате един масив (вектор) в който да държите съответните суми. Понеже вече сте пуснали работещи решения, ето ви още едно от мен, макар че срока за предаване на домашното все още не е изтекъл.

#include <iostream>
#include <vector>

int main()
{
	using namespace std;

	int n, m;
	cin >> n >> m;

	vector<int> vSum(m,0);

	for(int i=0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			int num;
			cin >> num;
			vSum[j] += num;
		}

	int mod;
	cin >> mod;

	for (auto n : vSum)
		cout << n % mod << ' ';

	return 0;
}

 

0
NinessonC avatar NinessonC 4 Точки

Доста по-практично, браво

0
dmartinov avatar dmartinov 37 Точки

Да, наистина готино решение, но не разбирам защо хората толкова се притесняват да показват какво са напраивли преди да е изтекъл срока на домашното? Ясно е, че някой който не може да се справи ще има възможност да препише, но това си е за него. Колкото и да преписваш ако не си се постарал да го разбереш накрая пак нищо няма да направиш. Пък и все си мисля, че тук хората влизат с цел да научат нещо и да споделят с учещите се каквото знаят, а не в търсене на готови отговори :)

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.