• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Два вопроса по С++ Builder 6

walthermil

Новые
Регистрация
25 Мар 2010
Сообщения
60
Реакции
0
Баллы
0
Два вопроса по С++ Builder 6

Здравствуйте!!!
Пишу программу на С++ Builder 6? и возникло 2 проблемы...

№1 Не могу найти функцию округления чисел. Мне нужно округлить число формата "float" до одного знака после запятой. Читал форумы, но чего-то конкретного и общепризнанного не нашел...

№2 Есть два массива чисел(одинаковых по размеру). Нужно построить график по точкам, образованным пересечением чисел из массивов(пересечение первых чисел из массивов - это первая точка, вторых - вторая, и так далее). Есть ли какая-нибудь функция позволяющая это реализовать... Пытался инструментом "Chart" из вкладки "Additional", но что-то так и не получилось...

Подскажите пожалуйста...заранее благодарен!!!
 
Давайте уточним: вам нужно округлить float и продолжить вычисления, или вам нужно округлить и вывести результат в виде текста?

Далее, давайте без загадочного термина "пересечение двух массивов". Опишите проще - у вас в одном массиве X, в другом - Y?
 
Нужно округлить "float" в первую очередь для дальнейших вычислений, но вывод на экран тоже будет, кстати эти округленные значения и будут в одном из массивов. У меня в качестве округляемого параметра время в часах, просто не очень разумно, если будет выводиться например 3.433245 часа))))), поэтому хочу округлить до одного знака после запятой.
А по поводу массивов, совершенно верно, в одном массиве значения по оси X, а в другом значения по оси Y, как уже писал выше, количество значений в каждом массиве одинаково.
 
Округление значений во время вычислений приводит к возникновению погрешности.
Получить строку, состоящую из округленного значения можно так:
Код:
char buf[16];
float val;
sprintf(buf,"%.1f",val);

Для рисования используйте поле canvas вашей формы:
Код:
Form1.Canvas.MoveTo()
Form1.Canvas.LineTo()
 
Последнее редактирование:
Извиняюсь за назойливость, просто я начинающий в программировании...
Как я понял, моё округленное число записалось в массив "buf", в первые ячейки массива...
как теперь можно заменить, в приведенном Вами примере, значение переменной "val" на округленное значение, находящееся в массиве...? там же символы в формате "char"...
 
Извиняюсь за назойливость, просто я начинающий в программировании...
Как я понял, моё округленное число записалось в массив "buf", в первые ячейки массива...
как теперь можно заменить, в приведенном Вами примере, значение переменной "val" на округленное значение, находящееся в массиве...? там же символы в формате "char"...

В этом массиве находится текстовое представление числа, но преобразовывать число в текст, а затем снова в число не рационально.
Округление осуществляется с помощью функций ceil (потолок) и floor (пол).
Но это округление заключается в простом отбрасывании дробной доли числа.
Чтобы округлять на один знак после запятой, нужно домножить на 10 (все "нужные" знаки передвинуться в целую часть), после этого округлить, а затем задвинуть знаки обратно в дробную часть - разделить на 10.
Код:
k=floor(k*10)/10;

Еще раз должен предупредить, что это приводит к дополнительной погрешности - все округления должны происходить при выводе результатов.
 
Да да, именно так я и пробовал прежде чем в форум написать... в консольном режиме все работает точно...
А вот когда я пытаюсь вывести в текстовое поле формы, уже якобы округленное значение, у меня опять появляются числа после запятой.... даже не знаю почему так происходит пробовал и ceil и floor и умножал на 10, 100,1000 до миллиона...но к примеру округляя число 2,71428561210632, умножая его на десять, затем округляя через floor и разделив опять на 10 получается число 2,70000004768372, а та же операция только используя не 10 а 100 уже получается 2,71000003814697, а с 1000 уже 2,71399998664856, даже не видно закономерности после тысячи...как будто за разряд выходит....

А по поводу погрешностей это ничего страшного, в данной задаче эта погрешность не имеет значения, а вот если до целых округлять, то уже имела бы...
 
Последнее редактирование:
Проблема в том, что вы поступаете не совсем верно, округляя значение в процессе вычислений. А также в особенности представления чисел с плавающей запятой.
Именно: ПК не может записать во float значение 27000.0, поэтому, выбирает ближайшее. Подробное объяснение - лекция на час.

