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

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

Автор: Svit14
Дата сообщения: 06.11.2010 17:39
Есть структура со связанными списками:

Код: .......................... struct oblast{
int kodreg;
int kodobl;
char nazobl[30];
struct oblast *daliobl;
};
struct regiony {
int kodreg;
char nazreg[50];
struct regiony *daliregion;
};
struct rodowe {
int kodrodowe;
char naznarodowe[30];
int kodobl_ua;
char roztawuv_rodowe[50];
int kod_tupy_rodowe;
int kod_rozm1;
int kod_rozm2;
int rik_vidkr;
int rik_vved;

struct rodowe *dalirod;
};
struct rozm_rodowe {
int kodrozm;
char rozmiry[20];
struct rozm_rodowe *dalirozm;
};

struct type_rodowe {
int kodtype;
char typerod[20];
struct type_rodowe *dalitype;
};
int main(void)
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i,s,b,kodvv;
struct{int rik;char den;char mis;}data;
struct data *adr_data=&data;
struct oblast danoobl[6]={{ 1,1,"Чернівецька ",NULL},
{ 1,2,"Івано-Франківська ",NULL},
{ 1,3,"Закарпатська ",NULL},
{ 2,4,"Полтавська ",NULL},
{ 2,5,"Сумська ",NULL},
{ 3,6,"Одеська ",NULL},
};

struct regiony danoreg[3]={{1,"Передкарпатська нафтогазоносна обл.",NULL},
{2,"Днiпровсько-Донецька нафтогазоносна обл.",NULL},
{3,"Причорноморсько-Кримська газонафтоносна впадина",NULL},
};
struct rodowe danorodowe[7]={{1,"Бiлицьке-Г",1,"ст. Бiлиця", 2,2,1,1949,1949,NULL},
{2,"Богородчанське-Г",2,"28 км на ПдС вiд м. Iвано-Фpанкiвськ", 1,0,1,1963,1979,NULL},
{3,"Солятинське-Г",3,"1 км на Пн вiд м. Солятин", 2,1,1,1982,1988,NULL},
{4,"Борисівське-НГК",1,"100 км на ПдЗ вiд м. Дpобот", 3,2,1,1954,1954,NULL},
{5,"Аркадівське-ГК",4,"35 км на С вiд м. Кобеляки", 4,0,2,1979,1981,NULL},
{6,"Андрiївське-ГК",5,"43 км на ПнЗ вiд м. Ромни", 2,3,2,1982,2002,NULL},
{7,"Ритнянське-Г",6,"10 км на Пд вiд м. Ритня", 2,2,1,1980,2004,NULL},
};
struct rozm_rodowe danorozm[3]={{1,"Дрібне",NULL},
{2,"Середнє",NULL},
{3,"Велике",NULL},
};
struct type_rodowe danotype[4]={{1,"Газове",NULL},
{2,"Нафтогазове",NULL},
{3,"Нафтогазоконденсатне",NULL},
{4,"Газоконденсатне",NULL},
};
........................................
Автор: stasiun
Дата сообщения: 10.11.2010 02:25
Подскажите, пожалуйста, каким образом на Visual C++ найти сумму элементов массива, расположенных до минимального элемента, а затем упорядочить по возрастанию отдельно элементы, стоящие на четных местах, и элементы, стоящие на нечетных местах.
Автор: ItsJustMe
Дата сообщения: 12.11.2010 15:36
Точно также, как и на GNU C++, или каком-либо другом C++
1. Просматриваешь весь массив, находишь минимальный элемент, запоминаешь его индекс.
2. Все элементы до найденного индекса суммируешь.
3. Из исходного массива все нечетные элементы собираешь в новый массив A, все четные - в B.
4. Сортируешь массивы A и B по возрастанию.
5. Создаешь из массивов A и B результирующий массив: a0,b0,a1,b1,a2,b2....
6. Выводишь результирующий массив.
7. ...
8. PROFIT!
Автор: MedvedevDM
Дата сообщения: 12.11.2010 21:11
Не пойму в чем ошибка,

