Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: teststroyru
Дата сообщения: 27.10.2012 16:22
Согласен с последним постом STL намного лучше, проверено опытом
Автор: NORIO
Дата сообщения: 01.11.2012 21:38
Изучаю C
хочу понять почему

при делении 1/10
вместо 0.10000000000000000000
получаю 0.10000000149011611938

(при выводе двадцати знаков)


Код: #include <stdio.h>


int main(void)
{
float answer = 1.0 / 10.0;
printf("%.20f\n", answer);
return 0;
}
Автор: V0lt
Дата сообщения: 01.11.2012 21:52
NORIO

Цитата:
Изучаю C
хочу понять почему

при делении 1/10
вместо 0.00000000000000000000
получаю 0.10000000149011611938

Имхо, полученный результат ближе к истине, чем твои предположения.
Автор: NORIO
Дата сообщения: 01.11.2012 21:58
V0lt
Скопировал неглядя не то.
Поправил.


Попробовал в онлайн компиляторе, http://codepad.org/j2wROdxr здесь всё выдаёт логично.

А вот в видео курсе edx показывается такой странный результат.

Поэтому дополню вопрос почему такое иногда может быть, теоретически.
Очень интересна причина такого поведения.

Там что то говорили про отображение бесконечного числа в восми битах, но по английски, так что я смутно понял. Хотелось бы по продробнее.


Ах да.

float answer = 1.0 / 10.0;

а не

float answer = 1 / 10;
Автор: Abs62
Дата сообщения: 01.11.2012 22:15
NORIO
Ну, если в общих чертах...
Числа с плавающей точкой представляются в экспотенциальном виде - мантисса (нормированное число) и экспонента (показатель степени).
Для простоты понимания можно для начала рассмотреть это дело в десятичной системе счисления. Если у нас есть число 12.34, скажем, то в экспотенциальном виде оно запишется как 1.234*101. Здесь 1.234 - это мантисса, а 1 - экспонента. Если у нас под мантиссу отведено только четыре позиции для значащих цифр, к примеру, понятно, что 1.2347 записать уже не получиться - оно будет округлено до 1.235. И результат получится не совсем тот, который вроде как ожидается с точки зрения чистой математики.
Вот именно это в вышеописанной программе и происходит. С той лишь разницей, что машина всё хранит и обрабатывает в двоичном виде, так что число представляется не как aaa*10bb, а как ссс*2dd. При выдаче результата число переводится из двоичной системы в десятичную, что и даёт впечатление мусора. На самом деле, конечно, никакой это не мусор, а обычная двоичная дробь. Ошибка округления, переведённая в десятичную систему счисления.
Автор: NORIO
Дата сообщения: 01.11.2012 22:24
Abs62
Ага, теперь понятна причина. Спасибо.
Автор: juvaforza
Дата сообщения: 01.11.2012 23:53
Kars25rus
Ээ, для вашего примера ожидаемый результат - 0.0(0), а не 0.1(0). Может на видео код был немного другой?

P. S.
Kars25rus
Прошу прощения, ошибся.

NORIO
Угу.
Автор: Levenyatko O
Дата сообщения: 06.11.2012 13:05
[more] помогите найти ошибку в коде.
два класса страна и континент. класс-обработчик должен сортировать страны выбранного континента по населению и площади.
не работают функции Create_Country Delete_Country


#include<math.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<time.h>
#include<dos.h>
#include<string.h>
#include <iostream>

# define one 49
# define two 50
# define three 51
# define four 52

#define Col_Count 5
#define Col_Cont 3

//using namespace std;

int n=Col_Count;
int m=Col_Cont;

class Country
{
private:
    char *Name_Country;
    float Naselenije;
    float Ploshad;
    char *Forma_Pravl;
    
public:
    Country();
    ~Country();
    
    char *GetName_Country();
    float GetNaselenije();
    float GetPloshad();
    char *GetForma_Pravl();
        
    void SetName_Country(char *newVal);
    void SetNaselenije(float newVal);
    void SetPloshad(float newVal);
    void SetForma_Pravl(char *newVal);
    
    void Print();

};

Country::Country()
{
//    printf("Country Constructor without params used\n");
Name_Country=new char[200];
Forma_Pravl=new char[200];
    strcpy(Name_Country,"");
    Naselenije = 0;
    Ploshad = 0;
    strcpy(Forma_Pravl,"");
}

Country::~Country()
{
//    printf("Country Destructor used\n");
    if(Name_Country != NULL)
// strcpy(Name_Country,"");
delete[]Name_Country;

if(Forma_Pravl != NULL)
// strcpy(Forma_Pravl,"");
delete []Forma_Pravl;
}

void Country::Print()
{
    printf("%s | %10.2f | %9.2f | %s\n",Name_Country,Naselenije,Ploshad,Forma_Pravl);
}

char*Country::GetName_Country()
{    return this->Name_Country ; }

float Country::GetNaselenije()
{    return this->Naselenije; }

float Country::GetPloshad()
{    return this->Ploshad; }

char* Country::GetForma_Pravl()
{    return this->Forma_Pravl; }

void Country::SetName_Country(char *newVal)
{        strcpy(this->Name_Country,newVal); }

void Country::SetNaselenije(float newVal)
{    this->Naselenije = newVal; }

void Country::SetPloshad(float newVal)
{    this->Ploshad = newVal; }

void Country::SetForma_Pravl(char *newVal)
{    strcpy(this->Forma_Pravl,newVal); }

//_______________________________________________________________________

class Continent
{

private:
    char *Name_Continent;
    Country ListCountries[10];

public:
    Country *m_Country;

    Continent();
    ~Continent();
    
    char *GetName_Continent ();
    void SetName_Continent (char *newVal);

    Country GetListCountries (int i);
    void SetListCountries (char *Name_Country,float Naselenije, char *Forma_Pravl, float Ploshad,int i);

    void Create_Country(char* Name, float Plosh, float Nas, char *Form);
    void Delete_Country(char *Name_Country);

void Print_Cont();
};

void Continent::Print_Cont()
{
printf("___________________________________________________________\n");
printf("%35s\n",Name_Continent);
printf("___________________________________________________________\n");
printf(" Name_Country | Naselenije | Ploshad | Form_Pravlenija\n");
printf("___________________________________________________________\n");

for(int i=0;i<n;i++)
{
ListCountries[i].Print();
}
}

Continent::Continent()
{
// printf("\n \n Continent Constructor without params used\n\n");
Name_Continent=new char[256];
    strcpy(this->Name_Continent,"");
}

Continent::~Continent()
{
//printf("\nContinent Destructor used\n\n");
    if(this->Name_Continent != NULL)
//strcpy(this->Name_Continent,"");
delete []Name_Continent;
}

char *Continent::GetName_Continent ()
{ return this->Name_Continent; }

void Continent::SetName_Continent (char *newVal)
{ strcpy(Name_Continent,newVal); }


Country Continent::GetListCountries (int i)
{ return ListCountries[i]; }

void Continent::SetListCountries (char *Name_Country,float Naselenije, char* Forma_Pravl, float Ploshad,int i)
{    
ListCountries[i].SetName_Country(Name_Country);
ListCountries[i].SetNaselenije(Naselenije);
ListCountries[i].SetPloshad(Ploshad);
ListCountries[i].SetForma_Pravl(Forma_Pravl);
}

void Continent::Create_Country(char *Name, float Plosh, float Nas, char *Form)
{
ListCountries[n].SetName_Country(Name);
ListCountries[n].SetPloshad(Plosh);
ListCountries[n].SetNaselenije(Nas);
ListCountries[n].SetForma_Pravl(Form);

n+=1;
}

void Continent::Delete_Country(char *Name_Country)
{
int k,k1;

for(k=0;k<n;k++)
{
if(strcmp(ListCountries[k].GetName_Country(), Name_Country)==0)
{
for(k1=k+1;k<n;k++,k1++)
{
if(k1<n){
ListCountries[k].SetName_Country(ListCountries[k1].GetName_Country());
ListCountries[k].SetNaselenije(ListCountries[k1].GetNaselenije());
ListCountries[k].SetPloshad(ListCountries[k1].GetPloshad());
ListCountries[k].SetForma_Pravl(ListCountries[k1].GetForma_Pravl());
}
else {break;}
}
n-=1;

}
}
Print_Cont();
}
//_______________________________________________________________________

