Форум программистов, компьютерный форум CyberForum.ru

Интегрированные структуры данных, записи - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Изменения константного значения http://www.cyberforum.ru/cpp-beginners/thread543472.html
Всем привет, вопрос такой. Пытаюсь разобраться с приведением типов, в частности с изменением const значений через указатель. Вот код: #include <cstdlib> #include <iostream> using namespace std; int main(int argc, char* argv){
C++ Замер времени(тактов процессора) выполнения процедуры Почему то замер дает отрицательный результат (при просмотре в режиме дебаг) и на выходе 0 в итоге. clock_t start, end; start = clock(); element = LinearSearch(Mass, count, search); end = clock(); //Print(count, Mass); if(element != -1) { cout << "\nНайдено значение в элементе " << element << '\n'; http://www.cyberforum.ru/cpp-beginners/thread543467.html
C++ Бинарный файл и вопрос о структуре
Как проверить бинарный файл на пустоту? Как проверить бинарный файл на корректность данных? Как добавить элементы в структуру? Как удалить элемент из структуры?
В чем разница между int main(){} и int main(void){}? C++
Только недавно начал изучать язык, и появилось несколько вопросов: 1) в чем разница между int main(){} и int main(void){}? 2) в чем разница между string.h string и cstring? 3) почему объявление char s="0123456789"; переполняет массив? ведь с 0 по 9 элемент 10 символов, а 10 - \0? 4) для чего нужен экземляр структуры в виде функции? т.е struct func1() {}? чем он отличается от обычной функции?...
C++ Создать функции для вычисления среднего значения и определения простого числа. http://www.cyberforum.ru/cpp-beginners/thread543398.html
Из положительных значений двух целочисленных массивов различной размерно- сти сформировать общий массив. Найти среднее арифметическое элементов, рас- положенных в массиве до первого простого числа. Создать функции для вычисле- ния среднего значения и определения простого числа. Помогите пожалуйста написать программу на С++
C++ Разработать функцию, которая для заданного натурального числа N и M возвращает их наибольший общий делитель. Привет всем кто читает эту тему! Пожалуйста, кому не трудно помогите с задачами на функци, заранее огромное спасибо. I Разработка нерекурсивных функции Разработать функцию, которая для заданного натурального числа N и M возвращает их наибольший общий делитель.С помощью данной функции: сократить дробь a/b. II Разработать рекурсивную функцию , возвращающую значение : для перевода числа из... подробнее

Показать сообщение отдельно
Глупец
23 / 23 / 1
Регистрация: 17.05.2011
Сообщений: 141
11.04.2012, 11:57     Интегрированные структуры данных, записи
student.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include "student.h"
void student::clear(void)
{
    if(_fam) delete _fam;
    if(_name) delete _name;
    if(_father) delete _father;
    if(_fakultet) delete _fakultet;
}
void student::copy(const student& obj)
{
    _fam = strdup(obj._fam);
    _name = strdup(obj._name); 
    _father = strdup(obj._father);
    _fakultet = strdup(obj._fakultet);
    _grant = obj._grant;
    _count = obj._count;
}
student::student(void)
{
    _fam = _name = _father = _fakultet = NULL;
    _grant = -1;
    _count = -1;
}
 
student::student(student& obj){copy(obj);}
student::~student(void){clear();}
 
void* student::get(int id)
{
    switch(id)
    {
        case last_name:             return (void*)_fam;
        case name:                  return (void*)_name;
        case middle_name:           return (void*)_father;
        case faculty:               return (void*)_fakultet;
        case size_the_grants:       return (void*)&_grant;
        case num_of_family_members: return (void*)&_count;
        default: return 0x0;
    }
}
 
char student::cmp(int id, student& obj)
{
    char tmp = -2;
    void *p1 = get(id), *p2 = obj.get(id);
    if(id <= faculty && p1 != NULL && p2 !=NULL) tmp = strcmp((char*)p1,(char*)p2);
    else if(*(int*)p1 != -1 && *(int*)p2 != -1)
    {
        if(*(int*)p1 > *(int*)p2) tmp = 1;
        else if(*(int*)p1 == *(int*)p2) tmp = 0;
        else tmp = -1;
    }
    return tmp;
}
 