Задача

Динамически создать массив (10;6) и напечатать его элементы. Найти наименьшие элементы каждой строки и переместить их в массив A. Вывод наименьшего элемента строки матрицы оформить в виде подпрограммы.
Решение


Код:

#include <stdlib.h>
#include <time.h>
#include <iostream>
#include <iomanip>
#include <windows.h>

void display(double **data, const int m, int n);
void de_allocate(double **data, int m, int n);
void minar(double **data, double *out, int m, int n);
void displaysingle(double *data, int m, int n);
char* DosStr(char* src);

int main()
{
double **data;
double *out;
int m = 10;
int n = 6;

srand(time(NULL));

try
{
data = new double*[m];
for (int j = 0; j < m; j++)
data[j] = new double[n];

}
catch (std::bad_alloc)
{
std::cout << "Could not allocate memory";
exit(-1);
}

try
{
out = new double[m];
}
catch (std::bad_alloc)
{
std::cout << "Could not allocate memory";
exit(-1);
}


for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
data[i][j] = ((rand() % 198)-99)/10.0;

display(data,m,n);
minar(data,out,m,n);
displaysingle(out,m,n);
de_allocate(data,m,n);

system("pause");

return 0;
}

void display(double **data, int m, int n)
{
std::cout << DosStr("Начальный массив:") << std::endl;
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (data[i][j]>=0)
std::cout << " ";
std::cout << std::fixed << std::setprecision(1) << data[i][j] << " " <<"\t";
}
std::cout << std::endl;
}
}

void displaysingle(double *data, int m, int n)
{
std::cout << std::endl;
std::cout << DosStr("Минимальные элементы в строках:") << std::endl;
for (int i = 0; i < m; i++)
{
if (data[i]>=0)
std::cout << " ";
std::cout << std::fixed << std::setprecision(1) << data[i] << " " << std::endl;

}
std::cout << std::endl;
}

void minar(double **data, double *out, int m, int n)
{
long double min;
for (int i = 0; i < m; i++)
{
min = data[i][1];
for (int j = 0; j < n; j++)
{
if (data[i][j]<min)
min = data [i][j];
out[i] = min;
}
}
}

void de_allocate(double data, int m, int n)
{
for (int i = 0; i < m; i++)
delete[] data[i];
delete[] data;
}

char* DosStr(char* src)
{
static char buf[1024];
CharToOem(src, buf);
return buf;
}

Автор: Abs62
Дата сообщения: 12.11.2010 21:25
MedvedevDM
Дык, тут просто опечатка в реализации функции de_allocate - double data вместо double **data.
Автор: stazher
Дата сообщения: 18.11.2010 08:40
Всем привет!
Такая проблемка, нигде не встречал, буду рад совету. Есть некая прога А, когда запускается, берет настройки из реестра и хранит видимо в памяти. Хочется написать прогу Б, исполняемый файл, по нему кликаешь, и конкретная настройка меняется. Когда прога А не запущена, то нефиг делать, класс TRegistry и все такое. А когда запущена, надо открывать меню проги А, на нужной вкладке отмечать checkbox или radiobutton - OK. Вот хочется как раз это автоматизировать. Как это в принципе возможно, какие функции WinAPI задействованы...
Автор: ItsJustMe
Дата сообщения: 18.11.2010 11:52
Лови хендл окна проги A, ищи нужный контрол и меняй ему что надо.
FindWindowEx
GetDlgItem
и т.д.
Автор: Nexus777
Дата сообщения: 19.11.2010 16:34
Пожалуйста помогите написать программу на С которая будет шифровать/дешифровать файл. Не имеет значение каким способом) Заранее спасибо =)
Автор: ValidolX
Дата сообщения: 19.11.2010 16:45
Nexus777
если не страшно использовать CryptoAPI (CAPI) из Windows - вот здесь хороший пример