class Obrabotchik
{
private:
    Continent List_Continents[Col_Cont];

public:
    Obrabotchik();
    ~Obrabotchik();

    Continent GetListContinents (int i);
void CreateListContinents();

    void Sort_po_plosh(int i);
    void Sort_po_nasel(int i);    

};

Obrabotchik::Obrabotchik()
{
// printf("\n \n Obr Constructor without params used\n\n");
}

Obrabotchik::~Obrabotchik()
{
//printf("\nObr Destructor used\n\n");
}


Continent Obrabotchik::GetListContinents (int i)
{    return List_Continents[i]; }

void Obrabotchik::CreateListContinents()
{
int i,j;
char c[20]={"Name_Continent_"},name[15]={"Name_Country_"},form[15]={"Form_Country_"},str[30],str1[30];
float x1,x2;

for( i=0;i<Col_Cont;i++)
{
sprintf(str, "%s %d",c, i+1);
List_Continents[i].SetName_Continent(str);

for(j=0;j<Col_Count;j++)
{
sprintf(str, "%s %d",name, j+1);
sprintf(str1, "%s %d",form, j+1);
x1=(float)200+rand()/300;
x2=(float)200+rand()/300;
List_Continents[i].SetListCountries(str,x1,str1,x2,j);
}
List_Continents[i].Print_Cont();
}
}

void Obrabotchik::Sort_po_plosh(int k)
{
int i,j,imin=0;

float min_el=99000;

Country temp;

for(i=0;i<Col_Count;i++)
{
imin=i;
min_el=List_Continents[k].GetListCountries(i).GetPloshad();

for(j=i+1;j<Col_Count;j++)
{
if(List_Continents[k].GetListCountries(j).GetPloshad()<min_el){
imin=j;
min_el=List_Continents[k].GetListCountries(j).GetPloshad();
}
}

temp.SetName_Country(List_Continents[k].GetListCountries(i).GetName_Country());
temp.SetForma_Pravl(List_Continents[k].GetListCountries(i).GetForma_Pravl());
temp.SetNaselenije(List_Continents[k].GetListCountries(i).GetNaselenije());
temp.SetPloshad(List_Continents[k].GetListCountries(i).GetPloshad());

List_Continents[k].SetListCountries(List_Continents[k].GetListCountries(imin).GetName_Country(),List_Continents[k].GetListCountries(imin).GetNaselenije(),List_Continents[k].GetListCountries(imin).GetForma_Pravl(),List_Continents[k].GetListCountries(imin).GetPloshad(),i);

List_Continents[k].SetListCountries(temp.GetName_Country(),temp.GetNaselenije(),temp.GetForma_Pravl(),temp.GetPloshad(),imin);

}
}

void Obrabotchik::Sort_po_nasel(int k)
{
int i,j,imin=0;

float min_el=99000;

Country temp;

for(i=0;i<Col_Count-1;i++)
{
imin=i;
min_el=List_Continents[k].GetListCountries(i).GetNaselenije();

for(j=i+1;j<Col_Count;j++)
{
if(List_Continents[k].GetListCountries(j).GetNaselenije()<min_el){
imin=j;
min_el=List_Continents[k].GetListCountries(j).GetNaselenije();
}
}

temp.SetName_Country(List_Continents[k].GetListCountries(i).GetName_Country());
temp.SetForma_Pravl(List_Continents[k].GetListCountries(i).GetForma_Pravl());
temp.SetNaselenije(List_Continents[k].GetListCountries(i).GetNaselenije());
temp.SetPloshad(List_Continents[k].GetListCountries(i).GetPloshad());

List_Continents[k].SetListCountries(List_Continents[k].GetListCountries(imin).GetName_Country(),List_Continents[k].GetListCountries(imin).GetNaselenije(),List_Continents[k].GetListCountries(imin).GetForma_Pravl(),List_Continents[k].GetListCountries(imin).GetPloshad(),i);

List_Continents[k].SetListCountries(temp.GetName_Country(),temp.GetNaselenije(),temp.GetForma_Pravl(),temp.GetPloshad(),imin);

}
}


