Loading...
antonradev avatar antonradev 43 Точки

Homework 3, Problem 5 - Third Digit is 7? Моля за насока. Дотук нищо

Здравейте!

Може ли някаква насока по този проблем Problem 5 - Third Digit is 7?

Гугъл ме насочи само да обърна числото към стринг, но единствените примери които намерих са IndexOf и търсят буква където и да е в стринга.

Това от дясно наляво броене и проверяване на седмица не мога да го измисля

Тагове:
0
Programming Basics
Jordan avatar Jordan 7 Точки

Здравей,

Делиш числото на 100 със / и после го делиш на 10 със %.

Тоест 7543/100 взема цялата част = 75

после 75%10 взема остатъка = 5

 

7
gangov avatar gangov 22 Точки

Пробвай да делиш и / или да си играеш с модул от числото. Аз така го реших. Не искам да ти развалям кефа от това сам да се справиш..

0
RoYaL avatar RoYaL Trainer 6849 Точки

IndexOf("буквата") == позицията ще върне Boolean (true/false). Аз бих го обърнал. За сега се сещам за ToCharArray() и съответно Reverse. После търсиш дали буквата (числото?) 7 е на 3та позиция.

0
antonradev avatar antonradev 43 Точки

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

Ще опитам коментарите.  За такива "хакове" никога няма да се сетя там. 

1
RoYaL avatar RoYaL Trainer 6849 Точки

И аз не бих се сетил :) Опитвам се да мисля, че после все пак някой ще чете кода ми, ако е в реална среда. Обръщане на array of chars с метод който сам говори за себе си (Reverse) и търсене с IndexOf ми звучи много по-четимо.

1
externo avatar externo 119 Точки

ами става и в твоята посока със стрингове, ако стринга ти е с име примерно - comments ,
то първо режеш последните 2 символа така: comments = comments.Remove(comments.Length - 2);
и после с индекс проверяваш дали последния символ == "7" за да го разбира като стринг, не със 7, защото ще го разпознае като число, не и със '7' защото ще помисли че е символ

 

което е почти същото като на RoYaL 

2
AntoniyaIvanova avatar AntoniyaIvanova 16 Точки

ето част от моето решение, останалото ще е подсказка smile

Console.WriteLine("Enter number");
int a = int.Parse(Console.ReadLine());
int b = (a / 100); // разделяме на 100, защото ни интересува стотицата от  въведеното число дали е 7
int c = (b % 10);

после с if и else задаваш стойност дали е 7 или не.

 

p.s. Можеш да намериш упътвания на част от задачите след всяка тема в учебника. wink

3
BorisSimeonov avatar BorisSimeonov 26 Точки

Моето решение в един ред.       

Console.WriteLine("Third digit is 7: {0}", (int.Parse(Console.ReadLine())/100)%10 == 7);

7
Filkolev avatar Filkolev 4482 Точки

Доста лош код бих казал. Избягвай да правиш нещата на един ред. Логично е тук да си декларираш число, след това и една булева променлива. Не пречи да има и отделна променлива за цифрата. Че става по твоя начин - става, но не е разбираемо.

Целта на курса не е да решаваме задачи с минимален брой редове/символи, а да пишем качествен код, който се разбира лесно и ако е сбъркан някъде да се дебъгва лесно.

За пример мога да ти дам една от изпитните задачи вчера от изпита по C# Basics. Наложи се да проверим дали всичко по условието е наред и затова седнах на място да я решавам. С разписани повече редове и променливи, които да държат различните стойности, успях да стигна до решение за 5-10 минути. Останалите колеги се мъчиха доста с нея, като имах възможност да видя различни подходи докато обикалях и честа грешка беше, че се правеха прекалено много сметки на един ред. Следствието от това беше, че хората трудно си виждаха грешките и не можеха да ги отстранят, макар че като логика нещата не бяха особено сложни. Извод: рано или късно ще усетиш проблемите на този подход; по-добре от рано да свикнеш да не правиш такива неща.

6
BorisSimeonov avatar BorisSimeonov 26 Точки

