Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2015, 11:36   #1
Obey177
Форумчанин
 
Регистрация: 29.08.2010
Сообщений: 159
По умолчанию Пресечение ошибок в самом начале

Здравствуйте, я учусь программировать и хотелось бы узнать мои ошибки(быдлокод) что я не верно пишу, что можно проще...
Вот решил задачу...
Совсем недавно Вася занялся программированием и решил реализовать собственную программу для игры в шахматы. Но у него возникла проблема определения правильности хода конем, который делает пользователь. Т.е. если пользователь вводит значение «C7-D5», то программа должна определить это как правильный ход, если же введено «E2-E4», то ход неверный. Так же нужно проверить корректность записи ввода: если например, введено «D9-N5», то программа должна определить данную запись как ошибочную. Помогите ему осуществить эту проверку!

Входные данные

В единственной строке входного файла INPUT.TXT записан текст хода, который указал пользователь. Пользователь не может ввести строку, длиннее 5 символов.

Выходные данные

В выходной файл OUTPUT.TXT нужно вывести «YES», если указанный ход конем верный, если же запись корректна (в смысле правильности записи координат), но ход невозможен, то нужно вывести «NO». Если же координаты не определены или заданы некорректно, то вывести сообщение «ERROR».
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            StreamReader Reader = new StreamReader("Input.txt");
            StreamWriter Writer = new StreamWriter("Output.txt");
            string Move = Reader.ReadToEnd();
            string[] StartEnd = Move.Split('-');
            char Spliter = Convert.ToChar(Move.Substring(2, 1));
            string letterStart = StartEnd[0].Substring(0, StartEnd[0].Length - 1);
            int tointStart =Convert.ToInt16(StartEnd[0].Substring(StartEnd[0].Length - 1));
            string letterEnd = StartEnd[1].Substring(0, StartEnd[1].Length - 1);
            int tointEnd =Convert.ToInt16(StartEnd[1].Substring(StartEnd[1].Length - 1));
            int letterintStart = lettertoint(letterStart);
            int letterintEnd = lettertoint(letterEnd);
            string deffStart= Convert.ToString(letterintStart)+Convert.ToString(tointStart);
            string deffEnd = Convert.ToString(letterintEnd) + Convert.ToString(tointEnd);
            if(Spliter!='-'&
               (11<=Convert.ToInt16(deffStart)&Convert.ToInt16(deffStart)<=88)&
               (11<=Convert.ToInt16(deffEnd)&Convert.ToInt16(deffEnd)<=88))
            {
            if((letterintStart-2==letterintEnd&tointStart+1==tointEnd)|
               (letterintStart-2==letterintEnd&tointStart-1==tointEnd)|
               (letterintStart-1==letterintEnd&tointStart-2==tointEnd)|
               (letterintStart+1==letterintEnd&tointStart-2==tointEnd)|
               (letterintStart+2==letterintEnd&tointStart+1==tointEnd)|
               (letterintStart+2==letterintEnd&tointStart-1==tointEnd)|
               (letterintStart-1==letterintEnd&tointStart+2==tointEnd)|
               (letterintStart+1==letterintEnd&tointStart+2==tointEnd))
            {
                Writer.Write("YES");
            }
            else
            {
                Writer.Write("NO");
            }
            }
            else
            {
                Writer.Write("ERROR");
            }
            Reader.Close();
            Writer.Close();
        }
        public static int lettertoint(string letter)
        {
            switch(letter)
            {
                case "A":
                    return 1;
                    break;
                case "B":
                    return 2;
                    break;
                case "C":
                    return 3;
                    break;
                case "D":
                    return 4;
                    break;
                case "E":
                    return 5;
                    break;
                case "F":
                    return 6;
                    break;
                case "G":
                    return 7;
                    break;
                case "H":
                    return 8;
                    break;
                default:
                    return 9;
                    break;
            }
        }
    }
}
Программа работает но вот совершенна ли она, кто что скажет?

Последний раз редактировалось Obey177; 12.04.2015 в 12:20.
Obey177 вне форума Ответить с цитированием
Старый 12.04.2015, 13:50   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Писал без особой проверки:
Код:
using System;

