Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите сделать простую прогу с фибоначчи! 
V
    Опции темы
pljuwevij
Дата 16.9.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



Привет всем... нужно сделать вот такую прогу :
Вводя логически неправильные значения(правильное - любое целое число),программа должна определять это и выдавать сообщение об ошибке cout << "you have input uncorrect symbol",например если ввел не число а букву (char).Должна присутствовать возможность  повторить ввод значения заново ,типо - cout << "DO you want to enter a numbers again?" y/n - да или нет,что бы при вводе да прога позволяла вводить число заново.
дальше,если всё правильно : Дано натуральное число n,найти указанное число фибоначчи,если Числа Фибоначчи определяются по формулам : f(1) = 1,
f(2) = 1, f(n) = f(n-1) + f(n-2) при n = 3,4,5 и т.д

Буду благодарен за помощь и признателен если в коде будут присутствовать комментарии к инструкциям.

П.С: Студент только начавший свое восхождение к горе программирования.
PM MAIL   Вверх
mes
Дата 17.9.2008, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



вот рекурсивная функция для твоей проги, вычисляющая значение числа фибоначчи
Код

int fib (int n)
{
   if (n == 1 || n == 2 )  return 1;
   return fib(n-1)+fib(n-2);
};

остальное пробуй сам smile

Это сообщение отредактировал(а) mes - 17.9.2008, 00:07


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 17.9.2008, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 9
Всего: 14



Цитата(mes @ 17.9.2008,  00:07)
вот рекурсивная функция для твоей проги, вычисляющая значение числа фибоначчи
Код

int fib (int n)
{
   if (n == 1 || n == 2 )  return 1;
   return fib(n-1)+fib(n-2);
};

остальное пробуй сам smile

во-первых при n=0 будет нехорошо
во-вторых надо озадачить препода вот таким креативом

Код

template <unsigned short n>
class Fib
{
public:
    enum: unsigned long long { result = Fib<n-1>::result + Fib<n-2>::result };
};

template <>
class Fib<0>
{
public:
    enum: unsigned long long { result = 0 };
};

template <>
class Fib<1>
{
public:
    enum: unsigned long long { result = 1 };
};


вызывать: Fib<n>::result
n - константа
ну конечно если n берется из первой части задачи, то тогда не покатит

Это сообщение отредактировал(а) J0ker - 17.9.2008, 04:37


--------------------
user posted image
PM MAIL   Вверх
IKM2007
Дата 17.9.2008, 05:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



pljuwevij, написал за две минуты(уже иду в универ), так что... smile 
Код

#include <iostream>
#include <cctype>
using namespace std;
int fib (int n)
{
   if (n == 1 || n == 2 )  return 1;
   return fib(n-1)+fib(n-2);
};
void main()
{
long int n;
char c;
x:
cin>>n;
cout<<isdigit(n)<<endl;
if(!(isdigit(n))&&(n>=0))
cout<<fib(n)<<endl;
else
{
cout << "you have input uncorrect symbol\nDO you want to enter a numbers again?\n y/n\n";
cin>>c;
if(c=='y'||c=='Y')
goto x;
}
}


Это сообщение отредактировал(а) IKM2007 - 17.9.2008, 05:17


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
mes
Дата 17.9.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(J0ker @  17.9.2008,  04:31 Найти цитируемый пост)
во-первых при n=0 будет нехорошо

проверку на 0 и отрицательное не поставил специально,  чтоб не озадачивать лишними строчками ТС. 
вот с проверкой:
Код


int fib (int n)
{
   if (n <= 0) return 0;
   if (n == 1 || n == 2 )  return 1;
   return fib(n-1)+fib(n-2);
};



Это сообщение отредактировал(а) mes - 17.9.2008, 09:42


--------------------
PM MAIL WWW   Вверх
pljuwevij
Дата 18.9.2008, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



Ну вы ребята просто монстры ппц...надеюсь когда-нибудь до росту до такого уровня ,что бы так быстро мыслить и писать.Спасибо,постараюсь разобраться во всём этом,надеюсь получится.
Может кто-нибудь подскажет практичный метод изучения си ++ ? А то в универе только начали,дали срок на эту прогу 3 недели,скачал книгу "C++ without fear" вот изучаю ,там всё оочень просто и хорошо разжёвывается,но быстро забывается,так как нет практической части и легких задачек.
PM MAIL   Вверх
IKM2007
Дата 18.9.2008, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



Цитата(pljuwevij @  18.9.2008,  19:30 Найти цитируемый пост)
Может кто-нибудь подскажет практичный метод изучения си ++ ? А то в универе только начали,дали срок на эту прогу 3 недели,скачал книгу "C++ without fear" вот изучаю ,там всё оочень просто и хорошо разжёвывается,но быстро забывается,так как нет практической части и легких задачек.

Можешь взять книгу "C/C++ в задачах и примерах, Н. Культин". Там как раз легкие задачи.


--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
pljuwevij
Дата 21.9.2008, 02:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



Вот попробовал написать и вот что вышло ,если с рекурсивной функцией.

Код

#include<iostream>
#include<cstdlib>
using namespace std;


int f(int n);


int main()
{
    char ok;
    do
    {
    int n;
    cout << "Vvedite celoje 4islo :\n";
    cin >>n;
    cout << " 4islo fibonacci : " << f(n) << endl;
    cout << "Hotite li ewe raz vvesti 4islo?\n(y/n)" << endl;
    cin >> ok;
}
    while (ok == 'y' || ok == 'Y');
    system ("pause");
    return 0;
}


int f(int n)
{
    if (n < 1)
    {
        cout << "\n Owibka - nepraviljnoje zna4enije 4isla :\n"; 
        system ("pause");
        exit(1); 
    }
    else if (n == 1 || n == 2)
        return 1; 
    else
        return (f(n - 1) + f(n - 2));
}


Всё бы ни чего,даже присутствует возможность повторного ввода  по средствам цикла DO (12 - 20 пункт),но никак немогу сделать так чтобы  этот повтор работал и в том цикле ,где рассматриваются неправильно введенные числа (31 - 33)если ставлю тот же цикл ду еще и там,то он зацикливается.Возможно ли исправить по средством добавления еще одного цикла Do  в нужное место,если да,то в какое?

И еще такой вопрос - можно ли выполнить эту прогу,но без использования рекурсивной ф-ии,что бы  она была как можно проще - ( do while if else) и всё.

СПАСИБО!
PM MAIL   Вверх
mes
Дата 21.9.2008, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(pljuwevij @  21.9.2008,  02:02 Найти цитируемый пост)
но никак немогу сделать так чтобы  этот повтор работал и в том цикле ,где рассматриваются неправильно введенные числа (31 - 33)если ставлю тот же цикл ду еще и там,то он зацикливается.Возможно ли исправить по средством добавления еще одного цикла Do  в нужное место,если да,то в какое?

Из написанного ничего не понял, но мне кажется речь шла о добавлении возможности ввести заново число после ошибочного результата.

Код


int fib(int n);

int main()
{
    char ok;
    do
    {
    int n;
    cout << "Vvedite celoje 4islo :\n";
    cin >>n;

     int  f =fib(n);
    if (f)     cout << " 4islo fibonacci : " << f << endl;
    else     cout << "Owibka - nepraviljnoje zna4enije 4isla :"<< endl;
 
    cout << "Hotite li ewe raz vvesti 4islo?\n(y/n)" << endl;
    cin >> ok;
}
    while (ok == 'y' || ok == 'Y');
    system ("pause");
    return 0;
}
int fib(int n)
{
    if (n < 1) return 0; //  "0" как результат ошибки, так как число фибоначчи никогда  не может быть равно 0.
    else if (n == 1 || n == 2)
        return 1; 
    else
        return (fib(n - 1) + fib(n - 2));
}


Добавлено через 2 минуты и 31 секунду
Цитата(pljuwevij @  21.9.2008,  02:02 Найти цитируемый пост)
И еще такой вопрос - можно ли выполнить эту прогу,но без использования рекурсивной ф-ии,что бы  она была как можно проще - ( do while if else) и всё.

с рекурсией намного проще , иначе придется реализовывать стек для хранения промежуточных результатов.


--------------------
PM MAIL WWW   Вверх
kelario
Дата 21.9.2008, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 19.9.2008

