dadster
@dadster
учить инглиш тут - https://t.me/langhacks

Покритикуйте, пожалуйста, мой нубо-код (алгоритм нахождения наибольшего общего делителя 2ух чисел, c#)

Привет!
Только начал изучать программирование, буду благодарен за критику от опытных товарищей в плане:
1) в каких местах программа "корявая", что Вам режет глаз?
2) что вообще не приемлемо и однозначно нужно делать по-другому?
3) можно ли реализовать что-то проще?

Задал этот вопрос потому, что хочется сразу учиться делать "как правильно".
Спасибо!

p.s. Если посоветуете не заморачиваться, а просто дальше писать код, тоже прислушаюсь.

using System;
class euclid
{
	static void Main ()
	{
		Console.WriteLine( " Привет, я алгоритм Эвклида и готов сделать для вас кой-какую грязную работенку!");
		
		//вводим два числа в строковом формате, превращаем их в числа типа int
		Console.WriteLine( " Введите первое целое число: ");
		string firstNumberString = Console.ReadLine();
		int firstNumber = int.Parse(firstNumberString);
		
		Console.WriteLine( " Введите второе целое число: ");
		string secondNumberString = Console.ReadLine();
		int secondNumber = int.Parse(secondNumberString);
		
		//сравниваем числа, если первое больше второго, то меняем их местами, таким образом второе получается всегда больше первого либо равно ему)
		if (firstNumber > secondNumber)
		{
			int tempNumber = firstNumber;
			firstNumber = secondNumber;
			secondNumber = tempNumber;
		}
		
		//проверяем самый простой случай - если число 2 делится на число 1 без остатка, т.е. число 1 и является наибольшим общим делителем. 
		if (secondNumber % firstNumber == 0)
		{
			Console.WriteLine("Вы ввели числа: {0} и {1}. Наибольший общий делитель: {0}", firstNumber, secondNumber);
			Console.ReadLine();
		}
		
		else 
		
		//вычисляем остаток от деления, и пока остаток не равен нолю выполням цикл Евклида. Как только остаток равняется нолю, выводим предыдущее его сохраненное значение.
		{
			int remainder = secondNumber % firstNumber;
			int formerSecondNumber = firstNumber;
			int storedRemainder = 0;
			while (remainder != 0)
			{
				storedRemainder = remainder;
				remainder = formerSecondNumber % remainder;
				formerSecondNumber = storedRemainder;
			}
			Console.WriteLine("Вы ввели числа: {0} и {1}. Наибольший общий делитель: {2}", firstNumber, secondNumber, storedRemainder);
			Console.ReadLine();
		}
		
		
	}


}
  • Вопрос задан
  • 3111 просмотров
Решения вопроса 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
while (second != 0) {
    reminder = first % second;
    first = second;
    second = reminder;
}
nod = first;
Ответ написан
Комментировать
Если вы не уверены, что вместо числа(даты/etc.) вам не подсунут какую-нибудь строку, то лучше использовать метод TryParse(), он есть у всех базовых типов. Иначе пользователь словит невнятную ошибку и в багрепорте диагностика "не работает" будет самой частой. Внятные ошибки нужны больше вам чем пользователям. В данном случае что-то вроде этого
int firstNumber;
if(!int.TryParse(Console.ReadLine(), out firstNumber){
   Console.WriteLine("Скорее всего Вы ввели не число");
   Console.ReadKey();
   return;
}

Кроме того, Вы зачем-то обрабатываете частный случай:
if (secondNumber % firstNumber == 0)
А тут можно и нужно найти общее решение задачи, как указал @Rsa97. Задача программирования решать как можно более общую задачу.
Ответ написан
Комментировать
SolidlSnake
@SolidlSnake
Ваш дружелюбный сосед
С C# не знаком, но пожалуйста, не делайте таких длинных и явных комментариев, тем более в одну строку. Приучитесь - потом плеваться будете.

Комментарии должны дополнять код, если явно не ясно, что он делает, вы же пишите: "Если второе число делится на первое без остатка..." хотя это и так прекрасно видно в if'е, который всего на строчку ниже.

Но если все же надо оставлять большие комментарии (угрожают пистолетом? :) ) - делите их на несколько строк:
//завязка
//кульминация
//развязка


А так же советовал бы искать более простые решения задач.
Давно использую этот алгоритм (все тот же Евклид, но ведь выглядит куда проще) поиска НОД, по моему даже с википедии его стырил:
public static int nod(int first, int second) {
	if(second == 0) {
		return first;
	} else {
		return nod(second, first % second);
	}
}

Функция на Java, но под C# переделать проблем не должно быть.

А за чистоту C#-кода подождем профи. :)
Ответ написан
Комментировать
@beaverBox
Приглашения лучше делать не через WriteLine:
Console.Write("Введите число: ");

Код, который может крашнуть весь приклад, например
int firstNumber = int.Parse(firstNumberString);
лучше проверять в блоках try...catch.

Остальное сказали.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
dadster
@dadster Автор вопроса
учить инглиш тут - https://t.me/langhacks
Спасибо за советы!
Да, с комментариями мне надо поумерить пыл...
//смеркалось..
Ответ написан
Комментировать
dadster
@dadster Автор вопроса
учить инглиш тут - https://t.me/langhacks
всем спасибо за советы, очень познавательно!
в след.раз буду сперва гуглить на предмет лучших решений, потом уже спрашивать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы