Модераторы: Partizan, gambit

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разбитие целого числа на цифры. Первая программа на C# 
:(
    Опции темы
zaksys
Дата 5.2.2009, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2008
Где: Красноярск

Репутация: нет
Всего: нет



У меня есть такая задача. Есть целое число, которое мы вводим с клавиатуры. И необходимо узнать сколько в этом числе нечетных и четных цифр. 
Примерно был написан такой код.
Код

using System;
using System.Collections.Generic;
using System.Text;

namespace Лабороторная__1
{
    class Program
    {
        static void Main(string[] args)
        {
            string buf;
            Console.WriteLine("Ввидите целое число");
            buf = Console.ReadLine();
            int i = Convert.ToInt32(buf);
            int a = 0;
            int b = 0;
            int c = 0;
            while (i='')
            {
            i= Console.Read();
            c = i % 2;
            if(c==0)
            {
            a++;         
            }
            else
            {
            b++;
            };
            };
            Console.WriteLine("Количество четных цифр"+a+"в числе" + i);
            Console.WriteLine("Количество не четных цифр"+b+"в числе"+i);
            Console.ReadLine();        
        }
    }
}

Подскажите, где здесь ошибка пожалуйста.
PM MAIL Skype   Вверх
diadiavova
Дата 5.2.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Код

        static void Main(string[] args)
        {
            string buf;
            Console.WriteLine("Введите целое число");
            buf = Console.ReadLine();
            int i = int.Parse(buf);
            int a = 0;
            int b = 0;
            System.Collections.IEnumerator en = buf.GetEnumerator();
            while (en.MoveNext())
            {
                int cur = int.Parse(en.Current.ToString());
                if (cur % 2 == 0)
                {
                    a++;
                }
                else
                {
                    b++;
                };
            };
            Console.WriteLine("Количество четных цифр " + a.ToString() + " в числе " + i.ToString());
            Console.WriteLine("Количество не четных цифр " + b.ToString() + " в числе " + i.ToString());
            Console.ReadLine();
        }


Правда, в дополнение к этому ещё неплохо было бы проверить корректность введённых данных.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
zaksys
Дата 5.2.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2008
Где: Красноярск

Репутация: нет
Всего: нет



Код

System.Collections.IEnumerator en = buf.GetEnumerator();
while (en.MoveNext())

А можно объснить откуда это взялось, и что можно по этой теме почитать?

PM MAIL Skype   Вверх
diadiavova
Дата 5.2.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Почитать попробуй официальную документацию по этому интерфейсу. Перечислитель просто перебирает буквы в строке. Метод MoveNext переводит его на следующую букву и есле она ещё есть, то возвращает true, в противном случае(если строка кончилась) цикл обрывается. Свойство Current возвращает текущую букву.


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
QryStaL
Дата 5.2.2009, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



Цитата(zaksys @  5.2.2009,  19:39 Найти цитируемый пост)
А можно объснить откуда это взялось, и что можно по этой теме почитать?

Этот код эквивалентен следующему

Код

foreach (Char c in buf)
{
    int cur = int.Parse(c.ToString());
    if (cur % 2 == 0)
    {
        a++;
    }
    else
    {
        b++;
    }
}


Добавлено через 1 минуту и 7 секунд
http://dofactory.com/patterns/PatternIterator.aspx


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
zaksys
Дата 6.2.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2008
Где: Красноярск

Репутация: нет
Всего: нет



А есть какие-нибудь рускоязычные источники?
PM MAIL Skype   Вверх
QryStaL
Дата 6.2.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32





--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
PashaPash
Дата 6.2.2009, 16:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



diadiavovaQryStaL, я просто в шоке. Считать четные/нечетные цифры преобразованием числа в строку - это позор. Оба примера падают даже на -1 smile

Добавлено через 5 минут и 9 секунд
Код

        static void Main(string[] args)
        {
            string buf;
            Console.WriteLine("Введите целое число: ");
            buf = Console.ReadLine();
            int i = int.Parse(buf);
            int a = 0;
            int b = 0;

            do
            {
                int rem;
                i = Math.DivRem(i, 10, out rem);
                if (rem % 2 == 0)
                {
                    a++;
                }
                else
                {
                    b++;
                }
            }
            while (i != 0);


            Console.WriteLine("Количество четных цифр: " + a.ToString());
            Console.WriteLine("Количество нечетных цифр: " + b.ToString());
            Console.ReadLine();
        }

шаблон "Остаток от деления на 10" (с)


--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 6.2.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



PashaPash, я тебя ещё больше шокирую. В дополнение к тому позору, о котором ты уже написал, я ещё плюс ко всему не смог найти в своём собственном коде того места, в котором я преобразовывал бы число в строку с вышеозначенной целью. Так что: не сочти за труд - укажи место поточнее. smile 


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
PashaPash
Дата 6.2.2009, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



Ты работаешь со строковым представлением числа. Выше у тебя уже есть готовое число в виде int. Это как-бы и есть преобразование числа в строку для решения мегазадачи smile Согласись, код с душком получился, да еще и с ручным энумератором. И на отрицательных падает.


--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 6.2.2009, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



Со строкой я работаю в силу того, что задача состоит в подсчёте цифр(которые как известно являются символами), из-за этого, на мой взгляд их куда более естественно извлекать прямо из строки, чем выполнять математические операции над числом после преобразования. Что до отрицательных чисел и прочих прелестей - это всё можно скорректировать если такое условие будет поставлено, насколько я понимаю, в твоём коде тоже отсутствует проверка корректности введённых данных ( только какое это имеет отношение к задаче?). 
Для проверки чётности я использовал тот же механизм что и ты(а не преобразование в строку). Что касается ручного энумератора, то здесь я, пожалуй, согласен, только вот...недостаток этот исправил QryStaL, но он тебя тоже почему-то шокировал. Я же его использовал для сохранения сходства с первоначальным кодом, для пущей ясности, пропёрся малость - бывает. ....Или ты опять намекаешь, что я про форич не в курсях?


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
QryStaL
Дата 6.2.2009, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Intellectual feast
**


Профиль
Группа: Участник
Сообщений: 914
Регистрация: 30.11.2005

Репутация: 14
Всего: 32



PashaPash, начнем с того, что я алгоритм вообще никак не комментировал, а просто ответил на вопрос автора про кусок кода (указал на возможность использования конструкции foreach)  smile 


--------------------
I don't need a reason being who I am...
PM MAIL ICQ   Вверх
zaksys
Дата 6.2.2009, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 31.5.2008
Где: Красноярск

Репутация: нет
Всего: нет



Не понятно о чем тут написано, но все равно спасибо за помощь.  
PM MAIL Skype   Вверх
PashaPash
Дата 6.2.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 13
Всего: 49



QryStaL, да с тобой все понятно smile У тебя в коде только проверки на "-" нет.
Цитата(diadiavova @  6.2.2009,  17:37 Найти цитируемый пост)
Со строкой я работаю в силу того, что задача состоит в подсчёте цифр(которые как известно являются символами)

Да, только для опередления цифр, стоящих в десятичной записи числа есть готовый древний алгоритм с делением. Код пишется для машины, в которой числа представлены не строковыми литералами. И преобразование их в строки равносильно проверке val==true кодом типа if (val.ToString().Length == 4).
Твой код считает количество четных одноразраядных чисел в введенной строке. Самого понятия "введенного числа" в нем нет. 
Как-то видет - для передачи массива чисел по сети их преобразовывали в строчку. И аргументировали - send(char*), значит надо передать строку. ;)
Цитата(diadiavova @  6.2.2009,  17:37 Найти цитируемый пост)
Что до отрицательных чисел и прочих прелестей - это всё можно скорректировать если такое условие будет поставлено, насколько я понимаю, в твоём коде тоже отсутствует проверка корректности введённых данных ( только какое это имеет отношение к задаче?).

