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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.08.2009, 21:32   #1
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию Вывод C

Возникла проблема с выводом значений переменных в С, я только сегодня решил научиться на нем кодить, собственно и пошли проблемы, я сижу сейчас под Linux, но в данном коде это не важно и он на Windows будет работать. Вообщем решил написать прогу, которая решит квадратное уравнение, вроде решает нормально, но вместо ответа выдает ноли, с типами вроде не напутал, вот код:

Код:
#include <stdio.h>
#include <stdlib.h>

unsigned sqrt_(long l)
{     unsigned div = 1, rslt = 0;
      while (l > 0)
      {
            l -=  div, div += 2;
            rslt  += l < 0 ? 0 : 1;
      }
      return rslt;
}

int main(int a, int b, int c, int d, float x, float y)
{
 printf ("Добро пожаловать в Kvadrick 1.0, введите аргументы: \n Значение a= ");

scanf("%d", &a);

printf (" Значение b= ");
scanf("%d", &b);

printf (" Значение c= ");
scanf("%d", &c);

printf ("Уравнение для решения:\n %dx^2+%dx+%d=0\n",a,b,c);

  d=b*b-4*a*c;
printf (" D=%d×%d-4×%d×%d=%d\n",b,b,a,c,d);  
printf ("Дискриминант равен: %d\n",d);

  if (d>0)
  {
    d=sqrt_(d);
    x=(-b+d)/(2*a);
    y=(-b-d)/(2*a);

printf (" x1=(%d+%d)/(2×%d)=%f\n",-b,d,a,x);
printf (" x2=(%d-%d)/(2×%d)=%f\n",-b,d,a,y);
printf ("Ответ: x1=%f, x2=%f\n",x,y);
  }

  if (d=0)
  {
    x=-b/(2*a);
    printf (" x=-%d:(2×%d)=%f\n",-b,a,x);
printf ("Ответ: x1=%f\n",x);
  }

if (d<0) {
printf ("Ответ: корней нет.\n");
}

  exit(0);
}
heart вне форума Ответить с цитированием
Старый 16.08.2009, 21:44   #2
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,619
По умолчанию

Охщит, так пару замечаний на будущее и не только.
Операторы разделяются точкой с запятой, поэтому я не знаю, как у вас скомпилилось вот это
Код:
l -=  div, div += 2;
Пишите
Код:
l -=  div;
 div += 2;
Потом, в функцию main не нужно ничего передавать, если это не командная строка.
Оно скомпилится и так, ну лучше так не писать
Код:
int main(int a, int b, int c, int d, float x, float y)
заменяем на
Код:
int main()
{
   int a, b, c, d;
   float x, y;
Проверка на равенство производится при помощи знака "==" а не "=", тут вам не паскаль
поэтому
Код:
if (d=0)
заменяем на
Код:
if (d==0)
И все заработает. У меня показал ответ -8 при а = 1, b = 2, с = 3.
MaTBeu вне форума Ответить с цитированием
Старый 16.08.2009, 21:55   #3
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,520
По умолчанию

И еще эти выражения:
x=(-b+d)/(2*a);
y=(-b-d)/(2*a);
x=-b/(2*a);
если я ничего не путаю, будут всегда возвращать целое. Если я прав, то нужно будет явно к float приводить посредством (float)
pu4koff вне форума Ответить с цитированием
Старый 16.08.2009, 22:05   #4
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию

Цитата:
Сообщение от MaTBeu Посмотреть сообщение
Охщит, так пару замечаний на будущее и не только.
Операторы разделяются точкой с запятой, поэтому я не знаю, как у вас скомпилилось вот это
Это не помогло, -8 это дискриминант, а не ответ, при a=23,b=34,c=12 посмотрите.



Цитата:
Сообщение от pu4koff
И еще эти выражения:
x=(-b+d)/(2*a);
y=(-b-d)/(2*a);
x=-b/(2*a);
если я ничего не путаю, будут всегда возвращать целое. Если я прав, то нужно будет явно к float приводить посредством (float)
А как? и зачем ведь у меня x,y - типа float
heart вне форума Ответить с цитированием
Старый 16.08.2009, 22:12   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от heart
А как? и зачем ведь у меня x,y - типа float
Зато a,b,c и d - типа int. Получается деление int/int и ответ - int. Только после этого он приводится к float.
Исправьте
Код:
x=(float)(-b+d)/(2*a);
y=(float)(-b-d)/(2*a);
и вот это:
Код:
x=-(float)b/(2*a);
и все будет работать.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 16.08.2009, 22:18   #6
heart
Пользователь
 
Регистрация: 17.12.2008
Сообщений: 64
По умолчанию

Спасибо всем кто помагал, очень помогли)))
heart вне форума Ответить с цитированием
Старый 17.08.2009, 11:29   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,336
По умолчанию

2MaTBeu
Цитата:
Операторы разделяются точкой с запятой, поэтому я не знаю, как у вас скомпилилось вот это
l -= div, div += 2;
в языках С/С++ есть оператор 'запятая', поэтому и скомпилилось
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ввод и вывод Mihael-Vlz Паскаль, Turbo Pascal, PascalABC.NET 3 19.01.2009 18:00
Вывод сортировки MaXiS Общие вопросы Delphi 5 19.05.2008 08:48
Вывод числа lenivec Общие вопросы Delphi 3 10.02.2008 22:45
Рандомный вывод Forrest Gamp Общие вопросы C/C++ 6 10.02.2008 15:03