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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.12.2009, 19:11   #1
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию С (Си) - корень 4-я методами

Всем добрый вечер.
Я опять, застрял. Задание: найти корень 4-я методами и посчитать кол-во шагов (не обязательно).
Вот теория: http://elib.ispu.ru/library/math/sem...v1/node79.html

Задание - выбрать 1 метод из 4-х. Начал с выбора, и застрял... Воюю уже час, никак.

код:
Код:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
int i, a=0, b=0.85, eps=0.00005;
float n, x, d, f1, f2, f3, f4;
printf ("Programa dl9 znahodzhenn9 koren9 rivn9nn9 4-ma metodami\n");
printf ("Metod 1: metod polovinnogo dilenn9\n");
printf ("Metod 2: metod hord\n");
printf ("Metod 3: metod doti4nih (metod Newton'a\n");
printf ("Metod 4: metod poslidovnih nablizhen'\n");
for (;;)
     {
     printf ("Viberite metod\n");
     for (n=0; n++)
     {
     scanf ("%d", &n);
          if (n=1) f1();
     else if (n=2) f2();
     else if (n=3) f3();
     else if (n=4) f4();
     if (n=0); break;
     else continue;
     }
     }
     }

getchar ();
return 0;
}
Выдает ошибку. хотя она там не одна. Надо, чтоб выюираешь 1 - метод 1, 2 - метод 2... 0 - выход, другое - повтор на "введите". f1, f2, f3, f4 - это методы. Должно подсчитать. Сами методы есть, можно частитчно содрать, но как кинуть куда надо....

Еще: как указать , что если f1, то .... (пример, решение, метод....)?

Всем спасибо кто откликнется
MR_Andrew вне форума Ответить с цитированием
Старый 05.12.2009, 19:53   #2
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
По умолчанию

Делай выбор через
Код:
switch(переменная содержащая число от 1 до 4, которое вводит пользователь)
{
case 1: делать первым способом;
break;
....
case 4: Делать четвёртым;
break;
}

Последний раз редактировалось nec117; 05.12.2009 в 19:57.
nec117 вне форума Ответить с цитированием
Старый 05.12.2009, 19:57   #3
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

nec117
да препод сказал, что лучше через Иф... Ну попробую, и на этом спасибо.
Хотя если у кого-то есть идея как заставить через Иф, то прошу помочь

