Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Вычисление n первых чисел Фибоначчи

Автор: Rocket 25.09.2007 21:27

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

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

Проблема в том,что недавно приступил к изучению сего языка и ещё опыта программирование на Си не имею.

Автор: volvo 25.09.2007 22:04

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

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

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

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

конец_цикла

Автор: Rocket 25.09.2007 22:30

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

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

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

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

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

конец_цикла



Да, опыт программирования я имею на паскале. И с циклами я тож знаком. А хотел я лишь узнать как именно на Си эту задачу оформить.

Автор: volvo 25.09.2007 22: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 сам разберешься?

Автор: Rocket 30.09.2007 21:11

Цитата(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 сам разберешься?

Большое спасибо за помощь! Ток у меня ещё один небольшой вопрос: как реализовать операцию корень из числа?

Автор: volvo 30.09.2007 21:17

sqrt()

Автор: Rocket 30.09.2007 22:29

Цитата(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(). Как исправить?

Автор: volvo 30.09.2007 22:37

#include <math.h>

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

Автор: Rocket 30.09.2007 22:49

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

#include <math.h>

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

теперь при выполнение операции sqrt() компилятор выдает надпись "Domain error", х1 и х2 получаются равными 0. В чем теперь косяк?

Автор: volvo 30.09.2007 22:51

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

Кстати,

Цитата
(не надо проверять a?0 и D>0)
Очень опасное заблуждение - оно тебе и мешает сейчас...

Автор: Rocket 30.09.2007 23:04

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


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

да так в условие задачи...сам-то хочу привести к более правильному с математической точки зрения виду.
Про DoMain error понял: отрицательный дискриминант был. но вот теперь ввожу я а=1, б=2, с=1. В ответе получаю опять 0. Почему? и как описать проверку условий на а и дискреминант?

Автор: volvo 1.10.2007 0:20

Цитата
В ответе получаю опять 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 1.10.2007 0:44

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

Автор: volvo 1.10.2007 2:16

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

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

Автор: Rocket 1.10.2007 2:23

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

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

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

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

Автор: volvo 1.10.2007 2:54

Вот так:

#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 23:21

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

Автор: volvo 1.10.2007 23:39

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

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

Добавлено через 1 мин.
P.S. Кстати, что за привычка делать из темы свалку? Это задание что, как-то связано с Фибоначчи? dry.gif

Автор: Rocket 15.10.2007 0:37

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


#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"); }

}

почему происходит вывод предыдущих координат?

Автор: klem4 16.10.2007 1:41

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