void student::operator = (const student& obj)
{
    clear();
    copy(obj);
}
student.h:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#ifndef STUDENT_H
#define STUDENT_H
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <string.h>
 class student
 {
    char* _fam;//ТЮЛХКХЪ
    char* _name;//ХЛЪ
    char* _father;//НРВЕЯРБН
    char* _fakultet;//ТСЙСКЭРЕР
    int _grant;//ЯРХОЕМДХЪ
    int _count;//ЙНКХВЕЯРБН ВКЕМНБ ЯЕЛЭХ
    
    inline void clear(void);
    inline void copy(const student& obj);
    
    template<typename stream>
    stream& out(stream& _out);//ЬЮАКНМ БШБНДЮ
    
    template<typename stream>
    stream& in(stream& _in);//ЬЮАКНМ ББНДЮ
    
    public:
    enum
    {
        last_name = 0,
        name,
        middle_name,
        faculty,
        size_the_grants,
        num_of_family_members
    };
    
    student(void);
    student(student& obj);
    ~student(void);
    
    void* get(int id);//ДНЯРСО ОН ВРЕМХЧ Х ГЮОХЯХ Й ОНКЪЛ ЯРПСЙРСПШ
    char cmp(int id, student& obj);//БНГБПЮЫЮЕЛШЕ ГМЮВЕМХЪ ЛЕМЭЬЕ, ПЮБМН, АНКЭЬЕ( -1,0,1). -2 = cerr
    void operator = (const student& obj);
    
    //"%s\t%s\t%s\t%s\t%d\t%d\n"
    friend std::ostream& operator<<(std::ostream& _out, student& obj){ return obj.out<std::ostream>(_out);}
    friend std::ofstream& operator<<(std::ofstream& _out, student& obj)//"\enum data,\enum data..."
    { 
        if(_out.is_open())return obj.out<std::ofstream>(_out);
        return _out;
    }
    friend std::istream& operator>>(std::istream& _in, student& obj){return obj.in<std::istream>(_in);}
    friend std::ifstream& operator>>(std::ifstream& _in, student& obj)
    {
        if(_in.is_open())return obj.in<std::ifstream>(_in);
        return _in;
    }
 };
 
 
template<typename stream>
stream& student::out(stream& _out)
{ 
    _out<<((_fam != NULL) == true ? _fam : "\t")<<'\t'
        <<((_name != NULL) == true ? _name : "\t")<<'\t'
        <<((_father != NULL) == true ? _father : "\t")<<'\t'
        <<((_fakultet != NULL) == true ? _fakultet : "\t")<<'\t';
    _grant != -1 == true ? _out<<_grant<<'\t' : _out<<"\t\t";
    if(_count != -1 == true) _out<<_count;
    return _out;
}                   
 
inline char* gchar(char* str, char ch)
{
    while(*str != ch && *str != 0 )str++;
    *str = 0;
    return str;
}
inline bool cmp(const char* test,const char* val1,int val2)
{
    if(strlen(test) == 1 && *test - '0' == val2)return true;
    else if(strcmp(test,val1) == 0)return true;
    return false;
}
inline char* getstr(char* str)
{
    while(*str != '\\' && *str != 0 )str++;
    if(*str == 0)return str;
    str--;
    if(*str != ',')return 0x0;
    *str = 0;
    return str + 1;
}
template<typename stream>
stream& student::in(stream& _in)
{
    clear();
    char buf[512],* pos = buf, *tmp;
    _in.getline(buf,512);
    while( *pos != 0 )
    {
        if(*pos != '\\'){std::cerr<<"an incorrect entry"<<std::endl; return _in;}
        pos++;
        tmp = gchar(pos,' ') + 1;
        if(::cmp(pos,"last_name" , 0))
            {pos = getstr(tmp); _fam = strdup(tmp);} 
        else if(::cmp(pos,"name", 1))
            {pos = getstr(tmp); _name = strdup(tmp);}
        else if(::cmp(pos,"middle_name",2))
            {pos = getstr(tmp); _father = strdup(tmp);}
        else if(::cmp(pos,"faculty",3))
            {pos = getstr(tmp); _fakultet = strdup(tmp);}
        else if(::cmp(pos,"size_the_grants",4))
            {pos = getstr(tmp); _grant = atoi(tmp);}
        else if(::cmp(pos,"num_of_family_members",5))
            {pos = getstr(tmp); _count = atoi(tmp);}
        else{std::cerr<<"an incorrect entry"<<std::endl; return _in;}
        if( pos == NULL){std::cerr<<"an incorrect entry"<<std::endl; return _in;}
    }
    return _in;
}
#endif
testest.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include "student.h"
 