Репутация: нет
Всего: нет



Цитата

И еще такой вопрос - можно ли выполнить эту прогу,но без использования рекурсивной ф-ии,что бы  она была как можно проще - ( do while if else) и всё.


Вроде можно.

Код

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include <math.h>

int main()
{
int fiba1,fiba2,n,z  ;
float t,r;
cin >> n;
fiba1=1;
fiba2=1;
for(r=2;r!=n;r++)
{z=fiba1+fiba2;
t=r/2;
 if ((int)t==r/2) fiba2=z; else fiba1=z; }
cout<<"F"<<n<<"="<<z<<endl;
system("pause");

  return 0;
}

PM MAIL   Вверх
mes
Дата 21.9.2008, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Код


int fib (int n)
{
   if (n<1) return 0;  // результат ошибки

// отсчет начнем с 3го номера 
// если n==1 || n ==2 то перейдет сразу к return
// для этого а также для расчетов внутри цикла, устанавливаем начальные значения
// вспомогательных переменных

    int f1=1;  // предыдущее число
    int f =1;  // текушее число

for (int i=3; i<=n; ++i )
{
     int f0 =f; // запоминаем текущее
     f += f1;   // новое_текущее  = старое_текущее + предыдущее
     f1 = f0;   //  предыдущее = старому (запомненому) текущему
};
return f;

}


Это сообщение отредактировал(а) mes - 21.9.2008, 17:54


--------------------
PM MAIL WWW   Вверх
pljuwevij
Дата 21.9.2008, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



to Mes : Спасибо! Очень наглядно и с комментами,теперь я полностью разобрался!
PM MAIL   Вверх
0xffff
Дата 21.9.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 21.9.2008

Репутация: нет
Всего: нет



Можно и так, но выше показанный пример более прост.
Код

#include<stdio.h>
void main()
{ 
    const int N=40; // от 1 до N
    int* a= new   int[N]; // массив для хранения N-ого числа
    a[0]=1;
    a[1]=1;
    printf("*******start******\n");
    for ( int i=2; i < N;i++)
    {
        a[i]=a[i-2]+a[i-1];        // по формуле 
        printf("%i %d\n",i,a[i] )   ;
    }
    delete[] a;
}

PM MAIL   Вверх
pljuwevij
Дата 24.9.2008, 18:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 16.9.2008

Репутация: нет
Всего: нет



Возникла проблема!!!
Мне нужно было сделать так ,что бы при вводе чисел 1 и 2 ( n ==1 || n == 2) программа выдавала значение = 1 , я вставил цикл с if и else (см. с  14 по 18 пункт) ,но программа все равно выдает чило 2088810051 ,а не значение  = 1.  Как я понимаю это потому что инициализатор r = 2 предполагает расчет функции с числа 2.
Как, особо не изменяя код сделать так ,чтобы при в ведении 1 и 2 программа выдавала = 1 ,а не длинное непонятно откуда взявшееся число?

Код


#include <iostream>
#include <cmath>

using namespace std;

int main()
{
int f1,f2,n,z  ;
double t,r;
cout << " Ludzu ievadiet skaitli :\n";
cin >> n;
f1=1;
f2=1;
if (n<1)
{
cout << " Owibka \n";}
else if (n ==1 || n==2)
cout << "chislo fib : " << f1;
for(r=2;r!=n;r++)
{z=f1+f2;
t=r/2;
 if ((int)t==r/2) f2=z; else f1=z;}
cout<<"Fibonacci skaitlis ir : "<<z<<endl;
system("pause");
return 0;
}

PM MAIL   Вверх
IKM2007
Дата 24.9.2008, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Зима близко
**


Профиль
Группа: Участник
Сообщений: 702
Регистрация: 26.4.2008
Где: olmedreca

Репутация: 3
Всего: 40



pljuwevij, сделай так
Код

if (n<1)
{
cout << " Owibka \n";
return 0;//можно exit(1);
}
else if (n ==1 || n==2)
{
cout << "chislo fib : " << f1<<endl;
return 0;//можно exit(1);
}



--------------------
"К чёрту обстоятельства, я создаю возможности."
Брюс Ли
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0749 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.