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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2022, 14:52   #1
REZR
Пользователь
 
Регистрация: 05.04.2022
Сообщений: 26
По умолчанию Исправить ошибку.

Код:
//Шахматная ассоциация решила оснастить всех  своих сотрудников такими телефонными номерами, которые бы 
//набирались на кнопочном  телефоне ходом коня.Например, ходом коня набирается телефон 340 - 49 - 27. При  этом телефонный номер не может 
// начинаться ни с цифры 0, ни с  цифры 8.
//7 8 9
//4 5 6
//1 2 3
//0
//Напишите программу, определяющую количество телефонных  номеров длины N,
//набираемых ходом коня.
//Входные  данные
//Во входном файле  записано целое число N(1 ≤ N ≤ 100).
//Выходные  данные
//Выведите в выходной файл искомое  
//количество телефонных номеров.
//Пример входного  файла
//2
//Пример выходного  файла
//16

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

int n;
long nNum = 0;
char i;

void show(string s) // функция
{  // show() позволяет отобразить скрытые выбранные элементы
	if (s.length() == n) // возвращает число знаков в текущий string
	{
		nNum++;
	}
	else
	{
		switch (s[s.length() - 1])
		{
		case '0': // возможные цифры выбора при нажатии на 0
			show(s + '6');
			show(s + '4');
			break;

		case '1': // возможные цифры выбора при нажатии на 1
			show(s + '6');
			show(s + '8');
			break;

		case '2': // возможные цифры выбора при нажатии на 2
			show(s + '7');
			show(s + '9');
			break;

		case '3': // возможные цифры выбора при нажатии на 3
			show(s + '4');
			show(s + '8');
			break;

		case '4': // возможные цифры выбора при нажатии на 4
			show(s + '0');
			show(s + '3');
			show(s + '9');
			break;

		case '6': // возможные цифры выбора при нажатии на 6
			show(s + '0');
			show(s + '1');
			show(s + '7');
			break;

		case '7': // возможные цифры выбора при нажатии на 7
			show(s + '2');
			show(s + '6');
			break;

		case '8': // возможные цифры выбора при нажатии на 8
			show(s + '1');
			show(s + '3');
			break;

		case '9': // возможные цифры выбора при нажатии на 9
			show(s + '2');
			show(s + '4');
			break;

		}
	}
}

int main()
{
	fstream f("input.in");// поток для чтения и записи, файл в режиме чтения.
	f >> n; // читаем
	for (i = '1'; i <= '9'; i++)
	{
		if (!(i == '5' || i == '8')) show(string(1, i));
	}
	f.close();
	f.open("output.out", ios::out); // файл в режиме записи
	f << nNum << " "; // записываем
	f.close();
	system("pause");
	return 0;
}
У меня выходит ошибка когда я пытаюсь сделать работу с файлами(чтение и запись), но если делать без них ошибки нет, код жалуется на исключение. Помогите решить проблему пожалуйста.
Ошибка здесь
case '6': // возможные цифры выбора при нажатии на 6
show(s + '0'); ////////
или здесь
case '0': // возможные цифры выбора при нажатии на 0
show(s + '6'); //////////
REZR вне форума Ответить с цитированием
Старый 07.04.2022, 06:12   #2
Алексей1153
фрилансер
Форумчанин
 
Регистрация: 11.10.2019
Сообщений: 960
По умолчанию

REZR, бесконечная рекурсия, я полагаю. Но зачем
Алексей1153 вне форума Ответить с цитированием
Старый 07.04.2022, 12:12   #3
REZR
Пользователь
 
Регистрация: 05.04.2022
Сообщений: 26
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
REZR, бесконечная рекурсия, я полагаю. Но зачем
хз, можно вроде и так
REZR вне форума Ответить с цитированием
Старый 07.04.2022, 15:11   #4
REZR
Пользователь
 
Регистрация: 05.04.2022
Сообщений: 26
По умолчанию

у меня ошибка вылетает
Необработанное исключение по адресу 0x77B76FFE (ntdll.dll) в laboratorna 5.exe: 0xC00000FD: Stack overflow (параметры: 0x00000001, 0x00CD2FA0).

если я файлы уберу оставлю cin >> n; и cout << nNum; все збс.

Последний раз редактировалось BDA; 07.04.2022 в 17:52.
REZR вне форума Ответить с цитированием
Старый 07.04.2022, 18:00   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Просто работа с файлами, скорее всего, заняла сколько-то места на стеке. И его перестало хватать для вашего рекурсивного вызова. Самым очевидным упрощением будет отказ от формирования строки, тем более что спрашивается количество номеров, а не сами номера:
Код:
void show(char s, int k) // функция
{  // show() позволяет отобразить скрытые выбранные элементы
	if (k == n) // возвращает число знаков в текущий string
	{
		nNum++;
	}
	else
	{
		switch (s)
		{
		case '0': // возможные цифры выбора при нажатии на 0
			show('6', k + 1);
			show('4', k + 1);
			break;

		case '1': // возможные цифры выбора при нажатии на 1
			show('6', k + 1);
			show('8', k + 1);
			break;

		case '2': // возможные цифры выбора при нажатии на 2
			show('7', k + 1);
			show('9', k + 1);
			break;

		case '3': // возможные цифры выбора при нажатии на 3
			show('4', k + 1);
			show('8', k + 1);
			break;
...
	for (i = '1'; i <= '9'; i++)
	{
		if (!(i == '5' || i == '8')) show(i, 1);
	}
Кстати, в условии сказано, что начинаться не может с 0 и 8, а у вас в коде 5 и 8.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 07.04.2022 в 18:02.
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как исправить ошибку? саша40 Общие вопросы Delphi 5 26.05.2013 20:30
Исправить ошибку,с++ RedFox94 Помощь студентам 0 05.12.2012 23:08
Исправить ошибку CPP VKorablev Помощь студентам 0 20.12.2011 21:42