Софтуерно Инженерство
Loading...
+ Нов въпрос
milenmilen avatar milenmilen 0 Точки

JA1-Task-2-Array-Sum

Някой има ли идея как да се реши 2-рата задача от JA без да се използва двумерен масив или емулация на такъв (то доколкото знам и без това в Cpp многомерните се емулират)? Проблема ми е, че има неизвестен брой масиви, които трябва да се създадат, като този брой се взима от конзолата и не виждам как ще дефинирам масиви arr1,... arrN.

Тагове:
0
C++ Fundamentals
georgi.stef.georgiev avatar georgi.stef.georgiev 904 Точки

Здравей,

Принципно най-лесният начин би бил ползване на vector< vector<int> > -  тоест всеки ред го представяш като vector<int> и имаш определен брой такива. Не сме учили изрично многомерни масиви и това донякъде прилича на такъв, макар че на теория не е C++ многомерен масив, просто вектор, в който елементите са други вектори. 

Има и вариант обаче, който изобщо не ползва нищо подобно на многомерен масив. В началото се казва колко "редове" и колко "колони" ще са числата. Което означава, че общо числата ще са "редове" умножено по "колони". Тоест за първия пример ще имаш общо 12 числа (3 * 4). Директно можеш да направиш масив (или вектор) с толкова елементи и да попълниш числата линейно в него. Оттам нататък, за първия пример, ред 0 ти е от 0 индекс до 3 индекс, ред 1 от 4 до 7, ред 2 от 8 до 11 в масива/вектора. Тоест ако искаш да вземеш елемента на ред R и колона C, индексът му е просто R * NumCols + C, където NumCols е броят колони, който ти е въведен (за първия пример NumCols == 4). Оттам нататък можеш да работиш с този едномерен масив все едно е многомерен.

Многомерните масиви по естество са просто едномерни масиви със специално индексиране - това, което описвам отгоре.

Разбира се, пак препоръчвам да ползваш vector< vector<int> > за тази задача, защото е по-удобно, но далеч не е задължително.

Поздрави,

Жоро

0
28/11/2017 14:20:52
milenmilen avatar milenmilen 0 Точки

Идеята ти е емулация на многомерен масив с тези групи от елементи с брой колони във вектор с дължина редове * колони. Благодаря, и аз така си ги представях нещата, но понеже в условието е казано да се съзадат масиви arr1, ..., arrN реших, т.е. динамично създаване на масиви с имена идващи от променливи, че може би аз съм пропуснал нещо някъде из лекцията.

0
28/11/2017 14:59:42
milenmilen avatar milenmilen 0 Точки

И да питам още - в тази задача размера на масива е ясен - M x N и мога директно да си декларирам масив (както и правя в моето решение). Решението може да стане и както предлагаш ти - с вектор. В такива ситуации, когато и са приложими и масиви и вектори (то тези ситуации са винаги, когато са приложими масиви) кое е за предпочитане да се използва?

0
georgi.stef.georgiev avatar georgi.stef.georgiev 904 Точки

Краткият отговор, за нашите цели в този курс - няма смисъл да ползваш масив, по-лесно е с vector.

Дългият отговор е... ами, дълъг :D

Векторът ползва и позволява неща, които може да не ти се налага реално в задачата, която решаваш. Като за начало, векторът винаги проверява дали достъпваш правилен индекс - ако не достъпваш хвърля т.нар. exception, който сигнализира на програмата ти, че нещо не е наред и я прекратява (освен ако не го catch-неш, но това е извън тематиката на този курс) - това означава, че ако много на брой пъти достъпваш индекс във вектор, това е по-бавно от да го правиш с масив, защото масивът я няма тази проверка (за сметка на това трябва да си сигурен, че достъпваш правилен индекс). Също, векторът за да може да добавя елементи ефикасно си пази допълнителна памет (двойно на това, което му трябва, всеки път когато му потрябва нова памет). Тоест - обикновено - вектор с 5 елемента ще заеме място за 8 (вектор с 4 елемента ще си заеме точно пространството), вектор с 9 елемента ще заеме място за 16 и т.н. - това почва да става проблем когато стигнеш примерно до 1025 елемента, в който случай ще ползваш памет за 2048. Има го и момента, че когато подаваш вектор като параметър, му се прави копие (всеки елемент се копира, освен ако не го подадеш по референция), докато масивът винаги си пристига по референция. Отделно, че когато ползваш масив, за някой четящ кода ти е ясно, че намерението ти е да ползваш точно толкова на брой елементи, както и че този масив няма да се return-ва и т.н. - ако ползваш вектор, четящият кода ти трябва да прочете целия код, за да му стане ясно това. Така че кое ще ползваш зависи от ситуацията, от задачата и т.н.

Като цяло в C++ (че и в програмирането като цяло) много често въпроси от порядъка на "кое от двете е по-добре да се ползва" ще имат отговор "зависи какви са ти целите", или "едното е по-добро за тази ситуация, другото е по-добро за тази ситуация" - просто езикът е направен да има много възможности и начини да се постигне едно и също на пръв поглед нещо. Съответно за да вземеш най-доброто решение трябва да познаваш и двата варианта добре и да знаеш кой какво прави добре и какво не - оттам нататък прилагаш тези знания към условията в които се намиреш за да решиш кое да ползваш.

1