В условии написано - целых чисел. Отрицательные натуральные - это целые. Условие уже поставлено, так что отрицательные числа имеют к задаче вполне конкретное отношение smile А про проверку корректности в условии ничего нет.



--------------------
PM MAIL WWW   Вверх
diadiavova
Дата 6.2.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 31
Всего: 142



zaksys, спор идёт о способе решения твоей задачи. В варианте, предложенном мной, строка просто перебирается посимвольно, и каждый символ проверяется на предмет соответствия условию. В варианте, предлагаемом PashaPash строку сначала надо преобразовать в число, а потом выдирать из этого числа отдельные цифры, используя простой(по его мнению) алгоритм, состоящий в том, что число в каждой итерации цикла делится на 10, остаток деления проверяется на предмет деления на 2 а с результатом деления эта операция повторяется до тех пор, пока он не иссякнет (я ничего не напутал?).
PashaPash, в приведённом примере исходными данными является строка, так что: никто ничего не преобразовывал. Преобразовывать входную строку в число - действительно не надо было(переменная i там лишняя).

Цитата(PashaPash @  6.2.2009,  18:53 Найти цитируемый пост)
А про проверку корректности в условии ничего нет.

Ну если ты так строго подходишь к этому учебному примеру и хочешь сделать из него настоящую программу, то "защиту от дурака" предусмотреть надо, несмотря на отсутствие такого требования в постановке задачи.



--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.1080 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.