namespace Application
{
	class MainClass
	{
		static string cols="ABCDEFGH"; // Координаты параллелей
		static string rows="12345678"; // Координаты меридиан для шахматки

//Функция проверки хода коня и выпадания координат за шахматную сетку
// В нее передается ход откуда и куда
		public static bool Horseway(string aFrom,string aTo){
//Проверяем есть ли в параллелях и меридианах указанные ходы
//Тупо поиском. Если скажем координата N5 - то ее нет, ибо IndexOf вернет -1, не найдя такой буквы или цифры
			int xa=cols.IndexOf(aFrom[0]),	ya=rows.IndexOf(aFrom[1]);
			int xb=cols.IndexOf(aTo[0]),	yb=rows.IndexOf(aTo[1]);
//Далее смотрим есть ли такие координаты вообще в системе координат шахматки
			return !(
				(xa==-1 || xb==-1 || ya==-1 || yb==-1) ||
//И если есть то координируют ли они ход конем, т.е. буквой "Г"
				(Math.Abs(xa-xb)!=2 || Math.Abs(ya-yb)!=1) &&
				(Math.Abs(xa-xb)!=1 || Math.Abs(ya-yb)!=2) 
			);
		}

//Это функция вспомогательная
		public static bool Calc(string s){
//Просто строку с координатами сплитует на координаты
			string[] a = s.Split ('-');
//Проверяет на правильность самй строку
			if (a.GetLength (0) != 2)
				return false;
			else
//И передает на расчет хода коняки
				return Horseway (a [0], a [1]);
		}
		public static void Main (string[] args)
		{
			string s = "A1-B4";
			
			Console.WriteLine ("{0}",Calc(s));
			Console.ReadKey ();
		}
	}
}
Я бы делал так.
I'm learning to live...

Последний раз редактировалось Stilet; 12.04.2015 в 18:51.
Stilet вне форума Ответить с цитированием
Старый 12.04.2015, 18:44   #3
Obey177
Форумчанин
 
Регистрация: 29.08.2010
Сообщений: 159
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Писал без особой проверки:
Код:
using System;

namespace Application
{
	class MainClass
	{
		static string cols="ABCDEFGH";
		static string rows="12345678";
		public static bool Horseway(string aFrom,string aTo){
			int xa=cols.IndexOf(aFrom[0]),	ya=rows.IndexOf(aFrom[1]);
			int xb=cols.IndexOf(aTo[0]),	yb=rows.IndexOf(aTo[1]);
			return !(
				(xa==-1 || xb==-1 || ya==-1 || yb==-1) ||
				(Math.Abs(xa-xb)!=2 || Math.Abs(ya-yb)!=1) &&
				(Math.Abs(xa-xb)!=1 || Math.Abs(ya-yb)!=2) 
			);
		}
		public static bool Calc(string s){
			string[] a = s.Split ('-');
			if (a.GetLength (0) != 2)
				return false;
			else
				return Horseway (a [0], a [1]);
		}
		public static void Main (string[] args)
		{
			string s = "A1-B4";
			
			Console.WriteLine ("{0}",Calc(s));
			Console.ReadKey ();
		}
	}
}
Я бы делал так.
А расписать можно, а то чужой код потемки а ваш для меня что то иное по сравнению с моим куском емкий, прошу описания всего
Obey177 вне форума Ответить с цитированием
Старый 12.04.2015, 18:52   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Можно. Я поправил свой пост, дабы не писать лишнего добавил комментарии.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблемка в самом начале компиляции Input-output Общие вопросы C/C++ 1 29.11.2012 21:08
Переполнение стека в самом начале программы JuniorProger Общие вопросы C/C++ 8 15.02.2012 17:11
кракозябры в самом файле franko Помощь студентам 1 12.01.2012 06:52
Возможен ли отлов ошибок "чужих" программ без скана экрана на предмет окон-ошибок? Человек_Борща Общие вопросы Delphi 4 21.04.2011 00:18