EncodeFile()/DecodeFile()

hччp://forum.ixbt.com/topic.cgi?id=40:3020-2
Автор: Red Planet
Дата сообщения: 21.11.2010 20:19
Добрый вечер. Вектор сортируется только лишь алгоритмом sort из STL или есть другие методы?
Автор: karakurt2
Дата сообщения: 22.11.2010 04:10
Red Planet
в STL есть ещё stable_sort(). в CRT есть qsort(). можете изобрести что-нибудь своё или позаимствовать из книг или сторонних библиотек.
Автор: Red Planet
Дата сообщения: 22.11.2010 10:41
А если имеется вектор, который состоит из отсортированных участков, то как лучше поступить?

Пример (участки по три числа в порядке возрастания).

{1, 5, 8, 5, 9, 11, 7, 13, 18 ... }

Необязательно группы по три. Какой в таком случае метод применить? Спрашиваю, так как общее количество чисел очень велико.
Автор: karakurt2
Дата сообщения: 22.11.2010 13:52
merge_sort?
подробнее смотрите литературу.

Добавлено:
кстати, покажется кране невероятным, но существует алгоритм сортировки с линейной сложностью. bucket_sort
Автор: A1exSun
Дата сообщения: 26.11.2010 20:14
Не в тему, но где скачать C++Builder XE? в ЛС пожалуйста. Или лучше MS Visual C++ 2010?
Автор: KChernov
Дата сообщения: 26.11.2010 20:38
A1exSun
Конечно не в тему.
С первым - в варез.
Второй в принципе можно и с офсайта скачать.
Автор: A1exSun
Дата сообщения: 26.11.2010 21:31
Посоветуйте тогда в чем лучше учится на нем кодить...
Автор: LenaKrasit
Дата сообщения: 09.12.2010 12:51
салют!!

нужно реализовать сортировку MSD Radix Sort. реализовать с шаблонами!!
как это сделать?
проблема: там ведь надо разбирать ключ по знакам!!а как это сделать,если заранее не известен тип переменной!это может быть и объект класса с каким-то ключём и инт и стринг...
как это сделать?? можно ли избежать побайтного считавания??
Автор: akaGM
Дата сообщения: 09.12.2010 13:04
A1exSun
и не новичок ведь на форуме...
http://forum.ru-board.com/topic.cgi?forum=33&topic=0393#1
Автор: V0lt
Дата сообщения: 09.12.2010 22:44
Кто помнит какие есть функции для преобразования float в int? Нужно округление к ближайшему целому. Я помню, что были готовые толи в стандартных либах, толи от MS. Названия только забыл
Автор: Abs62
Дата сообщения: 09.12.2010 23:33
V0lt
Есть ceil() - округление вверх и floor() - округление вниз. Для округления к ближайшему можно использовать floor(x+0.5) или ceil(x-0.5).
Автор: karakurt2
Дата сообщения: 10.12.2010 07:03
V0lt
для округления эффективнее будет воспользоваться приведением типа, например, оформить в виде макроса или встраиваемой функции


Код:
inline int round(double x)
{
return (int)(x+0.5);
}
Автор: Abs62
Дата сообщения: 10.12.2010 07:59
karakurt2

Цитата:
для округления эффективнее будет воспользоваться приведением типа

round(-1.8)=-1?
Автор: KChernov
Дата сообщения: 10.12.2010 08:15
Abs62

Цитата:
round(-1.8)=-1?

Так у ceil() и floor() те же проблемы.
А пример karakurt2-а можно модифицировать с использованием функций знака и модуля (ну или аналогично модифицировать ceil()/floor()).
Автор: Abs62
Дата сообщения: 10.12.2010 08:31
KChernov

Цитата:
Так у ceil() и floor() те же проблемы.