/*
1 Для заданной предметной области разработать описание объектов этой области. 
    Разработать процедуры, реализующие базовые операции над этими объектами, в частности:
 * текстовое ввода-вывода (консольное и файловый)
 * присвоения;
 * задания константных значений;?????что имеется ввиду?
 * сравнения (не менее 2 типа).
 
 2 Подготовить файл исходных данных, содержащие не менее 10 значений конкретных объектов.
 
 3 Используя процедуры и описания модуля типа данных, разработать программу, 
    обеспечивающую ввод исходных данных с первого файла данных в память и 
    хранение в массиве, сортировки массива по алфавитному и по числовым параметром.
 Для каждой области перечислены параметры объекта. 
 Среди параметров обязательно ключевое алфавитное поле (например, фамилия), 
 которое идентифицирует объект, у каждого объекта есть также одно или несколько 
 числовых полей, по которым возможные обращения к объекту.
 
 Набор характеристик может быть расширен и усложнен на усмотрение исполнителя.
 
Задание
 Быт студентов:фамилия студента, имя, отчество, факультет, размер стипендии, количество членов семьи*/
 
#define SZ 6
 
int cmp1(const void*,const void*);
int cmp2(const void*, const void*);
int main(void)
{ 
    student tmp[SZ];
    std::ifstream _in("test.txt", std::ios::in);
    for(int i = 0; i < SZ; i++)
    {
        _in>>tmp[i];//демонстрация чтения из файла
        std::cout<<tmp[i]<<std::endl;//вывода в консоль
    }
    
    std::cout<<"sort by last name:"<<std::endl;
    qsort(tmp,SZ,sizeof(student),cmp1);//сортировка по фамилии
    for(int i = 0; i < SZ; i++)std::cout<<tmp[i]<<std::endl;
    
    std::cout<<"sort by size the grants:"<<std::endl;
    qsort(tmp,SZ,sizeof(student),cmp2);//сортировка по размеру степендии
    for(int i = 0; i < SZ; i++)std::cout<<tmp[i]<<std::endl;
    
    *(int*)tmp[0].get(student::size_the_grants) = 3000;//доступ на запись(изменили степендию первого студента)
 
    std::cout<<"sort by size the grants:"<<std::endl;
    qsort(tmp,SZ,sizeof(student),cmp2);//снова отсортировали по степендии
    for(int i = 0; i < SZ; i++)std::cout<<tmp[i]<<std::endl;
 
    return 0;
}
 
int cmp1(const void* p1, const void* p2)
{
    int tmp = ((student*)p1)->cmp(student::last_name,*(student*)p2);
    return tmp == -2 ? 1 : tmp;
}
 
int cmp2(const void* p1, const void* p2)
{
    int tmp = ((student*)p1)->cmp(student::size_the_grants,*(student*)p2);
    return tmp == -2 ? 1 : tmp;
}
test.txt:
Код
\0 romanov,\1 evgeniy,\2 leonidovich,\3 AVTF,\4 1500,\5 0
\0 romanenko,\1 tatyana,\2 alleksandrovna,\3 AVTF,\4 2000,\5 4
\0 chulanova,\1 elena,\2 alleksandrovna,\3 FEN,\4 4000,\5 5
\0 nikolaev,\1 egor,\2 dmitrievich,\3 AVTF,\4 0,\5 1
\0 gugov,\1 boris,\2 ivanovich,\3 AVTF,\4 5000,\5 3
\0 romanov,\1 anatoliy,\2 borisovich,\3 otchislen,\4 0,\5 6
как понял так и сделал, в принципе если что-то не учтено в демострации легко можешь исправить
 
Текущее время: 18:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru