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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.11.2008, 19:43   #1
WormsSs
 
Регистрация: 25.11.2008
Сообщений: 7
По умолчанию Задача "Ход конем"

уважаемые форумцы прошу помочь в решении задачи:
Даны две литеры- латинская буква (от а до h) и цифра (от 1 до 8), например а2 или g5. Рассматривая их как координаты поля шахматной доски, на котором находится шахматный конь, нарисовать шахматную доску, пометив крестиками все поля, которые бьет этот шахматный конь, и ноликами все остальные. Программа должна выводить последовательность на экран и в файл "output.txt".

просто начал изучать С++ не так давно, и что-то даже не понимаю хода решения, буду рад любому совету и помощи!
помогите хотя бы разобраться в последовательности и ходе решения.
WormsSs вне форума Ответить с цитированием
Старый 25.11.2008, 20:05   #2
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Цитата:
Сообщение от WormsSs Посмотреть сообщение
просто начал изучать С++ не так давн


Хм... Так проблемы с кодом или с алгоритмом?

Короче )))

Код:
#include <stdio.h>
#include <string.h>


bool inRange(int x,int y)
{
	return (x >= 0 && x < 8 && y >= 0 && y < 8);
}

int main()
{
	bool d[8][8];
	char inp[32];
	int x,y, i,j;
	int smx[8] = {1, 2,-1,-2, 1, 2,-1,-2};
	int smy[8] = {2, 1, 2, 1,-2,-1,-2,-1};

	for(x=0;x<8;x++) for(y=0;y<8;y++) d[x][y] = false;
	

	printf("Enter field: ");
	scanf("%31s", inp);

	strlwr(inp); // в нижний регистр

	x = inp[0] - 'a';
	y = inp[1] - '1';

	if(!inRange(x,y))
	{
		printf("Wrong parameter!\n");
		return 1;
	}

	for(i = 0;i < 8;i++)
		if(inRange(x+smx[i],y+smy[i])) d[x+smx[i]][y+smy[i]] = true;

	printf(" abcdefgh\n");
	for(i = 0;i < 8;i++)
	{
		printf("%d",i+1);
		for(j = 0;j < 8;j++)
			printf("%c", d[i][j]?'X':'o');
		printf("\n");
	}
	

	return 0;
}

Что-то я сегодня добрый ) В винде скомпилиный файл запускаем через Shift+Enter, чтоб окно не пропало сразу. Или вставляем в файл перед return оператор getch() (надо тогда заинклудить conio.h)

Последний раз редактировалось rpy3uH; 25.11.2008 в 20:23.
theos вне форума Ответить с цитированием
Старый 25.11.2008, 20:25   #3
WormsSs
 
Регистрация: 25.11.2008
Сообщений: 7
По умолчанию

theos
спасибо огромное!!! буду ща разбираться...
а можно тебе задать несколько вопросов по решению??
ЗЫ блин все-таки наш препод не умеет объяснять

Последний раз редактировалось WormsSs; 25.11.2008 в 20:40.
WormsSs вне форума Ответить с цитированием
Старый 25.11.2008, 20:29   #4
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Код:
x = inp[0] - 'a';
y = inp[1] - '1';
Тогда я думаю для вас стоит пояснить этот момент. Переменная char хранит на самом деле циферку от -128 до 127, которая является кодом буквы. А поскольку в ASCII английские идут по порядку, то мы вычитаем букву 'a' из переменной. Эта разница - кол символов от а до введённой буквы, она же - координата. То же с цифрами от 1 до 9.

Остальное, я надеюсь, понятно.
theos вне форума Ответить с цитированием
Старый 26.11.2008, 00:05   #5
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
По умолчанию

У тебя прога неправильно работает... Вот введи "a4" и посмотри...
точнее у тебя не соответствуют буквы и цифры!!!
StarWorm вне форума Ответить с цитированием
Старый 26.11.2008, 20:32   #6
WormsSs
 
Регистрация: 25.11.2008
Сообщений: 7
По умолчанию

