IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
Closed Topic Открыть новую тему 
> Вычисление n первых чисел Фибоначчи, Си
Rocket
сообщение 25.09.2007 17:27
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Здравствуйте! Подскажите пожалуйста, как решить на языке Си следующую задачку:

-написать программу вычисления n первых чисел Фибоначчи, использовать цикл for. n задается пользователем.
-написать программу вычисления n первых чисел Фибоначчи, использовать цикл while. n задается пользователем.

Проблема в том,что недавно приступил к изучению сего языка и ещё опыта программирование на Си не имею.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.09.2007 18:04
Сообщение #2


Гость






Цитата
опыта программирование на Си не имею
Опыт программирования вообще имеешь? Знаешь, что такое цикл for? Вся твоя задача сводится к следующему:

Код
предыдущее_число = 1;
текущее число = 1;

для i от 3 до n цикл

  следующее_число = предыдущее_число + текущее число;
  напечатать следующее_число;
  предыдущее_число = текущее_число;
  текущее_число = следующее_число;

конец_цикла
 К началу страницы 
+ Ответить 
Rocket
сообщение 25.09.2007 18:30
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 25.09.2007 19:04) *

Опыт программирования вообще имеешь? Знаешь, что такое цикл for? Вся твоя задача сводится к следующему:

Код
предыдущее_число = 1;
текущее число = 1;

для i от 3 до n цикл

  следующее_число = предыдущее_число + текущее число;
  напечатать следующее_число;
  предыдущее_число = текущее_число;
  текущее_число = следующее_число;

конец_цикла



Да, опыт программирования я имею на паскале. И с циклами я тож знаком. А хотел я лишь узнать как именно на Си эту задачу оформить.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.09.2007 18:39
Сообщение #4


Гость






#include <stdio.h>

int main(void) {
    int first = 1, second = 1, i, n, next;
    printf("enter n:");
    scanf("%d", &n);
    printf("%4d%4d", first, second);
    for(i = 2; i < n; i++) {
        printf("%4d", (next = (first + second)));
        first = second; second = next;
    }
    return 0;
}

через While сам разберешься?

Сообщение отредактировано: volvo - 25.09.2007 18:40
 К началу страницы 
+ Ответить 
Rocket
сообщение 30.09.2007 17:11
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 25.09.2007 19:39) *

#include <stdio.h>

int main(void) {
    int first = 1, second = 1, i, n, next;
    printf("enter n:");
    scanf("%d", &n);
    printf("%4d%4d", first, second);
    for(i = 2; i < n; i++) {
        printf("%4d", (next = (first + second)));
        first = second; second = next;
    }
    return 0;
}

через While сам разберешься?

Большое спасибо за помощь! Ток у меня ещё один небольшой вопрос: как реализовать операцию корень из числа?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.09.2007 17:17
Сообщение #6


Гость






sqrt()
 К началу страницы 
+ Ответить 
Rocket
сообщение 30.09.2007 18:29
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 30.09.2007 18:17) *

sqrt()

Вот программа:

#include <stdio.h>

void main()
{
	int a,b,c,d ;
        float x1,x2;
	printf("Enter a,b,c: ");
	scanf("%d %d %d", &a,&b,&c);
        d=b*b-4*a*c;
	x1=(-b+sqrt(d))/2*a;
	x2=(-b-sqrt(d))/2*a;
	printf("%d %d", x1, x2);
}

для вычисления корней уравнения a*x*x+b*x+c=0. Считая, что при введенных коэффициентах корни обязательно заведомо есть, и они действительные. (не надо проверять a?0 и D>0). компилятор выдает сообщение об ошибке именно в sqrt(). Как исправить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.09.2007 18:37
Сообщение #8


Гость






#include <math.h>

забыл? Описана-то функция именно в этом файле...
 К началу страницы 
+ Ответить 
Rocket
сообщение 30.09.2007 18:49
Сообщение #9


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 30.09.2007 19:37) *

#include <math.h>

забыл? Описана-то функция именно в этом файле...

теперь при выполнение операции sqrt() компилятор выдает надпись "Domain error", х1 и х2 получаются равными 0. В чем теперь косяк?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.09.2007 18:51
Сообщение #10


Гость






Знаешь что, я не телепат... Нужна помощь - приводи данные, которые вводил... Не нужна - разбирайся сам...

Кстати,
Цитата
(не надо проверять a?0 и D>0)
Очень опасное заблуждение - оно тебе и мешает сейчас...
 К началу страницы 
+ Ответить 
Rocket
сообщение 30.09.2007 19:04
Сообщение #11


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 30.09.2007 19:51) *


Кстати, Очень опасное заблуждение - оно тебе и мешает сейчас...

да так в условие задачи...сам-то хочу привести к более правильному с математической точки зрения виду.
Про DoMain error понял: отрицательный дискриминант был. но вот теперь ввожу я а=1, б=2, с=1. В ответе получаю опять 0. Почему? и как описать проверку условий на а и дискреминант?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.09.2007 20:20
Сообщение #12