Решение: Используйте целочисленное значение, домножив его на 10. И помня, что у вас не 270005, а 27000.5
 
Хорошо, попробую так... спасибо...
 
Еще раз Вас побеспокою...
Я покопался в С++ Builder, и насколько я понял функции "canvas" в нем нет...
Она вроде бы в Delphi только есть....
Или я ошибаюсь...? Подскажите пожалуйста..
 
Беру свои слова обратно))) нашел все....))
 
Еще раз Добрый день!!! У меня возник еще один вопрос...
В одной из форм программы я создал массив, и заполнил его значениями...
Теперь мне нужно использовать этот массив в другой форме, если просто обращаться к массиву, то компилятор ругается... подскажите пожалуйста как решить эту проблему...
 
Скорее всего, у вас одна форма вызывается из другой. В таком случае, в главной форме нужно создать массив, и передать указатель на него в дочернюю, переопределив ее конструктор.
 
Да, одна форма вызывается другой..
Уточните пожалуйста каким образом передать указатель, и как переопределить конструктор??
 
Выложите на форум исходный текст главной формы - файл .h и файл .cpp
 
файл Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include <math.h>
#include "Unit2.h"
float c;
int t_ost,teh_proc,s,t,v,t_proc,dr,teh;
int teh_tab[50]={0};
int t_tab[50]={0};
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

teh=StrToInt(Edit1->Text);
dr=StrToInt(Edit2->Text);
s=StrToInt(Edit3->Text);
v=StrToInt(Edit4->Text);
t=s/v;
Edit6->Text=IntToStr(t);
teh_proc=teh;

//Edit5->Text=IntToStr(teh_proc);

int i=0;
int k=0;

while(teh_proc>=0)
{
teh_proc=teh_proc-(dr-1);
if(teh_proc<=0)
{
teh_tab=0;
}
else
{
teh_tab=teh_proc;
teh_tab[i+1]=teh_tab;
i++;
}
if(k==0)
{
t_tab[k]=t;
t_tab[k+1]=t_tab[k]+t;
k++;
}
else
{
t_tab[k]=t_tab[k-1]+t;
t_tab[k+1]=t_tab[k]+t;
k++ ;
}
i++;
k++;
}
Edit5->Text=IntToStr(t_tab[8]);
Form2->Show();
}
//---------------------------------------------------------------------------

файл Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TEdit *Edit1;
TEdit *Edit2;
TEdit *Edit3;
TEdit *Edit4;
TButton *Button1;
TEdit *Edit5;
TEdit *Edit6;
TLabel *Label1;
TLabel *Label2;
TLabel *Label3;
TLabel *Label4;
void __fastcall Button1Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
 
И второй формы тоже
 
Вторая форма:
Файл Unit2.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{

}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
//Длины осей 1-X, 2-Y
int X=600;
int Y=500;

Canvas->Pen->Color=(TColor)RGB(0,0,0);
Canvas->Pen->Width=1;
//Рисование осей
Canvas->MoveTo(50,50);
Canvas->LineTo(50,Y);
Canvas->TextOutA(20,Y+10,"Время 'Ч'");
Canvas->MoveTo(50,Y);
Canvas->LineTo(X,Y);
//Рисование меток на оси X
int i=100;
while(i<X+50)
{
Canvas->MoveTo(i,Y-4);
Canvas->LineTo(i,Y+4);
i=i+50;
}
//Рисование меток на оси Y
int k=Y-50;
while(k>49)
{
Canvas->MoveTo(46,k);
Canvas->LineTo(54,k);
k=k-50;
}
int a=Form1->teh_tab[2];
Edit1->Text=IntToStr(a);
}
//---------------------------------------------------------------------------

void __fastcall TForm2::Button2Click(TObject *Sender)
{
Form1->Close();
}
//---------------------------------------------------------------------------

Файл Unit2.h
//---------------------------------------------------------------------------

#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm2 : public TForm
{
__published: // IDE-managed Components
TButton *Button1;
TButton *Button2;
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm2(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm2 *Form2;
//---------------------------------------------------------------------------
#endif

Массивы из первой формы, которые нужно использовать во второй форме.
int teh_tab[50];
int t_tab[50];
 
Последнее редактирование:
Назад
Сверху