theos еще раз спасибо что так бысто откликнулся!
я вчера попробовал запустить, но компилятор выдает 1 ошибку
bool inRange(int x,int y)
указывает на эту скобку:Declaration syntax error
поэтому вообще не удалось ее запустить, а вообще полистал свои лекции(кстати нашел про ASCII ты прав, а я чет не допер до такого) не на шел там функции inRange(что она вообще значит) и что inp-что это за тип???
и %s??
и вот эта строчка strlwr(inp); // в нижний регистр
тоже не очень понятна
так я в принципе кое-что понимаю в твоей проге, но те вопросы выше я задаю, потому что мы такого еще не проходили(
StarWorm а ты раз нашел ошибку, можешь помочь исправить эту программу??
ЗЫ народ я конечно задаю очень нубские вопросы,но надеюсь на ваше понимание и помощь!
WormsSs вне форума Ответить с цитированием
Старый 27.11.2008, 16:41   #7
theos
Форумчанин
 
Аватар для theos
 
Регистрация: 10.12.2007
Сообщений: 158
По умолчанию

Так, чтоб поменять местами буквы-цифры вместо
Код:
x = inp[0] - 'a';
y = inp[1] - '1';
пишем
Код:
x = inp[1] - '1';
y = inp[0] - 'a';

inRange, собственно наша функция. И определена она правильно. (почитайте ещё и про функции - очень занимательно) Странно, что у Вас не компилится. Что-то значит Вы делаете не так... У Вас вообще какой компилятор? Программу копипастом вставляли?

inp - имя переменной. В неё мы читаем ввод с клавиатуры. Соответственно %s значит 'строка'. То есть читаем строку.

strlwr(inp); - переводит строку в нижний регистр (вместо больших букв будут маленькие). Это нужно если Вы вдруг введёте, например, не 'a4', а 'A4'. Иначе дальше inp[0] - 'a' выдаст некорректный результат.
theos вне форума Ответить с цитированием
Старый 27.11.2008, 17:57   #8
WormsSs
 
Регистрация: 25.11.2008
Сообщений: 7
По умолчанию

компилятор Turbo C++ , нет программу переписывал ручками, то что надо добавил(точто вы писали ниже(эт я знаю))
все разобрался с inp, тупой вопрос), про %s значит 'строка', понял, просто нам еще не рассказывали про этот тип((
раз пошла такая пьянка может посоветуете что почитать про функции??

и еще такой вопрос как вывести в файл output.txt??
нам рассказывали как-то через структуру типо FILE или через "stream" (библиотека <fstream.h>)
ЗЫ еще раз спасибо за помощь и объяснение))
WormsSs вне форума Ответить с цитированием
Старый 27.11.2008, 20:34   #9
ams007
Пользователь
 
Регистрация: 19.11.2008
Сообщений: 35
По умолчанию

char inp[32];
...
scanf("%31s", inp);

WormsSs, в Сях не типа "строка". Строка в сях - это массив символов.
char inp[32]; - это строка, содержащая 31 значащий символ плюс символ '\0' - символ конца строки.
scanf("%31s", inp); - ввод строки, ограниченной 31 символом. Нужно для того, чтобы не произошло переполнения inp.
Почитать на раннем этапе посоветовал бы книжку Березин, Березин "C и С++" - вроде так называется.
ams007 вне форума Ответить с цитированием
Старый 27.11.2008, 20:47   #10
ams007
Пользователь
 
Регистрация: 19.11.2008
Сообщений: 35
По умолчанию

По поводу файла - см. изменения в коде. Код адаптирован под борланд С++ - ибо дома другого нету))
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

#define false 0
#define true 1


int inRange(int x,int y)
{
	return (x >= 0 && x < 8 && y >= 0 && y < 8);
}

int main()
{
	int d[8][8];
	char inp[32];
	int x,y, i,j;
	int smx[8] = {1, 2,-1,-2, 1, 2,-1,-2};
	int smy[8] = {2, 1, 2, 1,-2,-1,-2,-1};
	FILE *hFile;
	char output;

	for(x=0;x<8;x++) for(y=0;y<8;y++) d[x][y] = false;


	printf("Enter field: ");
	scanf("%31s", inp);

	strlwr(inp); // в нижний регистр

	x = inp[1] - '1';
	y = inp[0] - 'a';


	if ((hFile = fopen("XODKOHEM.txt", "w")) == NULL)
	{
		printf("Cannot open file!\n");
		return 1;
	}


	if(!inRange(x,y))
	{
		printf("Wrong parameter!\n");
		return 1;
	}

	for(i = 0;i < 8;i++)
		if(inRange(x+smx[i],y+smy[i]))
			d[x+smx[i]][y+smy[i]] = true;

	printf(" abcdefgh\n");
	fprintf(hFile," abcdefgh\n");
	for(i = 0;i < 8;i++)
	{
		printf("%d",i+1);
		fprintf(hFile,"%d",i+1);
		for(j = 0;j < 8;j++)
		{
			output = d[i][j]?'X':'o';
			printf("%c", output);
			fprintf(hFile,"%c",output);
		}
		printf("\n");
		fprintf(hFile,"\n\r");

	}
        fclose(hFile);

	getch();

	return 0;
}
ams007 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
"Транспортная задача", "Поиск решения" Perroman Microsoft Office Excel 3 12.12.2007 17:12
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49