ANTICHAT — форум по информационной безопасности, OSINT и технологиям
ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию.
Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club,
и теперь снова доступен на новом адресе —
forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
 |
|

06.06.2009, 18:45
|
|
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме: 2868783
Репутация:
414
|
|
В Паскале можно было бы с помощью записей сделать, а тут не знаю как...
А тут с помощью структур)
|
|
|

06.06.2009, 19:06
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
Код:
class Empl {
private :
string Name;
string LName;
int Rate;
public :
Empl();
Empl(string inName, string inLName, int Rate);
void setName(string inName);
void setLName(string inLName);
void setRate(int inRate);
string getName();
string getLName();
int getRate();
#void del();
#void display();
};
Empl::Empl() {
Name='';
LName='';
Rate=-1;
}
Empl::Empl(string inName, string inLName, int Rate) {
Name = inName;
LName = inLName;
Rate = inRate;
}
# Далее определишь все остальное, мне лень ;(
#database
const int MaxEmpl = 100;
const int FirstEmplNum = 1;
class database {
private :
Empl iEmpl[MaxEmpl];
int NextSlot;
int NextEmplNum;
public :
database();
Empl& addEmpl(string inName, string inLName, int inRate);
Empl& getEmpl(int inEmplNum);
Empl& getEmpl(string inName, string inLName);
void display();
...
# все варианты вывода данных
};
database::database() {
NextSlot = 0;
NextEmplNum = FirstEmplNum;
}
Empl& database::addEmpl(string inName, string inLName) {
if (NextSlot >= MaxEmpl) {
cerr << " No more places here ;(" << endl;
throw exception();
}
Empl& tEmpl = iEmpl[NextSlot++];
tEmpl.setName(inName);
tEmpl.setLName(inLName);
tEmpl.setRate(inRate);
return tEmpl;
}
Empl& database getEmpl(int inEmplNum) {
for (iny i = 0; i < NextSlot; i++) {
if (iEmpl[i].getEmplNum() == inEmplNum) {
return iEmpl[i];
}
}
cerr << "There is no person with number " << inEmplNum << endl;
throw exception();
}
# Мне надо бежать, дальше думаю понятно
Вот набросал что-то. Сейчас нужно уходить, поэтому не закончил. Посмотри, думаю принцип понятен.
Последний раз редактировалось Fata1ex; 06.06.2009 в 19:54..
|
|
|

07.06.2009, 18:36
|
|
Участник форума
Регистрация: 09.08.2008
Сообщений: 139
Провел на форуме: 560332
Репутация:
15
|
|
Как унаследовать Glib::IOChannel ?
Мне нужно , чтоб можно было сделать подобие Glib::IOChannel::create_from_fd();
Непонятно, как класс узнает fd , если я просто наследую. Хранит fd он походу в private(но не уверен). Где - то видел, что создание с помощью fd происходит так :
Glib::RefPtr<IOChannel> IOChannel::create_from_fd(int fd)
{
return Glib::wrap(g_io_channel_unix_new(fd), false);
}
Я думал сделать подобие этого, но только на мой класс-наследник поменять, но вот wrap(g_io_channel_*, false); возвращает Glib::RefPtr<Glib::IOChannel>> :{ как быть?
РЕШЕНО
Последний раз редактировалось Glazz; 08.06.2009 в 12:34..
|
|
|

08.06.2009, 14:04
|
|
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме: 298300
Репутация:
128
|
|
Сообщение от Mosvit
Помогите решить такую задачу на языке Си:
Реал изовать базу данн ых “служащие” в виде файла, содержащего имя, фамилию и отчество служащего, а также его рейтинг. Уметь: 1) вводить данные; 2)удалять данные; 3)изменять данные; 4) сортировать данные по любому столбцу; 5) выводить данные на экран.
В Паскале можно было бы с помощью записей сделать, а тут не знаю как...
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
enum {EMPLOYEE_COUNT=100, NAME_LEN_MAX=100,LNAME_LEN_MAX=100};
typedef struct {
char name[NAME_LEN_MAX];
char lname[LNAME_LEN_MAX];
int rate;
} employee_t;
int get_empl_from_db(const char * file_name, employee_t * list);
void print_empl_list(employee_t * list, size_t count);
static int cmpbyname(const void * p1, const void * p2);
static int cmpbylname(const void * p1, const void * p2);
static int cmpbyrate(const void * p1, const void * p2);
void sort(employee_t * list,size_t count, int (*cmpitems)(const void * p1, const void * p2));
void save_db(const char * file_name, employee_t * list, size_t count);
void add(employee_t new_empl, employee_t * list, size_t count);
void delete(size_t del_index, employee_t * list, size_t &count);
int main(int argc, char** argv){
size_t empl_count=0;
employee_t * empl_list = calloc(EMPLOYEE_COUNT,sizeof(employee_t));
empl_count = get_empl_from_db("db.txt",empl_list);
if(empl_count==0){
fprintf(stderr,"Empty database or error reading\n");
exit(EXIT_FAILURE);
}
printf("%d\n",empl_count);
print_empl_list(empl_list, empl_count);
sort(empl_list,empl_count,cmpbyrate);
print_empl_list(empl_list, empl_count);
exit(EXIT_SUCCESS);
}
int get_empl_from_db(const char * file_name, employee_t * list) {
FILE * db_file = fopen(file_name,"rt");
if(db_file == NULL) return 0;
int i;
for(i=0; !feof(db_file) && i < EMPLOYEE_COUNT; i++)
if(fscanf(db_file,"%s %s %d",list[i].name,list[i].lname,&list[i].rate)!=3)
break;
fclose(db_file);
return i;
}
void save_db(const char * file_name, employee_t * list, size_t count) {
FILE * db_file = fopen(file_name,"wt");
if(db_file == NULL) return;
for(int i=0; i < count; i++)
fprintf(db_file,"%s %s %d\n",list[i].name,list[i].lname,list[i].rate);
fclose(db_file);
}
void add(employee_t new_empl, employee_t * list, size_t count) {
if(count == EMPLOYEE_COUNT)
return;
list[count]=new_empl;
}
void delete(size_t del_index, employee_t * list, size_t &count) {
if(del_index >= count)
return;
else
for(int i = del_index; i<*count-1; i++)
list[i]=list[i+1];
--(*count);
}
void print_empl_list(employee_t * list, size_t count) {
for(int i = 0; i < count; i++)
printf("%d %s %s %d\n",i+1,list[i].name,list[i].lname,list[i].rate);
}
static int cmpbyname(const void * p1, const void * p2){
return strcmp(((employee_t *)p1)->name, ((employee_t *)p2)->name);
}
static int cmpbylname(const void * p1, const void * p2){
return strcmp(((employee_t *)p1)->lname, ((employee_t *)p2)->lname);
}
static int cmpbyrate(const void * p1, const void * p2){
return (((employee_t *)p1)->rate == ((employee_t *)p2)->rate)?0
:((((employee_t *)p1)->rate < ((employee_t *)p2)->rate)?-1:1);
}
/* sorting array with qsort() function and refreshing*/
void sort(employee_t * list,size_t count, int (*cmpitems)(const void * p1, const void * p2)){
qsort(list, count, sizeof(employee_t), cmpitems);
}
формат входного файла
Код:
имя фамилия рейтинг
имя фамилия рейтинг
Особо не форматировал код, чтение БД, сохранение, сортировка по любому полю, удаление и добавление есть. Интерфейс делай какой хочешь. Проблемы переполнения буфферов количества работников и имени/фамилии я не рассматривал, т.к. это не приоритетные вопросы в контексте текущей задачи.
ПЫ.СЫ. код нужно компилировать в стандарте языка С от 99-го года (с99). Лучше всего для этого подходит gcc (ему в make-файле или из консоли надо указать -std=c99). Есть еще варианты типа Пеллеса и ЛЦЦ, но лучше этого не делать. BC и TC, скорее всего, выдадут несколько ошибок, потому что они нифига не соблюдали стандарт никогда да и разработка этих сред закончилась много ранее появления 99-го стандарта языка С.
ПЫ.ПЫ.СЫ. Если сделаешь что-то на этой основе. то разберись, что такое функция qsort(). Подозреваю, что это лаба на ранних курсах института, прикольно будет если напугаешь препода знанием таких методов.
Последний раз редактировалось ss88; 08.06.2009 в 21:19..
|
|
|

08.06.2009, 23:06
|
|
Участник форума
Регистрация: 08.02.2008
Сообщений: 116
Провел на форуме: 1608432
Репутация:
158
|
|
ниже кусок кода. как сделать чтобы не открывалась стразу страница OpenURL("http://forum.antichat.ru/"); а вводился адресс вручную?
Код:
void main(void) {
char *result=OpenURL("http://forum.antichat.ru/");
if (result) {
printf("%s",result);
free(result);
}
else {
printf("Error # WSABASEERR+%d\n",WSAGetLastError()-WSABASEERR);
}
|
|
|

08.06.2009, 23:27
|
|
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме: 298300
Репутация:
128
|
|
Сообщение от s_p_a_m
ниже кусок кода. как сделать чтобы не открывалась стразу страница OpenURL("http://forum.antichat.ru/"); а вводился адресс вручную?
Код:
void main(void) {
char *result=OpenURL("http://forum.antichat.ru/");
if (result) {
printf("%s",result);
free(result);
}
else {
printf("Error # WSABASEERR+%d\n",WSAGetLastError()-WSABASEERR);
}
Код:
char URL[1024]="";
(void)scanf("%s",URL);
char *result=OpenURL(URL);
+ лучше не проверяй строку просто так вот, лучше сравнивай с null. Это касается и всех остальных типов.
Последний раз редактировалось ss88; 08.06.2009 в 23:30..
|
|
|

09.06.2009, 02:00
|
|
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме: 2866942
Репутация:
350
|
|
[C++]
народ плз напише ф-цию сортировки масива с помощью указателей.... именно их потому что я масив буду сортировать несколько раз и с разными исходными даными(от какого елемента до какого)...
|
|
|

09.06.2009, 02:38
|
|
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме: 298300
Репутация:
128
|
|
Сообщение от Roston
[C++]
народ плз напише ф-цию сортировки масива с помощью указателей.... именно их потому что я масив буду сортировать несколько раз и с разными исходными даными(от какого елемента до какого)...
не совсем понятно условие, заюзай qsort() или уточни свою проблему
|
|
|

09.06.2009, 10:05
|
|
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме: 2866942
Репутация:
350
|
|
ну вот будет даваццо масив.... и его надо будет сортировать несколько раз... суть в том что сортировка будет каждый раз происходить не с 0 елемента а с какого нить другого, и заканчиваццо не последним а заданым... и каждый раз один елемент(сам уже сделаю) будет заносиццо в другой масив.... при следующей сортировки один елемент опять же будет заносиццо в масив созданый при первой сортировке.....
почему указатели??? потому что при перврй сортировке собьеться порядок елементов.... а при каждой следующей надо сохранять самый первый, тобишь исходный порядок.... так яснее?
|
|
|

09.06.2009, 11:33
|
|
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме: 4205500
Репутация:
930
|
|
А в чем проблема? Просто в цикле сортировки к указателю прибавляешь i, чтобы получать следующий элемент. А так тоже самое.
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|