Гость






Цитата
В ответе получаю опять 0. Почему?
Потому что для вещественных есть спецификатор %f, а не %d...

Вот так делается проверка условий:

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

int main()
{
	int a,b,c,d ;
        float x1,x2;

	printf("Enter a,b,c: ");
	scanf("%d %d %d", &a,&b,&c);
        d=b*b-4*a*c;
        if(a) {
            if(d >= 0) {
                x1=(-b+sqrt(d))/2*a;
                x2=(-b-sqrt(d))/2*a;
                printf("%f %f", x1, x2);
            }
            else printf("d < 0");
        }
        else printf("a = 0 (divizion by zero)")

        return 0;
}
 К началу страницы 
+ Ответить 
Rocket
сообщение 30.09.2007 20:44
Сообщение #13


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


ещё раз большое спасибо))
И,пожалуй, последний на сегодня вопрос: как реализовать в программе счетчик дейсвия стрелок вверх/вниз/влево/вправо? То есть при нажатие вверх/вниз увеличивалась/уменьшалась переменная у, а при нажатие влево/вправо увеличивалась/уменьшалась переменная х.

Сообщение отредактировано: volvo - 14.01.2009 10:07
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.09.2007 22:16
Сообщение #14


Гость






Это зависит от того, куда тебе надо это вклинить (кстати, каким компилятором ты пользуешься?)

Ты хочешь сделать управление движением курсора по экрану?
 К началу страницы 
+ Ответить 
Rocket
сообщение 30.09.2007 22:23
Сообщение #15


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 30.09.2007 23:16) *

Это зависит от того, куда тебе надо это вклинить (кстати, каким компилятором ты пользуешься?)

Ты хочешь сделать управление движением курсора по экрану?

Я пользуюсь скорее всего стандартным компилятором turbo C.
Я задача в общем формулируется так:
"Написать программу управления состоянием двух координат X и Y. Управление производится клавишами курсора. Необходимо менять значения этих переменных в соответствии с нажатой клавишей - влево/вправо - уменьшать/увеличивать значение X, вверх/вниз - уменьшать/увеличивать значение Y. Состояние X и Y выводить на экран при каждом нажатии клавиши в виде - X,Y. Если X и Y равны 0, то добавочно выводить сообщение 'Центр'. Выход из программы – по нажатию клавиши ESC."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 30.09.2007 22:54
Сообщение #16


Гость






Вот так:
#include <stdio.h>
#include <conio.h>

int main() {

  const int max_x = 80;
  const int max_y = 25;
  int ch;

  do {
    if((ch = getch()) == 0)
      switch(getch()) {
        case 72:
          if(wherey() > 1) gotoxy(wherex(), wherey() - 1);
          break;
        case 80:
          if(wherey() < max_y) gotoxy(wherex(), wherey() + 1);
          break;
        case 75:
          if(wherex() > 1) gotoxy(wherex() - 1, wherey());
          break;
        case 77:
          if(wherex() < max_x) gotoxy(wherex() + 1, wherey());
          break;
      }

  } while(ch != 27);

  return 0;
}

?

Запускай и управляй координатами курсора...
 К началу страницы 
+ Ответить 
Rocket
сообщение 1.10.2007 19:21
Сообщение #17


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


А как реализовать более менее приличный вывод сообщения о координатах ХУ и ЦЕНТРЕ?

Сообщение отредактировано: volvo - 14.01.2009 10:06
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 1.10.2007 19:39
Сообщение #18


Гость






Ну, печатай в самом начале цикла do... Откуда же я знаю, КАК ИМЕННО тебе надо это вывести, в какой позиции, каким цветом? Это в конце концов ТВОЕ задание, так будь добр хоть что-то сделать сам!

(вот только не надо ничего говорить о том, что ты не знаешь С... Программа на Паскале будет выглядеть почти буква в букву).

Добавлено через 1 мин.
P.S. Кстати, что за привычка делать из темы свалку? Это задание что, как-то связано с Фибоначчи? dry.gif
 К началу страницы 
+ Ответить 
Rocket
сообщение 14.10.2007 20:37
Сообщение #19


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Вот код программы:

#include <stdio.h>
#include <conio.h>

int main()
{
 int ch,x=0,y=0;

while (ch !=27)
  {  ch = getch();
      switch(ch)
  {    case 72:
	y++;
	 break;
       case 80:
	y--;
	 break;
       case 75:
	x--;
	 break;
       case 77:
	x++;
	 break;
  }

  clrscr;
  printf("%d %d\n",x,y);
  if (x==0 && y==0) printf ("Centr\n");   }

}

почему происходит вывод предыдущих координат?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 15.10.2007 21:41
Сообщение #20


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Rocket, одна задача - одна тема.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 18.07.2025 20:58
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"