Вход на сайт
Вопросы по C#
NEW 28.10.13 20:26
Перенес строку playerMatches = Convert.ToInt32(inputLine); внутрь else, вот так:
else
{
playerMatches = Convert.ToInt32(inputLine);
break;
}
}
while(!Matches);
Честно говоря, не понимаю, то там за два выхода
NEW 28.10.13 20:59
в ответ Mahone 28.10.13 20:26
Сегодня решал задачи для следующего Юбунга, написал такую программку, которая при вводе числа показывает на какие числа оно делится или сообщает, что оно простое число.
static void Main()
{
int number;
int divider;
string input;
bool prim = true;
Console.Write("Geben Sie eine Zahl ein: ");
input = Console.ReadLine();
number = Convert.ToInt32(input);
for (divider = 2; divider <= number / 2; divider++)
{
if (number % divider == 0)
{
prim = false;
}
}
if (prim)
{
Console.Write("{0} ist eine Primzahl", number);
}
else if (!prim)
{
Console.Write("{0} ist teilbar durch ", number);
for (divider = 2; divider <= number / 2; divider++)
{
if (number % divider == 0)
{
Console.Write("{0}, ", divider);
}
}
}
Console.ReadLine();
}
Возможно ли тут как-то избавиться от дублирования
for (divider = 2; divider <= number / 2; divider++)
{
if (number % divider == 0)
{
и выводить результаты после первого перебора делителей?
Нужно, чтобы текст был различным для простого числа и при выводе делителей:
Geben Sie eine Zahl ein: 100
100 ist teilbar durch 2, 4, 5, 10, 20, 25, 50
Geben Sie eine Zahl ein: 79
79 ist eine Primzahl
Возможно ли при первом переборе делителей передать их значения в Array и выводить эти значения потом в консоль? Сегодня ломал над этим голову, но не придумал как реализовать.
NEW 28.10.13 22:22
Всё как ты сказал:
в ответ Mahone 28.10.13 20:59
В ответ на:
Возможно ли при первом переборе делителей передать их значения в Array и выводить эти значения потом в консоль? Сегодня ломал над этим голову, но не придумал как реализовать.
Возможно ли при первом переборе делителей передать их значения в Array и выводить эти значения потом в консоль? Сегодня ломал над этим голову, но не придумал как реализовать.
Всё как ты сказал:
List<int> dividers = new List<int>();
for (divider = 2; divider <= number / 2; divider++)
{
if (number % divider == 0)
{
dividers.Add(prim);
}
}
if (dividers.Count == 0)
{
Console.Write("ist Primzahl");
}
else
{
Console.Write("ist teilbar durch: " + string.Join(", ", dividers.ToArray()));
}
* нет шарпа под рукой - не могу проверить.
NEW 28.10.13 22:56
смотри проект в zip файле.
там будут несколько новых для тебя вещей :-)
Nullable Types, Generics, Generic Collections
подробности здесь: http://msdn.microsoft.com/en-us/library/ms123401.aspx
(поиск в верхнем правом углу)
P.S. Вот этого bool prim = true; не должно быть в принципе. Ты еще ничего не знаешь о числе, а какую-то его характeристику уже определяешь как true. Если и использовать такой флаг, то изначальное значение должно быть false.
там будут несколько новых для тебя вещей :-)
Nullable Types, Generics, Generic Collections
подробности здесь: http://msdn.microsoft.com/en-us/library/ms123401.aspx
(поиск в верхнем правом углу)
P.S. Вот этого bool prim = true; не должно быть в принципе. Ты еще ничего не знаешь о числе, а какую-то его характeристику уже определяешь как true. Если и использовать такой флаг, то изначальное значение должно быть false.
NEW 29.10.13 04:02
в ответ Tomasson 28.10.13 22:56
Если и использовать такой флаг, то изначальное значение должно быть фалсе.
-----
Если использовать флаг, то поле должно быть не булевым, а енум... пожалуй на три позиции - не_проверено, простое, не_простое...
Кроме этого, там еще надо добавлять класс-контейнер для тестируемых чисел и другой класс - для простых... идея в том, что бы в массив делителей нельзя было поместить что-то отличное от простого числа, а число нельзя было назвать простым, не выполнив проверку... т.е. создавать только на базе контейнера имеющего тот самый енум-флаг...
Но писать всю эту фигню Я не буду - пусть ТС тренируется...
2ТС: Ты уже понимаешь об чем выше написано?
-----
Если использовать флаг, то поле должно быть не булевым, а енум... пожалуй на три позиции - не_проверено, простое, не_простое...
Кроме этого, там еще надо добавлять класс-контейнер для тестируемых чисел и другой класс - для простых... идея в том, что бы в массив делителей нельзя было поместить что-то отличное от простого числа, а число нельзя было назвать простым, не выполнив проверку... т.е. создавать только на базе контейнера имеющего тот самый енум-флаг...

