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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.01.2019, 22:39   #1
BigChungus
 
Регистрация: 27.01.2019
Сообщений: 3
Сообщение Указатели на функции(C/С++)

Код:
#include "pch.h"
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>

unsigned int K(int number), V(int number), L(int number);
int menu(void);

unsigned int(*PointFunc[]) (int number) = {
K,
V,
L,
};


int main(void)
{
	int i, num = 0, zuck;
	i = menu(); /* получение выбора пользователя */
	printf("Enter the number.");
	num = _getche();
	zuck = (*PointFunc[i])(num);/* выполнение */
	printf("%d", zuck);
	return 0;
}

int menu(void)
{
	int ch;
	do
	{
		printf("Choose series you need:\n");
		printf("1. 1+2+3 series\n2. 1+3 series\n3. Fibonacci series\n");
		printf("Select a number: ");
		ch = _getche();
		printf("\n");
	} while (!strchr("1234", ch));
	
	return ch - 49; /* преобразование к целочисленному эквиваленту */
}

unsigned int K(int number)//123
{
	if (number == 1 || number == 2 || number == 3)

		return 1;

	return K(number - 1) + K(number - 2) + K(number - 3);
}

unsigned int V(int number)//13
{
	if (number == 1 || number == 2 || number == 3)

		return 1;

	return V(number - 1) + V(number - 3);
}

unsigned int L(int number)//Fibonacci
{

	if (number == 1 || number == 2)

		return 1;

	return L(number - 1) + L(number - 2);

}
Вообщем, задача довольно простая:
1) Есть 3 функции, они вычисляют элемент из определенного ряда. (3-й ряд - ряд Фибоначчи, 2 остальные сделаны по его подобию.)
2) Какую функцию использовать, необходимо выбрать с помощью указателей на функцию. (В оригинале задача состоит в том, что бы убрать из main(); оператор switch/case.)

Теперь ошибки:
Программа работает ровно до момента считывания номера числа из ряда. Понимаю, что проблема моя только в том, что я не знаю теории, но перерыв весь мне доступный интернет, я не нашел ответов, если у вас есть время кинуть ссылку на хорошую статью, где я бы мог понять свою ошибку, буду благодарен, если уделите время написав сообщение об ошибке именно в этом коде, я буду счастлив.
BigChungus вне форума Ответить с цитированием
Старый 28.01.2019, 02:43   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Код:
num = _getche();
Так числа не вводят. Поставьте хотя бы
Код:
  scanf("%d", &num);
Black Fregat вне форума Ответить с цитированием
Старый 28.01.2019, 10:43   #3
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Цитата:
Сообщение от BigChungus Посмотреть сообщение
return ch - 49; /* преобразование к целочисленному эквиваленту */
- вот ошибка. Нужно 48 вычитать(а не 49) для преобразования кода числа к самому числу. Сами посмотрите таблицу ASCII.
Что-то числа Фибоначчи как-то неправильно здесь считаются. Не так они считаются по-моему. Правильно?

Последний раз редактировалось Cuprum5; 28.01.2019 в 10:49. Причина: Добавил фразу.
Cuprum5 вне форума Ответить с цитированием
Старый 28.01.2019, 10:50   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от Black Fregat Посмотреть сообщение
Так числа не вводят.
Если потом код отнять, то норм. Другое дело, что надо чар использовать, инт может вызвать интересные эффекты.

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
- вот ошибка. Нужно 48 вычитать(а не 49) для преобразования кода числа к самому числу.
Нет тут ошибки. Сами посмотрите таблицу и код. ТС вводит номер пункта от 1, а массив нумеруется с 0. Отнятием кода "1" это решается.
p51x вне форума Ответить с цитированием
Старый 28.01.2019, 11:51   #5
BigChungus
 
Регистрация: 27.01.2019
Сообщений: 3
Радость Проблема решена

Спасибо всем за то что откликнулись, проблема заключалась правда в использовании _getche для переменной zuck в функции main(), заменив на cin (думаю с scanf_s заработает так же) все заработало.

Код:
#include "pch.h"
#include <iostream>

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
using namespace std;
unsigned int K(int number), V(int number), L(int number);
int menu(void);

unsigned int(*PointFunc[]) (int number) = {
K,
V,
L,
};


int main(void)
{
	int i, num = 0, zuck;
	i = menu(); /* получение выбора пользователя */
	printf("Enter the number and press enter: ");
	cin >> num;
	printf("\n");
	zuck = (*PointFunc[i])(num);/* выполнение */
	printf("%d\n\n", zuck);
	return 0;
}

int menu(void)
{
	char ch;
	do
	{
		printf("Choose series you need:\n");
		printf("1. 1+2+3 series\n2. 1+3 series\n3. Fibonacci series\n");
		printf("Select a number: ");
		ch = _getche();
		printf("\n");
	} while (!strchr("123", ch));
	
	return ch - 49; /* преобразование к целочисленному эквиваленту */
}

unsigned int K(int number)//123
{
	if (number == 1 || number == 2 || number == 3)

		return 1;

	return K(number - 1) + K(number - 2) + K(number - 3);
}

unsigned int V(int number)//13
{
	if (number == 1 || number == 2 || number == 3)

		return 1;

	return V(number - 1) + V(number - 3);
}

unsigned int L(int number)//Fibonacci
{

	if (number == 1 || number == 2)

		return 1;

	return L(number - 1) + L(number - 2);

}
Работающий код, для тех, кто может быть когда-нибудь столкнется с такой проблемой.
BigChungus вне форума Ответить с цитированием
Старый 28.01.2019, 12:15   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 729
По умолчанию

Так а что с числами Фибоначчи? У меня не работает. Да и числа Фибоначчи не так считаются.
Cuprum5 вне форума Ответить с цитированием
Старый 28.01.2019, 20:13   #7
BigChungus
 
Регистрация: 27.01.2019
Сообщений: 3
Печаль

Да нет, все работает. Возможно вы считаете, что ряд Фибоначчи начинается с 0, 1, но как я знаю вариант с 1, 1 в начале так же является правильным.
Только что проверил проверил программу и на 6 число в последовательности выдает 8, а на 7 число последовательности выдает 13, все работает как часы.
На всякий случай напишу как работает рекурсия:
На число 1 и 2, то есть на 1-ое и 2-ое число последовательности, машина выдает 1, как уже говорил из-за того, что я взял 1, 1, ... как начало ряда, можно поменять
Код:
 if (number == 1 || number == 2)
на 2 условия в виде

Код:
if (number == 1)
    return 0;
if (number == 2)
    return 1;
Смысл то один и тот же, просто число на 1++ сдвигается.

Честно не понимаю, где у вас не работает.
Напомню, что ряд Фибоначчи это 3 программа (2 остальные это ряд имени меня любимого,построенные для тренировки рекурсивных функций), значит нужно сначала выбрать 3, потом вести номер последовательности.

Последний раз редактировалось BigChungus; 28.01.2019 в 20:50. Причина: Дописал.
BigChungus вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Функции и указатели (СИ) ЕвгенийАйтишник Помощь студентам 0 26.06.2012 17:39
функции и указатели на C++ IcE^BeaR Помощь студентам 4 04.06.2012 18:45
Указатели на функции (си) Miles Помощь студентам 3 08.01.2012 23:30
Указатели на функции profi Общие вопросы C/C++ 20 12.07.2010 14:11
указатели на функции MeGaTpoH Общие вопросы C/C++ 2 18.06.2009 16:27