int main()
{
{

int i;
char *a,*f;
float s=12,p=32;

a=new char [200];
f=new char [200];
strcpy(a,"Name_Country_ 1");
strcpy(f,"Form");

Obrabotchik A;
A.CreateListContinents();
/*
for(i=0;i<n;i++)
A.GetListContinents(i).Print_Cont();
*/
A.GetListContinents(0).Delete_Country(a);

//A.GetListContinents(0).Create_Country(a,s,p,f);

for(i=0;i<m;i++)
A.GetListContinents(i).Print_Cont();

}
system("pause");
return 0;
}
[/more]
Автор: karakurt2
Дата сообщения: 06.11.2012 17:10
Levenyatko O
Не определена переменная n в функции Continent::Create_Country()
А компилятор уже не справляется с поиском ошибок?
Автор: adasiko
Дата сообщения: 06.11.2012 17:28
Levenyatko O
Просмотрел несколько первых строчек начало тошнить.
Советую почитать любую книгу по ООП, и прежде чем писать что-то продумать, схему объектов и их свойств (лучше на бумажке нарисовать квадратиками объекты и свойста-переменные, которые их описывают). К примеру количество стран должно быть по логике быть впихнуто в объект континент, а не валяться где попало в глобальной видимости.
Автор: kotlomoy
Дата сообщения: 06.11.2012 23:12

Цитата:
karakurt2
Не определена переменная n в функции Continent::Create_Country()

n определена глобально, причем инициализируется не нулем: int n=Col_Count;
и в каждом Create_Country() оно дальше увеличивается...

умом сей код мне не понять :/
Автор: BagaBaga
Дата сообщения: 09.11.2012 22:36
Есть такой вопрос: есть он-лайн тестировщики (типа он-лайн олимпиад и прочего). Есть ли чего свободного, чтобы можно было поднять (на сервере под nix), чтобы он там "в песочнице" компилировал С/C++ код (переданный, допустим, по http через стандартную форму загрузки), ну и запускал на выполнение...
PS
Понимаю, что не в топик, но какая тема правильная - не пойму.
Автор: limarukraine
Дата сообщения: 11.11.2012 20:08
Всем доброго времени суток !

Люди научите пожалуйста следующему:

В MySQL я создал элементарную таблицу из двух полей:

id тип SERIAL (первичный ключ)

name тип VARCHAR(100)

Занес в созданную таблицу несколько значений соответствующих полей базы данных

Теперь я хотел бы из Visual Studio 2012 получить доступ к полям созданной мною базы в MySQL - просто прочесть и занести в элементарные переменные в языке C++

-----------

Предварительно установил MySQL Connector C++ 1.1.1 WIN32