Но писать всю эту фигню Я не буду - пусть ТС тренируется...

2ТС: Ты уже понимаешь об чем выше написано?
NEW 29.10.13 11:29
тоесть ты считаешь, что:
в ответ Tomasson 28.10.13 22:56
В ответ на:
P.S. Вот этого bool prim = true; не должно быть в принципе. Ты еще ничего не знаешь о числе, а какую-то его характeристику уже определяешь как true.
Если и использовать такой флаг, то изначальное значение должно быть false.
P.S. Вот этого bool prim = true; не должно быть в принципе. Ты еще ничего не знаешь о числе, а какую-то его характeристику уже определяешь как true.
Если и использовать такой флаг, то изначальное значение должно быть false.
тоесть ты считаешь, что:
bool isCompositeNumber = false;
лучше, чем:
bool isPrimeNumber = true;
;-)
NEW 29.10.13 18:44
в ответ Posmotrim 28.10.13 22:22
Спасибо, работает!)
Только тут
Только тут
List<int> dividers = new List<int>();
for (divider = 2; divider <= number / 2; divider++)
{
if (number % divider == 0)
{
dividers.Add(prim);
не prim добавляем в Array, а divider
Кстати, для чего использовать .ToArray или .ToString при выводе значений? Вроде и без этого норм работает.
NEW 29.10.13 19:02
метод String.Join<T>(String, IEnumerable<T>) добавили только в 4-й версии фреймворка. Раньше необходимо было передавать вторым параметром массив. Из-за это-то я по старинке использую преобразование.
в ответ Mahone 29.10.13 18:44
В ответ на:
Кстати, для чего использовать .ToArray или .ToString при выводе значений? Вроде и без этого норм работает.
Кстати, для чего использовать .ToArray или .ToString при выводе значений? Вроде и без этого норм работает.
метод String.Join<T>(String, IEnumerable<T>) добавили только в 4-й версии фреймворка. Раньше необходимо было передавать вторым параметром массив. Из-за это-то я по старинке использую преобразование.
NEW 30.10.13 01:02
в ответ MrSanders 29.10.13 18:10
Великолепный пример нарушения принципа КИСС.
-----
Это к моему бывшему шефу - он очень любит делать все просто... и что-то даже работает... местами... иногда... а иногда - не работает... и никто не знает - почему...
А когда надо что-то поменять, то начинаются некоторые трудности... обычные - одно простое поправил - два других, тоже - простых, перестали работать т.к. были рассчитаны на комплиментарность именно с первым простым... и пока все не сделаешь... хммм... сложно - ничего не удастся починить...
При этом в сложном коде... с которым Я не работал лет 5-6 и все основательно подзабыл... все поправилось, расширилось и углубилось без всяких проблем... писанины было правда довольно много, но писанина была простая/техническая и не создавала проблем - просто должен имплементировать то, что должен имплементировать и система говорит что именно должно быть, чего не хватает...
Так что КИСС - КИССом, а констрайнты - констрайнтами...
Боюсь представить что надо написать для умножения два на два. :)
-----
Ну так подумай...
У тебя же задано ограничение - два на два - вот и подумай как _гарантировать_ что и там, и там будут эти самые двойки... :)
-----
Это к моему бывшему шефу - он очень любит делать все просто... и что-то даже работает... местами... иногда... а иногда - не работает... и никто не знает - почему...
А когда надо что-то поменять, то начинаются некоторые трудности... обычные - одно простое поправил - два других, тоже - простых, перестали работать т.к. были рассчитаны на комплиментарность именно с первым простым... и пока все не сделаешь... хммм... сложно - ничего не удастся починить...
При этом в сложном коде... с которым Я не работал лет 5-6 и все основательно подзабыл... все поправилось, расширилось и углубилось без всяких проблем... писанины было правда довольно много, но писанина была простая/техническая и не создавала проблем - просто должен имплементировать то, что должен имплементировать и система говорит что именно должно быть, чего не хватает...
Так что КИСС - КИССом, а констрайнты - констрайнтами...
Боюсь представить что надо написать для умножения два на два. :)
-----
Ну так подумай...
У тебя же задано ограничение - два на два - вот и подумай как _гарантировать_ что и там, и там будут эти самые двойки... :)
NEW 12.11.13 18:15
Всем привет!
Сделал очередное задание по программированию и буду рад получить фидбэк, что сделано "коряво" и что можно было бы сделать лучше
Задание такое:
До методов и регулярных выражений мы пока еще не дошли, поэтому их использовать пока не разрешается.
Сделал очередное задание по программированию и буду рад получить фидбэк, что сделано "коряво" и что можно было бы сделать лучше