Благодаря за мотивираната забележка. Напълно съм съгласен с казаното относно трудният за разчитане код при повече операции на ред. Позволих си това натрупване единствено поради това, че в решението на конкретната задача почти няма шанс за възникване на грешка, тъй като сумарният брой на операциите за решаване е изключително малък. При по-дълга задача определено бих използвал отделна променлива за стойността и отделна за върнатата стойност от булевия израз преди визуализация на резултата от логиката.

1
Filkolev avatar Filkolev 4482 Точки

Няма лошо човек да експериментира. Но добрите практики са си добри и за сложни, и за много лесни задачи, така че и при най-елементарните е хубаво да се спазват и да се изгради навик.

На всяка стъпка потенциално може да възникне проблем, така че не подценявай нито една задача. Тук да кажем може да се изпусне една 0 или нещо такова. Ако подадеш неправилен стринг от конзолата, ясно, че ще получиш exception. Но ако си разделил на 10 или 1000, вместо на 100, просто ще получиш грешен резултат. Наистина, тук понеже има малко операции, грешка може да се открие сравнително лесно, но принципът е програмата да се разбива на повече парчета (сметките да са на повече редове ако трябва, парчета код с различна функция да са извадени в методи и т.н.), за да може всяка част да се тества поотделно. Например, може да тестваш правилно ли приемаш входа и държи ли се добре програмата при невалиден вход; да видиш правилно ли смяташ цифрата; да видиш правилно ли се проверява каква е цифрата; да видиш изходът дали е в искания формат. 

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

1
Fujitzo avatar Fujitzo 9 Точки

Лелеее... аз къде отидох, хаха. Направо ме е срам да си призная, че се лутах 2ч и нещо из stackoverflow и MSDN четейки за IEnumerables, ТоArray , List, converitng arrays.. и какво ли още не.. а то има има решение с 1 ред !!! laugh

 

Нищо, упражних списъци и масиви. Ето ви две решения, който са пример за "от 9 дола вода да носиш" , но все пак мисля, че си заслужава да ги разгледате

Със Списък:

int number = int.Parse(Console.ReadLine());
            bool is7 = false;

            List<int> listOfInts = new List<int>();
            while (number > 0)
            {
                listOfInts.Add(number % 10);
                number = number / 10;
            }   
            listOfInts.Reverse();

            int thirdPosition = listOfInts.Count - 3;

            if (listOfInts[thirdPosition] == 7)
            {
                is7 = true;
            }
            Console.WriteLine(is7);

С Масив:

            string number = Console.ReadLine();

            bool is7 = false;

            char[] charArray = number.ToCharArray();

            int[] intArray = Array.ConvertAll(charArray, c => (int)char.GetNumericValue(c));

                     

            int thirdPosition = number.Length - 3;

            if (intArray[thirdPosition] == 7)

            {
                is7 = true;
            }
            Console.WriteLine(is7);

 

1
quickben avatar quickben 966 Точки

Хора стринга си е char array какви излишни конвертирания ви прихващат? Че и reverse() видях някой да казва, най малкото вместо да изпълняваш цял метод върху дадена колекция можеш да си направи един обратен цикъл... :)

string a = "12345";

if(a[2] == "7")....

 

1
25/08/2015 23:08:05
iliyanlishkov avatar iliyanlishkov 0 Точки

Какво ще кажеш за този вариант?           

            int a = int.Parse(Console.ReadLine());
            string b = a.ToString();
            char c = b[b.Length - 3];
            Console.WriteLine(c == '7' ? true : false);

Само дето ако е 5-ца е много късо числото и дава грешка. Знам как да я избегна, но има ли вариянт да го направя чрез някакъв кратък код на един ред? Искам да избегна да пиша дългото IF.

            int a = int.Parse(Console.ReadLine());
            if (a >= 100)
            {
                string b = a.ToString();
                char c = b[b.Length - 3];
                Console.WriteLine(c == '7' ? true : false);
            }
            else
            {
                Console.WriteLine("false");
            }

0
18/09/2015 16:29:43
Cwetkoyy avatar Cwetkoyy 3 Точки

Ето моето решение:

            long n = long.Parse(Console.ReadLine());
            bool thirdDig = true;
            if((n / 100) % 10 == 7)
            {
                Console.WriteLine(thirdDig);
            }
            else
            {
                Console.WriteLine("False");
            }
Поздрави!

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