Loading...
Woofles avatar Woofles 7 Точки

Programing fundamentals - 18 * Different Integers Size

Здравейте!

Споделям си решението на задачата с молба за критика (позитивна/негативна) от страна на по-опитните :)

http://pastebin.com/YHLchwkz
Целта ми беше главно да избегна използването на константи (което виждам масово).
Възможно ли е да заместя всичките dummy_* с една променлива но някакъв друг вид при такива проверки?

Благодаря!

0
Programming Fundamentals 26/09/2016 20:16:30
puffed avatar puffed 289 Точки

Здравей!

Не знам какви са константите, за които говориш, обясни ми. Ето моето решение  http://pastebin.com/wYg33Tk1.  Аз съм го решила пак с променливи като теб, но ги декларирам само в блоковете, в които ми трябват, т.е. те имат много малък scope, докато при теб имат scope = целия main. Ръководех се от подсказката в условието да използваме try catch конструкцията, но понеже не съм много наясно как работи, видях, че ако просто оставя catch блоковете празни, програмат продължава напред. Освен това съм ползвала bool променлива, с която да принтирам изхода накрая. А с помощта на асистентката на упражненията днес разбрах как да събера в един стринг изхода от всеки try/catch. Иначе ми се струва, че и твоето решение е добро, но нека някой по-опитен да се изкаже.

 

0
26/09/2016 20:36:30
Woofles avatar Woofles 7 Точки

Ще отговоря точка по точка това което (мисля че) знам:
1. Константите - може би грешно ги наричам така но са си такива :) Става дума за числата в изрази от рода на "x = a +4", " x == 5" и подобни - 4 и 5 са константи в случая. Тях не можем да променяме в хода на изпълнение на програмата. Вярно че за тях автоматично при компилиране май се заделя минималното нужно място, но така или иначе за една константа с размер INT се заделя толкова колкото и за променлива INT. В много решения видях че хората правят сравнение дали въведеното число е между двете граници на конкретния тип: if(num >= -2,147,483,648 && num <= 2,147,483,647) - едно, че пада голям copy/paste, второ - паметта която споменах задължително се заделя. (не съм на 100% сигурен. Ако беше асемблер тогава съм по-уверен) и трето че VisualStudio може да не открие някои грешки.
2. В конкретният случай мисля че дали ще декларирам променливите в началото или, както ти си направила, непосредствено преди употребата им - няма значение понеже е 100% сигурно че ще се използват.
2.1 Предполагам ако имам повече такива проверки би било добре да ги слога в няколко if/else един в друг - първо проверявам long: ако върне false излизам, ако ли не продължавам с двата int-a, после, евентуално, с двата short и т.н.
3. Това какво имаш в Catch е това което искаш да се случи ако програмта върне exception от типа посочен след Catch - грешно форматиран стринг при Parse примерно, делене на нула и т.н. Само Exception мисля че обединява всички типове exceptions.
4. Отново по тема памет - string-овете са immutable което ще рече че всеки път когато променяш съдържанието на стринг, ти заделяш нов участък от паметта за обновения текст и насочваш string-променливата към нея - с други думи ако имаш входно число с размер long, при всяко добавяне на ред към message, ти ще заделяш все повече и повече памет оставяйки в паметта старото съдържание неизползваемо (тук някой да ме светне как ще действа Garbage collector-а, моля, ако изобщо играе роля в случая :) )

0
puffed avatar puffed 289 Точки

И аз така:

1. Това ли се имало предвид, ясно. Няма смисъл да се изписва самата стойност, може просто да се използва int.MinValue()   и int.MaxValue().

2. Не е така. В презентацията към тези упражнения се казва да се опитваме да декларираме променливата непосредствено преди да я използваме (слайдове 45, 46), даже имаше упражнения за това в Lab-a (refactor-ите). 

2.1 Твърде много вложени условия ще станат и няма смисъл. А и условията не са изключващите се. Може да влиза в няколко случая едновременно. Последователни if-ове, както си го направил, е по-правилно.

4. Да, така е. Чета онлайн, че е по-добре да се използва StringBuilder. Ще го разгледам. Благодаря!

Поздрави!

0
26/09/2016 23:13:35
Woofles avatar Woofles 7 Точки

В отговор на 2 + 2.1 :)
Няма изключващи се но неизпълнението на проверка за тип long прави безсмислени останалите проверки, което при последователни if-ве ... ами няма смисъл вече да проверяваш и променливите излишно се инициализират една след друга. Аз и за това съм ги извел в началото защото така или иначе се случват и си разделям програмата на няколко части: Инициализация на данни, Изчисления и Представяне на резултат. Ако едно число е от дефиниционната област на byte/sbyte/... то със сигурност ще бъде и от тази на long защото първата е подмножество на втората. Като да проверяваш къде живее човек - няма смисъл да почваш къща по къща ако може изобщо да не е от този град :)
Колкото до точка 1: не казвам задължително че директното копиране на стойностите е грешно, но със min/max или tryParse се освобождаваш от нуждата за проверка на стойността че даже може никога да не научиш каква е и пак да си работиш нормално.
4. Според мен за конкретната цел е по-лесно директно да се изписва всеки положителен резултат.