П.С. А общий цыкл правильно? Это мне такое написали: for (;
MR_Andrew вне форума Ответить с цитированием
Старый 05.12.2009, 20:00   #4
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
По умолчанию

ну объявлен правильно, только он пустой. И я не совсем понимаю зачем он там нужен. Всегда выбор в такого рода меню делается через switch. Это быстро и удобно. Рекомендую каждый вариант нахождения корня описать в отдельной функции и в счётчике свич просто вызывать их.
nec117 вне форума Ответить с цитированием
Старый 05.12.2009, 20:01   #5
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

nec117
Да, еще. Брейк - понятно. А в кейз как выбрать, что если что-то не то (5 например), то оно должно кинуть в "Введите", и так до тех пор, пока не введут то, что надо (0-4)?
MR_Andrew вне форума Ответить с цитированием
Старый 05.12.2009, 20:03   #6
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
По умолчанию

да. Просто пишешь принтф и сканф перед свичем, если не совпадт ни с одним то запросит ещё раз ввести.
nec117 вне форума Ответить с цитированием
Старый 05.12.2009, 20:04   #7
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

Цитата:
Сообщение от nec117 Посмотреть сообщение
Рекомендую каждый вариант нахождения корня описать в отдельной функции и в счётчике свич просто вызывать их.
Так, так.. Как я понял - case 1: f1; ?
А потом как указать вариант? If f1 {решение + вывод на экран} ?

Цитата:
Сообщение от nec117 Посмотреть сообщение
да. Просто пишешь принтф и сканф перед свичем, если не совпадт ни с одним то запросит ещё раз ввести.
С этим ясно, спасибо

Последний раз редактировалось Sazary; 06.12.2009 в 23:58.
MR_Andrew вне форума Ответить с цитированием
Старый 05.12.2009, 20:11   #8
nec117
Форумчанин
 
Регистрация: 01.10.2008
Сообщений: 266
По умолчанию

не не f1-Это переменная, а тебе нужна функция, описываешь их например:
Код:
void variant_one(параметры функции)
{
тело функции - сама работа первого варианта
}
и по аналогии пишешь функции для всех 4, потом вызываешь
case 1: variant_one(тут указываешь входные данные);

Последний раз редактировалось nec117; 05.12.2009 в 20:19.
nec117 вне форума Ответить с цитированием
Старый 05.12.2009, 20:21   #9
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

Цитата:
Сообщение от nec117 Посмотреть сообщение
не не f1-Это переменная, а тебе нужна функция, описываешь их например:
Код:
void variant_one(параметры функции)
{
тело функции - сама работа первого варианта
}
и по аналогии пишешь функции для всех 4, потом вызываешь
case 1: variant_one(тут указываешь входные данные);
void не учили... Но как применять понял. Итак, приступаю править.
Далеко не уходите, пожалуйста
MR_Andrew вне форума Ответить с цитированием
Старый 05.12.2009, 22:04   #10
MR_Andrew
Форумчанин
 
Регистрация: 05.10.2009
Сообщений: 100
По умолчанию

Такс, 90% передрали, еще немного...

программа:
Код:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
int  n, k, a=0, b=0.85, eps=0.00005;
float  x, d, u, q, w, x0, x1, x2;

printf ("Programa dl9 znahodzhenn9 koren9 rivn9nn9 4-ma metodami\n");
printf ("Metod 1: metod polovinnogo dilenn9\n");
printf ("Metod 2: metod hord\n");
printf ("Metod 3: metod doti4nih (metod Newton'a\n");
printf ("Metod 4: metod poslidovnih nablizhen'\n");

for (;;)

//---------------------------------------------------------------------------
	       void f1()
	       {
		 q=a;
                 w=b;
		 k=0;
                 do
               {
                 x=(q+w)/2;
		 u=x-(1/(3+sin(3.6*x)));
		 if(x-(1/(3+sin(3.6*x)))*u<0)
                 w=x;
                 else  q=x;
		 k=k+1;
                 d=fabs(w-q);
               }
		while(d>eps);
		printf("korin'=%f\n",x);
		printf("k=%i",k);
	       }

//---------------------------------------------------------------------------

	       void f2()
	       {
   		x0=a;
  		x1=b;
  		k=0;
  		do
   	       {
x2=x1-(x1-(1/(3+sin(3.6*x1))*(x1-x0)/(x1-(1/(3+sin(3.6*x1)))-(x0-(1/(3+sin(3.6*x0)));
                d=fabs(x0-x1);
                if(d>eps)
               {
                x0=x1;
                x1=x2;
               }
                k=k+1;
               }
                while(d>eps);
                printf("korin'=%f\n",x2);
                printf("k=%i",k);
	       }

//---------------------------------------------------------------------------

	  void f3()
	 {
	  k=0;
	  x1=(a+b)/2;
	  do
	 {
	  k=k+1;
	  x2=x1-(x1-(1/(3+sin(3.6*x1)))/(1+(cos(3.6*x1))/((3+sin(3.6*x1)^2)));
	  d=fabs(x2-x1);
	  if(d>eps)
	  x1=x2;
	 }
	  while(d>eps);
	  printf("korin'=%f\n",x2);
	  printf("k=%i",k);
	 }

//---------------------------------------------------------------------------

	       void f4()
              {
               k=0;
               x0=(a+b)/2;
               do
              {
               x1=x0-(1/(3+sin(3.6*x0));
               k=k+1;
               d=fabs(x1-x0);
               x0=x1;
              }
               while(d>eps);
               printf("korin'=%f\n",x1);
               printf("k=%i\n",k);

//---------------------------------------------------------------------------

     printf ("Viberite metod\n");
     {
     scanf ("%d", &n);
     switch(n);
     {
     case 1: f1();
     break;
     case 2: f2();
     break;
     case 3: f3();
     break;
     case 4: f4();
     break;
     case 0: break;


     }
     }
     }
getchar();
return 0;
}
Выдает 1-у ошибку (было 18 ). Что-то не правильно указано.
И еще: кадется метод 1 (половинного деления) не правильно. Тут описание: http://www.pm298.ru/pribl.php
а у меня немного не так.
Прошу помочь, а то сейчас засну тут уже...
MR_Andrew вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание MediaPlayer методами DirectShow AlexFAst Мультимедиа в Delphi 1 29.09.2009 01:16
Работа со строками и методами в Java PavelZet Помощь студентам 1 02.06.2009 05:36
Пишу *.dll помогите с методами mdbm Общие вопросы Delphi 11 28.05.2008 14:19
Автоматизация обработки изображений и их оцифровки методами делфи helpme32 Мультимедиа в Delphi 1 14.12.2007 13:03