Нет.
(int)(-1.8+0.5)=-1
floor(-1.8+0.5)=-2
Беда приведения типов в том, что оно, отбрасывая дробную часть, работает как floor для положительных чисел и как ceil для отрицательных. Вот отсюда и лезет необходимость "модифицировать с использованием функций знака и модуля".
Автор: V0lt
Дата сообщения: 10.12.2010 09:37
Abs62

Цитата:
Есть ceil() - округление вверх и floor() - округление вниз.

Оно. Я эти функции почему-то не мог найти в справке. Постоянно выдает выдает функции для .NET, а эти не хочет.
Вроде видел и округление к ближайшему целому, хотя может это была нестандартная функция и макрос. Не проверишь уже

Про приведение типа я знаю. В коде нарыл такие примеры:

Код: #define ROUND(x) ((int)((x) + ((x) > 0 ? 0.5 : -0.5)))

#define round(x) ((x) > 0 ? (x) + 0.5 : (x) - 0.5)
int k = (int)round(f);

return (x > 0) ? floor(x + 0.5) : ceil(x - 0.5);
Автор: KChernov
Дата сообщения: 10.12.2010 10:10
Abs62

Цитата:
Нет.
(int)(-1.8+0.5)=-1
floor(-1.8+0.5)=-2

Это у вас где так?
Специально в VS2008 проверил:

Цитата:
ceil(1.2) = 2
ceil(abs(1.2)) = 2
floor(1.2) = 1
floor(abs(1.2)) = 1
ceil(1.7) = 2
ceil(abs(1.7)) = 2
floor(1.7) = 1
floor(abs(1.7)) = 1
ceil(-1.2) = -1
ceil(abs(-1.2)) = 2
floor(-1.2) = -2
floor(abs(-1.2)) = 1
ceil(-1.8) = -1
ceil(abs(-1.8)) = 2
floor(-1.8) = -2
floor(abs(-1.8)) = 1


У правильной функции округления результат по модулю от модуля результата отличаться не должен.
Ну или нужно в зависимости от знака использовать либо ceil, либо floor.

V0lt

Цитата:
Я эти функции почему-то не мог найти в справке. Постоянно выдает выдает функции для .NET, а эти не хочет.

Если речь про локальный МСДН, то там вообще-то есть фильтры (правда всё равно много выдаётся, но всё таки не настолько)
Автор: karakurt2
Дата сообщения: 10.12.2010 13:48
Abs62
Вы правы.

Ещё можно управлять направлением округления с помощью функции _control87(). Например, чтобы достигнуть нужного эффекта, вызвать


Код:
_control87(_MCW_RC, _RC_NEAR);
Автор: Abs62
Дата сообщения: 10.12.2010 15:49
KChernov

Цитата:
Это у вас где так?

В VS2008, к примеру. А у вас иначе?

Цитата:
У правильной функции округления результат по модулю от модуля результата отличаться не должен.

У правильной функции округления к ближайшему. Так оно и получается.

Код: #define round(x) floor((x)+0.5)

round(1.2)=floor(1.2+0.5)=floor(1.7)=1
round(1.8)=floor(1.8+0.5)=floor(2.3)=2
round(-1.2)=floor(-1.2+0.5)=floor(-0.7)=-1
round(-1.8)=floor(-1.8+0.5)=floor(-1.3)=-2
Автор: Qraizer
Дата сообщения: 12.12.2010 05:14
Как вариант:
Код: #define ROUND(x) ((int)((x) + 0.5f) - ((x)<0))
Автор: Abs62
Дата сообщения: 12.12.2010 13:26
Qraizer
Изящно. Но у этого варианта, как и у прочих #define с проверкой на знак, есть один нюанс - аргумент вычисляется дважды. Если об этом забыть и написать что-то вроде ROUND(GetNextValue()), где GetNextValue при каждом вызове возвращает новое значение, станет весело.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

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


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