Сега като гледах твоя код ми хрумна и още нещо което аз бих направил (просто лично предпочитание):
ако дам начална стойност на canFit = true после мога да изместя редовете с него от try в catch и да му задавам стойност canFit= canFit & false;  така първо давам по-нагледен смисъл на catch блоковете и второ в повечето случай спестявам на програмата няколко изпълнения на код.

0
27/09/2016 00:27:33
Stefan24 avatar Stefan24 5 Точки

http://pastebin.com/f9FTK5rH Ето го моито решение декларираме си един бигинтиджър и отдолу с едно методче си чекваме в кое влиза. После просто си принтира резултата от метода :)

1
Woofles avatar Woofles 7 Точки

А ако някой реши да крашне програмата нарочно със вход извън диапазона на BigInteger и други с фиксиран размер какво правим? Според мен заради това се иска да се ползва Try/Catch - да сме сигурни че няма да има "непредвидени" резултати.

0
metodiev37 avatar metodiev37 2 Точки

Доста трудно ще излезеш от диапазонана на BigInteger(мисля, че е невъзножно, но имам 0.01% съмнение)... Това: "99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999" работи! Със сигурност са над 200 цифри. 

Ето го и моето решение: http://pastebin.com/2KDnmLdr

 

 

0
20/01/2017 10:18:31
zlatko.rusev avatar zlatko.rusev 1 Точки

Алтернативно решение:

http://pastebin.com/2UyjVjCz

Поздрави!

 

0
Grim666 avatar Grim666 3 Точки

Здравейте.

И аз имам проблем с тази задача. Като я пусна в Джъдж всичките ми контролни тестове минават, но след това само два от останалите и не мога да разбера къде е проблема. Ще оценя всякакви предложения, къде може да е проблема.

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

http://pastebin.com/EjrUA3JF

0
damyan91 avatar damyan91 91 Точки

Мисля, че по условие не трябва да използваш ulong. Може би там е проблемът. При вход от диапазона на ulong трябва да ти върне отговор "N can't fit in any type", а при теб най-вероятно не е така.

0
Grim666 avatar Grim666 3 Точки

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

 

0
22/01/2017 20:14:38
GyokayAli avatar GyokayAli 1 Точки

Ето Ви малко по-различно решение. Дано Ви помогне в по-следващите задачи!

< Линк >

0
22/01/2017 23:03:11
IvanVillani avatar IvanVillani 2 Точки

Наистина се нуждая от помощ!!Дава ми 71/100!! 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DiffIntegers
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = Console.ReadLine();
            try
            {
                long number = int.Parse(input);

                List<string> types = new List<string>();

                if (number >= sbyte.MinValue && number <= sbyte.MaxValue)
                {
                    types.Add("sbyte");
                }
                if (number >= byte.MinValue && number <= byte.MaxValue)
                {
                    types.Add("byte");
                }
                if (number >= short.MinValue && number <= short.MaxValue)
                {
                    types.Add("short");
                }
                if (number >= ushort.MinValue && number <= ushort.MaxValue)
                {
                    types.Add("ushort");
                }
                if (number >= int.MinValue && number <= int.MaxValue)
                {
                    types.Add("int");
                }
                if (number >= uint.MinValue && number <= uint.MaxValue)
                {
                    types.Add("uint");
                }
                if (number >= long.MinValue && number <= long.MaxValue)
                {
                    types.Add("long");
                }
                Console.WriteLine("{0} can fit in: ", number);
                for (int i = 0; i < types.Count; i++)
                {
                    Console.WriteLine("* {0} ", types[i]);
                }

            }
            catch (OverflowException)
            {
                Console.WriteLine("{0} can't fit in any type ", input);

            }


        }
    }
}
 

0
31/01/2018 21:49:37
delian1914 avatar delian1914 99 Точки

Привет. Пробвай да пазиш резултата в BigInteger или long. Можеш и без try catch понеже ако не влезе в никой if ще влезе в else-а.

Моето решение

0
05/02/2018 00:01:31
ghostd0g avatar ghostd0g 27 Точки

Здравей,

Грешката би трябвало да е от тук.

long number = int.Parse(input);

Замени int.Parse със float.Parse. В момента числа по-големи от int не минават.

 

0
vicky.filly avatar vicky.filly 3 Точки

Привет!

Първо, парсването на въвежданата цифра не е окей, както е споменато вече. Тип long го парсваш към int и няма как да събере цялото входно число в променливата.

Не съм на личния лаптоп и не мога да ти дам линк към pastebin, но най-общо, ползвай следното, за улеснение и за да си сигурен, че входа би се събрал във всяка една променлива:

using System;
using System.Numerics;

...

BigInteger input = BigInteger.Parse(Console.ReadLine());

....

0
vasildiavolo avatar vasildiavolo 12 Точки

https://pastebin.com/ghWJXQfp

Ето го и моето, според Judge несполучливо решение - 71 / 100.

Не претендирам за гениалност, та моля проявете снизхождение.

Ще съм благодарен да съдействате да разбера къде бъркам. :)

 

edit: Докато го написах този пост и ми хрумна защо - обръщам string-а в int, а някой от тестовете вероятно дава по-голямо от int число и връща Exception, а не Long, който би го покрил.

Съответно смених преобразуването към int с long n = Convert.ToInt64(input); така че да хвана този тънък момент, който изглежда не беше Exception, и съм 100/100 :)

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