В Visual Studio 2012 хотел бы реализовать именно на C++ (а не на C#)

Именно в консольном приложении, а не в WIN32 (для простоты)

-----------

Что дальше ?

Попробовал сделать как здесь http://dev.mysql.com/doc/refman/5.1/en/connector-cpp.html

но там что то каталоги MySQL не совпадают с моими и одной либы ( libmysql.lib ) не нашел

Был бы признателен если бы объяснили как можно детальнее - для новичка

Спасибо
Автор: juvaforza
Дата сообщения: 12.11.2012 12:12
limarukraine

Цитата:
но там что то каталоги MySQL не совпадают с моими

Ничего страшного. Действуйте по шаблону: мойкаталогдляmysql\... вместо C:\mysql\...

Цитата:
и одной либы ( libmysql.lib ) не нашел

Идите по простому пути. Для сложного пути нужно скачать MySQL Connector/C (в частности, для взятия libmysql.lib - для динамического связывания она вам не нужна), как минимум.
И еще: т. к. у вас VS12, а библиотека рассчитана на VS8, то могут возникнуть проблемы с компиляцией. Прочтите в этом случае советы в комментариях для проблем с VS10.
Автор: juvaforza
Дата сообщения: 12.11.2012 23:52
BagaBaga
Вроде только Codepad описал свою стратегию (geordi). Можете на рыбу посмотреть. Посерьезней - 1 (1.2, 1.3). Про олимпиадные системы можно гуглить: так, например. Еще есть ejudge (русская система).

Вопросы про настройку веб-интерфейса сервера - это форум или 24, или 8.
Автор: igorek55555
Дата сообщения: 14.11.2012 21:28
народ помогите переделать вывод проги. надо чтобы кроме количествакниг выдавала их названия(прога находит количество книг заданого автора)
[more]

Код:
#include<string.h>
#include<stdio.h>
#include<conio.h>
#include<iostream.h>

struct library
{
char name[50];
char avtor[50];
float cost;
};

void main()
{
int k,p,n,i;k=0;p=0;
char s[50];
clrscr();
cout<<"Vvedite kol-vo:\n";
cin>>n;
library *a=new library[n];

clrscr();
for (i=0;i<n;i++)
{
cout<<"Name: ";
cin>>a[i].name;
cout<<"Avtor: ";
cin>>a[i].avtor;
cout<<"Cost: ";
cin>>a[i].cost;
cout<<"--------------------------------------------------------------------------------";
}

cout<<"Enter the avtor for search: ";
cin>>s;

clrscr();
for (i=0;i<n;i++)
if(strcmp(a[i].avtor,s)==0)
{p++;k++;}

if(k==0) cout<<"Error !!!";
else cout<<"Kol-vo knig avtora "<<s<<" : "<<p<<"\n";
getch();
}
Автор: xliker
Дата сообщения: 08.12.2012 21:36
Доброго дня. Подскажите, можно ли такое сделать. Есть объекты класса с некоторыми полями. Нужно занести каждый объект в отдельную строку StringGrid-а, но! стоит требование: для отображения полей объектов не использовать свойства Cells, Cols, Rows. Как еще занести что-то в StringGrid?
Автор: bomzzz
Дата сообщения: 09.12.2012 10:37
Автор: adasiko
Дата сообщения: 09.12.2012 12:49
bomzzz
msdn?
Автор: bomzzz
Дата сообщения: 09.12.2012 13:03
NOTIFYICONDATA это вообще для иконки в трее.

сообщение TTM_SETTITLE устанавливает в тултипе заголовок и иконку
http://msdn.microsoft.com/ru-ru/library/windows/desktop/bb760414%28v=vs.85%29.aspx
из надобра стандартных

Цитата:
TTI_NONE No icon.
TTI_INFO Info icon.
TTI_WARNING Warning icon
TTI_ERROR Error Icon
TTI_INFO_LARGE Large error Icon
TTI_WARNING_LARGE Large error Icon
TTI_ERROR_LARGE Large error Icon

а чтоб ее изменить на свою надо знать как она приделывается системой. примеров не нагуглилось

Автор: Abs62
Дата сообщения: 09.12.2012 14:06
bomzzz

Цитата:
сообщение TTM_SETTITLE устанавливает в тултипе заголовок и иконку
http://msdn.microsoft.com/ru-ru/library/windows/desktop/bb760414%28v=vs.85%29.aspx
из надобра стандартных

А повнимательнее свою же ссылку прочитать не судьба?

Цитата:
As of Windows XP SP2 and later, this parameter can also contain an HICON value. Any value greater than TTI_ERROR is assumed to be an HICON.

И пример там очень даже в тему.
Автор: bomzzz
Дата сообщения: 09.12.2012 15:14
да уж прочел прежде чем спрашивать и попробовал

все попробовал и системную иконку, и свою иконку, и разных размеров, и вытащил системную картинку. не выводится. статьи которые гуглятся частично утверждают что выводятся только из списка. у меня сп3. потому и ссылку не стал на мсдн приводить чтоб мозги не компостировали мсдном. рабочего примера не удалось найти ни на дельфятине ни на си
Автор: bomzzz
Дата сообщения: 09.12.2012 19:43
SetWindowTheme - вроде как то надо эту фигню использовать. но рабочего примера нет
Автор: ne_viens
Дата сообщения: 09.12.2012 19:59
Рабочий (на win7) пример:

void toTray(HWND hDlg)
{
    RECT desktopRect, dlgRect;
    NOTIFYICONDATA nid;
    
    GetWindowRect(GetDesktopWindow(), &desktopRect);
    GetWindowRect(hDlg, &dlgRect);
    desktopRect.left = desktopRect.right;
    desktopRect.top = desktopRect.bottom;
    DrawAnimatedRects(hDlg, IDANI_CAPTION, &dlgRect, &desktopRect);
    
    ShowWindow(hDlg, SW_HIDE);
    nid.cbSize = sizeof(nid);
    nid.hWnd = hDlg;
    nid.uID = 0;
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP | NIF_INFO | NIF_STATE;
    nid.uCallbackMessage = WM_USER;
    nid.hIcon = LoadIcon(g_hInst, MAKEINTRESOURCE(2001));
    strcpy(nid.szTip, "Double-click to maximize");
    nid.dwState = nid.dwStateMask = nid.uTimeout = 0;
    nid.dwInfoFlags = NIIF_USER;
    strcpy(nid.szInfo, "My cool icon");
    strcpy(nid.szInfoTitle, "Icon Test");
    nid.hBalloonIcon = 0;
    Shell_NotifyIcon(NIM_ADD, &nid);
}

int __stdcall DialogProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
{
...
    case WM_SYSCOMMAND:
        if(LOWORD(wParam) == SC_MINIMIZE)
            toTray(hDlg);
        break;
...
}
Автор: bomzzz
Дата сообщения: 09.12.2012 20:06
сенки. буду разбираться.
Автор: deadka1313
Дата сообщения: 14.12.2012 17:19

Код: #include <iostream>
using namespace std;

const int SIZEARRAY=99;

struct FamNumber
{
char index[SIZEARRAY];
char family[SIZEARRAY];
char namber[SIZEARRAY];
};

int main()
{
FamNumber dataInfo[SIZEARRAY];
dataInfo[0].family="shjfd";//курсор ошибки тут!
return 0;
}
Автор: kotlomoy
Дата сообщения: 14.12.2012 19:28
deadka1313
Потому что dataInfo[0].family - это константа, ее значение менять нельзя.
Читайте про массивы в Си.
Автор: bomzzz
Дата сообщения: 14.12.2012 19:30
проблема оказалась сильно хитрая. она в манифестах (что это такое и с чем его едят я толком еще не разобрался) и в том, что у меня какими то оптимизаторами в системе что то отключено. рабочий вариант мне показали на картинке но он у меня не работает.
Автор: Syjgin
Дата сообщения: 19.12.2012 07:44
Не могу найти информацию по алгоритму поиска решения головоломки пентамино - на вход поступает законченная фигура в виде текстового файла из нолей и единиц, на выходе нужно разбить эту фигуру на части заданными деталями. В общих чертах, кажется, нужно следующее: сделать рекурсию до тех пор, пока неразбитая часть не равна одной из элементарных фигур, а если она не равна, то, начиная с, допустим, левого верхнего угла подставлять любую фигуру, затем: если она не подходит, переходим к следующей, если подходит, начинаем разбивать то, что получилось в результате. Если в конце концов получается фигура, не соответствующая ни одной из элементарных, идем на шаг назад и ставим другую фигуру(нужно хранить id фигуры, примененной на прошлом шаге). Только кажется, что такой перебор с возратом может никогда не найти нужное решение. Кажется, должен быть стандартный алгоритм, который нужно адаптировать к этому случаю. Никто не знает, какой?
Автор: juvaforza
Дата сообщения: 21.12.2012 02:15
Syjgin
Понятно, что решения может не существовать, или его долго искать, но алгоритм перебора по определению см-ожет перебрать конечное число всех вариантов

Кроме перебора, есть алгоритм Кнута, общий для таких задач (поиск решения или всех решений - разницы нет): 1, 2, 3, 4.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.