Професионална програма
Loading...
rado84 avatar rado84 1 Точки

Как да задам броят на числата за четене да е равен на едно въведено число?

Решавам задачите от simple loops и реших малка част от тях, но за друга идея си нямам как да задам броят на числата за четене да е равен на едно въведено число (задача 4, например). Тоест, ако напишеш 4, да очаква да получи 4 числа на всеки ред.

Тагове:
-1
Programming Basics
rado84 avatar rado84 1 Точки

А за да не пускам излишна тема, продължавам тук: използвам цикъла, който спомена по-горе за 5-та задача, но нещо не ми се получава. Независимо дали Console.WriteLine е вътре в условието или извън него, се случва едно и също:

            int number = int.Parse(Console.ReadLine());

            for (int i = 0; i < number; i++)
            { int num = int.Parse(Console.ReadLine()); }

            Console.WriteLine(Math.Max(number, num));

 

-1
KrasimirPetkov avatar KrasimirPetkov 331 Точки

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

Тоест, като за начало (извън цикъла), декларираш int max = int.MinValue; - използваме MinValue, тъй като ако въведените числа са отрицателни, а max започва от 0, няма да се получи.

После (в самия цикъл) добавяш int num = int.Parse(Console.ReadLine()); за да си прочетеш числото, а след това пак в цикъла, ти трябва if-проверка: if (max<num) { max = num; } - така ако се въведе по-голямо число от сегашния max, то max става равно на него.

Същото може да се замени с max = Math.Max(max,num);

Накрая, след като приключи цикъла, отпечатваш max на конзолата.

Линк с решение: http://pastebin.com/gn3GSvTm

3
14/06/2016 18:56:58
KrasimirPetkov avatar KrasimirPetkov 331 Точки

DeyanPeychev, винаги се използва MinValue за конкретния тип.

Ако имаш int и зададеш max да е -999999, а аз въведа числата -1000000, -1000001 и -1000002, които се събират в int без никакъв проблем, те няма да са по-големи от началното max и програмата ще върне грешен отговор.

4
14/06/2016 19:12:25
DeyanPeychev avatar DeyanPeychev 20 Точки

Не го знаех това за MinValue, от скоро уча C#, до сега бях на C++, благодаря за инфото! smiley

3
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Ето и на C++

#include <limits>

И това ти дава минималната стойност

int min = std::numeric_limits<int>::min();

 

2
14/06/2016 19:21:38
rado84 avatar rado84 1 Точки

Написах го както каза и Джъдж го разбра, но не и аз. Баси главоболието е тая история с циклите. :( Няма ли нек'ва по-разбираема алтернатива на тоя FOR цикъл?

-1
KrasimirPetkov avatar KrasimirPetkov 331 Точки

Има while и do-while, които няма гаранция, че ще са ти по-приятни.

Моят съвет е да си поиграеш с този for-цикъл. Може да изглежда отвратително в началото, но е фундаментален за програмирането. А след като го научиш, дори ще е приятен за работа.

Ще се опитам да ти го обясня, като използвам един прост пример.

for (int i = 0; i < 10; i++)
{
    // КОД
}

В този вариант, в началото на цикъла ние казваме:

"Искам да използвам променлива от тип int, на име i, с начална стойност 0. Ще изпълняваш кодът между тези скоби { }, докато i < 10 е вярно. След всяко изпълнение, ще увеличаваш i с 1". Когато i стане равно на 10, условието i<10 няма да е изпълнено и програмата ще продължи нататък.

В случая с твоята задача (Max Number), for-цикълът ти позволява да използваш int.Parse(Console.ReadLine()) и if (num>max) { max = num } определен брой пъти (n), които на нас са ни неизвестни и потребителя ги въвежда на конзолата.

В лекциите, книгата на г-н Наков и dotnetperls можеш да видиш много примери за използването му. С малко практика, всичко ще се нареди.

Успех!

1
14/06/2016 19:49:41
Mario_Krastev avatar Mario_Krastev 23 Точки

Ако изпитваш главоболия още на циклите имаш 2 решения на проблема - решаваш повече задачи или се отказваш! Отначало са леко объркващи обаче ще свикнеш, не е нещо сложно. Нещата занапред стават в пъти по-сложни от някакви цикли. Ако не можеш да решаваш такива задачи, няма как да станат нещата, защото всички задачи напред няма как да бъдат реализирани без цикли. Пусни един дебъгер и виж как работи един for loop, виж на всяка итерация какво и как се променя и ще ти се изяснят нещата. Успех!

0
rado84 avatar rado84 1 Точки

Първата част (това с и < 10) я разбирам донякъде (не на 100%), обаче стигне ли се до това в условието да вкарам нещо различно от WriteLine и после това различно нещо да го отпечатам без да дава грешки при изпълнението и VS да не почне да реве, че нещото не съществува - ей това ми докарва главоболието и зациклям в безкраен loop на неразбиране.

@ Mario_Krastev, ако исках да се отказвам, щях да го направя отдавна и нямаше да питам за алтернатива на въпросното нещо.

-1
DeyanPeychev avatar DeyanPeychev 20 Точки

@rado84 , мисля, че този линк ще ти е от полза, аз от тук започнах да уча програмиране и ми беше сравнително лесно с помощта на този сайт, информацията също е просто предоставена, надявам се да нямаш проблеми с разбирането й. Колкото до самото схващане на циклите ( както и на всичко друго свързано с програмирането ) - писането на код е начина. Пишеш, грешиш, четеш, поправяш и се учиш. С четене само не става, иска си и кодене. Успех! :) 



http://www.programming-bg.com/%D1%83%D1%80%D0%BE%D1%86%D0%B8/C++/%D1%86%D0%B8%D0%BA%D0%BB%D0%B8-for-%D0%B8-while

 


За съжаление, тук е описано на C++, но важното е да схванеш логиката на нещата, тя е еднаква навсякъде, синтаксисът се учи лесно. :)  

0
16/06/2016 15:01:26
rado84 avatar rado84 1 Точки

Може да ти се стори странно, но цикъла от 5-та задача го схванах напълно, едва след като си добавих 3 реда с текст на точно определени места в конзолата, защото изписването само и единствено на цифри ме объркваше. Първо добавих текст, състоящ се от произволни букви, за да видя къде какво ще се покаже, после го редактирах и едва тогава разбрах въпросния цикъл какво прави - цифрите, които се въвеждат горе в кода всъщност са броят цикли, които програмата трябва да направи. И ако въведеш 6, извършва 6 цикъла за 6-те числа поотделно. И понеже променливата макс вече е с абсолютна минимална стойност, каквото и число да въведеш, то все ще е по-голямо от минусовата стойност и затова цикълът показва най-голямото число от 6-те въведени.

Само че за да разбера какво се случва, трябваше един колега от курса да ми представи променливата max от този код

int number = int.Parse(Console.ReadLine());
int max = int.MinValue;
for (int i = 0; i < number; i++)
{
  int num = int.Parse(Console.ReadLine());
  max = Math.Max(num, max);
}
Console.WriteLine(max);

в този вид:

int max = -2147483648;

защото променлива с име max и стойност Min.Value е адски объркващо за мен - противоречието между max и min ме объркваше.

-1
DeyanPeychev avatar DeyanPeychev 20 Точки

Декларирай си една променлива, max, да речем и й задай отрицателна стойност,  примерно -999999. След това в цикъла след всяко въвеждане сравнявай input-а с max, ако input>max, max присвоява input. Накрая просто отпечатваш max и магията е готова. :) 

-3