Помощь - Поиск - Пользователи - Календарь
Полная версия: Вычисление n первых чисел Фибоначчи
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Rocket
Здравствуйте! Подскажите пожалуйста, как решить на языке Си следующую задачку:

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

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

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

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

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

конец_цикла
Rocket
Цитата(volvo @ 25.09.2007 19:04) *

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

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

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

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

конец_цикла



Да, опыт программирования я имею на паскале. И с циклами я тож знаком. А хотел я лишь узнать как именно на Си эту задачу оформить.
volvo
#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
Цитата(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
sqrt()
Rocket
Цитата(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
#include <math.h>

забыл? Описана-то функция именно в этом файле...
Rocket
Цитата(volvo @ 30.09.2007 19:37) *

#include <math.h>

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

теперь при выполнение операции sqrt() компилятор выдает надпись "Domain error", х1 и х2 получаются равными 0. В чем теперь косяк?
volvo
Знаешь что, я не телепат... Нужна помощь - приводи данные, которые вводил... Не нужна - разбирайся сам...

Кстати,
Цитата
(не надо проверять a?0 и D>0)
Очень опасное заблуждение - оно тебе и мешает сейчас...
Rocket
Цитата(volvo @ 30.09.2007 19:51) *


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

да так в условие задачи...сам-то хочу привести к более правильному с математической точки зрения виду.
Про DoMain error понял: отрицательный дискриминант был. но вот теперь ввожу я а=1, б=2, с=1. В ответе получаю опять 0. Почему? и как описать проверку условий на а и дискреминант?
volvo
Цитата
В ответе получаю опять 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
ещё раз большое спасибо))
И,пожалуй, последний на сегодня вопрос: как реализовать в программе счетчик дейсвия стрелок вверх/вниз/влево/вправо? То есть при нажатие вверх/вниз увеличивалась/уменьшалась переменная у, а при нажатие влево/вправо увеличивалась/уменьшалась переменная х.
volvo
Это зависит от того, куда тебе надо это вклинить (кстати, каким компилятором ты пользуешься?)

Ты хочешь сделать управление движением курсора по экрану?
Rocket
Цитата(volvo @ 30.09.2007 23:16) *

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

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

Я пользуюсь скорее всего стандартным компилятором turbo C.
Я задача в общем формулируется так:
"Написать программу управления состоянием двух координат X и Y. Управление производится клавишами курсора. Необходимо менять значения этих переменных в соответствии с нажатой клавишей - влево/вправо - уменьшать/увеличивать значение X, вверх/вниз - уменьшать/увеличивать значение Y. Состояние X и Y выводить на экран при каждом нажатии клавиши в виде - X,Y. Если X и Y равны 0, то добавочно выводить сообщение 'Центр'. Выход из программы – по нажатию клавиши ESC."
volvo
Вот так:
#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
А как реализовать более менее приличный вывод сообщения о координатах ХУ и ЦЕНТРЕ?
volvo
Ну, печатай в самом начале цикла do... Откуда же я знаю, КАК ИМЕННО тебе надо это вывести, в какой позиции, каким цветом? Это в конце концов ТВОЕ задание, так будь добр хоть что-то сделать сам!

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

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

#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
Rocket, одна задача - одна тема.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.