HOME    FORUMS    MEMBERS    RECENT POSTS    LOG IN  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #3071  
Старый 06.06.2009, 18:45
razb
Постоянный
Регистрация: 24.03.2009
Сообщений: 670
Провел на форуме:
2868783

Репутация: 414


Отправить сообщение для razb с помощью ICQ
По умолчанию

Цитата:
В Паскале можно было бы с помощью записей сделать, а тут не знаю как...
А тут с помощью структур)
 
Ответить с цитированием

  #3072  
Старый 06.06.2009, 19:06
Fata1ex
Постоянный
Регистрация: 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..
 
Ответить с цитированием

  #3073  
Старый 07.06.2009, 18:36
Glazz
Участник форума
Регистрация: 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..
 
Ответить с цитированием

  #3074  
Старый 08.06.2009, 14:04
ss88
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме:
298300

Репутация: 128
Отправить сообщение для ss88 с помощью ICQ
По умолчанию

Цитата:
Сообщение от 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..
 
Ответить с цитированием

  #3075  
Старый 08.06.2009, 23:06
s_p_a_m
Участник форума
Регистрация: 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);
        }
 
Ответить с цитированием

  #3076  
Старый 08.06.2009, 23:27
ss88
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме:
298300

Репутация: 128
Отправить сообщение для ss88 с помощью ICQ
По умолчанию

Цитата:
Сообщение от 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..
 
Ответить с цитированием

  #3077  
Старый 09.06.2009, 02:00
Roston
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме:
2866942

Репутация: 350
Отправить сообщение для Roston с помощью ICQ
По умолчанию

[C++]
народ плз напише ф-цию сортировки масива с помощью указателей.... именно их потому что я масив буду сортировать несколько раз и с разными исходными даными(от какого елемента до какого)...
 
Ответить с цитированием

  #3078  
Старый 09.06.2009, 02:38
ss88
Участник форума
Регистрация: 27.11.2008
Сообщений: 161
Провел на форуме:
298300

Репутация: 128
Отправить сообщение для ss88 с помощью ICQ
По умолчанию

Цитата:
Сообщение от Roston  
[C++]
народ плз напише ф-цию сортировки масива с помощью указателей.... именно их потому что я масив буду сортировать несколько раз и с разными исходными даными(от какого елемента до какого)...
не совсем понятно условие, заюзай qsort() или уточни свою проблему
 
Ответить с цитированием

  #3079  
Старый 09.06.2009, 10:05
Roston
Постоянный
Регистрация: 31.07.2008
Сообщений: 370
Провел на форуме:
2866942

Репутация: 350
Отправить сообщение для Roston с помощью ICQ
По умолчанию

ну вот будет даваццо масив.... и его надо будет сортировать несколько раз... суть в том что сортировка будет каждый раз происходить не с 0 елемента а с какого нить другого, и заканчиваццо не последним а заданым... и каждый раз один елемент(сам уже сделаю) будет заносиццо в другой масив.... при следующей сортировки один елемент опять же будет заносиццо в масив созданый при первой сортировке.....
почему указатели??? потому что при перврй сортировке собьеться порядок елементов.... а при каждой следующей надо сохранять самый первый, тобишь исходный порядок.... так яснее?
 
Ответить с цитированием

  #3080  
Старый 09.06.2009, 11:33
Fata1ex
Постоянный
Регистрация: 12.12.2006
Сообщений: 906
Провел на форуме:
4205500

Репутация: 930


По умолчанию

А в чем проблема? Просто в цикле сортировки к указателю прибавляешь i, чтобы получать следующий элемент. А так тоже самое.
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Часто задаваемые вопросы по MySQL Серый PHP 5 28.12.2006 18:26
Интернетчики задали российскому президенту очень странные вопросы podkashey Мировые новости. Обсуждения. 4 07.07.2006 16:53
Вопросы по Ipb 2.0 Voodoo_People Уязвимости CMS / форумов 26 15.02.2005 22:57



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