Задание такое:
In Antwort auf:
ISBN-13 состоит из 13 цифр, которые разделены на 5 частей: трехзначного префикса (978 или 979), 3 переменно длинных номера, которые означают язык, издательство и заголовок и однозначной проверочной цифры.
Проверочная цифра рассчитывается следующим образом:
Все 12 цифр (без проверочной цифры) умножаются слева направо попеременно на 1 или 3 и суммируются. Сумма делится на 10 и остаток вычитается из 10, это - проверочная цифра. Если остаток 0, то проверочная цифра = 0.
Пример:
ISBN: 978-3-446-42118-9
9+7*3+8+3*3+4+4*3+6+4*3+2+1*3+1+8*3 = 111
111 mod 10 = 1 10-1=9 => проверочная цифра в порядке
Все знаки в строке, которые не являются цифрами (например "–" или знак пробела), пропускаются.
ISBN-13 состоит из 13 цифр, которые разделены на 5 частей: трехзначного префикса (978 или 979), 3 переменно длинных номера, которые означают язык, издательство и заголовок и однозначной проверочной цифры.
Проверочная цифра рассчитывается следующим образом:
Все 12 цифр (без проверочной цифры) умножаются слева направо попеременно на 1 или 3 и суммируются. Сумма делится на 10 и остаток вычитается из 10, это - проверочная цифра. Если остаток 0, то проверочная цифра = 0.
Пример:
ISBN: 978-3-446-42118-9
9+7*3+8+3*3+4+4*3+6+4*3+2+1*3+1+8*3 = 111
111 mod 10 = 1 10-1=9 => проверочная цифра в порядке
Все знаки в строке, которые не являются цифрами (например "–" или знак пробела), пропускаются.
До методов и регулярных выражений мы пока еще не дошли, поэтому их использовать пока не разрешается.
NEW 12.11.13 19:21
в ответ Mahone 12.11.13 18:15
Вижу - <class Program>.
Не вижу - <class TISBN>, <class TISBNChar>.
Вижу - <if (totalDigits != 12)>
Не вижу - быстрой проверки длинны введенной строки - смотри какие проперти есть у массива.
Не вижу - смысла в числе 12. У меня в коде нет каких-либо цифровых и текстовых констант - полиси не разрешает и весьма правильно - сейчас работаю с кодом где это не соблюдается - головная боль постоянна...
Вижу - <if (char.IsDigit(digitAsChar) == true)>
Не вижу - почему должна выполнятся повторная проверка.
То, что тебе приходится писать довольно громоздкий и сложный для чтения код есть следствие того, что у тебя нет <TISBN> и <TISBNChar>. Подумай как это организовать.
По общему коду - у тебя смешаны хранение данных, ввод данных и какие-то действия с данными. В коде который будет "хорошим" должно быть четкое разделение где, что и как делается. Даже в том случае когда вроде бы можно совместить пару вычислений - все же стоит иметь их отдельно - меньше головной боли будет...
Вопросик на засыпку: <ISBN>, если Я правильно помню, имеет более одного формата. Как будешь решать проблему, если у тебя будут данные с двух внешних источников и в разных форматах?
<P.S.> Цель, как всегда, - научить, а не сделать вместо... научить включает в себя многое, в т.ч. заставить думать над тем как сделать... иногда даже в пустую...
Не вижу - <class TISBN>, <class TISBNChar>.
Вижу - <if (totalDigits != 12)>
Не вижу - быстрой проверки длинны введенной строки - смотри какие проперти есть у массива.
Не вижу - смысла в числе 12. У меня в коде нет каких-либо цифровых и текстовых констант - полиси не разрешает и весьма правильно - сейчас работаю с кодом где это не соблюдается - головная боль постоянна...
Вижу - <if (char.IsDigit(digitAsChar) == true)>
Не вижу - почему должна выполнятся повторная проверка.
То, что тебе приходится писать довольно громоздкий и сложный для чтения код есть следствие того, что у тебя нет <TISBN> и <TISBNChar>. Подумай как это организовать.
По общему коду - у тебя смешаны хранение данных, ввод данных и какие-то действия с данными. В коде который будет "хорошим" должно быть четкое разделение где, что и как делается. Даже в том случае когда вроде бы можно совместить пару вычислений - все же стоит иметь их отдельно - меньше головной боли будет...
Вопросик на засыпку: <ISBN>, если Я правильно помню, имеет более одного формата. Как будешь решать проблему, если у тебя будут данные с двух внешних источников и в разных форматах?
<P.S.> Цель, как всегда, - научить, а не сделать вместо... научить включает в себя многое, в т.ч. заставить думать над тем как сделать... иногда даже в пустую...
21.11.13 16:52
в ответ Murr 12.11.13 19:21
Появился вопрос.
Есть строка, в которой записано число, например "123". Хочу вытащить каждую цифру и засунуть в int array. При использовании foreach (char c in numberAsString) цифры из строки вытаскиваются в ASCII формате и при передаче в int array имеют значения 49,50,51. Функции .toString() и другие конверторы использовать нельзя!
Пока решил задачу таким образом:
foreach (char c in numberAsString)
{
tempString = c - 48;
numberIntArray[arrayPosition] = tempString;
arrayPosition++;
}
Но выглядит нехорошо. Есть ли более "красивые" способы конвертирования без использования встроенных функций?
Есть строка, в которой записано число, например "123". Хочу вытащить каждую цифру и засунуть в int array. При использовании foreach (char c in numberAsString) цифры из строки вытаскиваются в ASCII формате и при передаче в int array имеют значения 49,50,51. Функции .toString() и другие конверторы использовать нельзя!
Пока решил задачу таким образом:
foreach (char c in numberAsString)
{
tempString = c - 48;
numberIntArray[arrayPosition] = tempString;
arrayPosition++;
}
Но выглядит нехорошо. Есть ли более "красивые" способы конвертирования без использования встроенных функций?