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

Сводная таблица - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ две окружности http://www.cyberforum.ru/cpp-beginners/thread245166.html
На плоскости даны две окружности. Ваша задача – найти все их общие точки. Формат входных данных В первой строке входного файла находится число K (1 <= K <= 10 000) – количество пар окружностей. Каждая последующая пара строк описывает пару окружностей: в каждой строке записаны 3 целых числа x, y, r – координаты центра и радиус соответствующей окружности (−1 000 <= x, y <= 1 000, 0 < r <= 1...
C++ описание массивов Подскажите, есть 2 cpp файла void Raschet(int **const iMatrix, double *n, const int iNum_x, const int iNum_y) { int s; n = new double ; for (int j=0; j<iNum_x; j++) { s=0; for (int i=0; i<iNum_y; i++) http://www.cyberforum.ru/cpp-beginners/thread245163.html
сортировка массива1 C++
Дан массив из 20 целых чисел со значениями от 1 до 20. Необходимо: написать функцию, разбрасывающую элементы массива произвольным образом; создать случайное число из того же диапазона и найти позицию этого случайного числа в массиве; отсортировать элементы массива, находящиеся слева от найденной позиции по убыванию, а элементы массива, находящиеся справа от найденной позиции по...
сортировка массива C++
Доброе время суток,уважаемые коллеги!помогите с задачей.не могу определиться,какой сортировкой лучше сделать: Дан массив чисел размерностью 10 элементов. Написать функцию, которая сортирует массив по возрастанию или по убыванию, в зависимости от третьего параметра функции. Если он равен 1, сортировка идет по убыванию, если 0, то по возрастанию. Первые 2 параметра функции - это массив и его...
C++ очень интересная задание http://www.cyberforum.ru/cpp-beginners/thread245154.html
Паша очень любит готовить сэндвичи. Свой фирменный сэндвич «Купе» он готовит из четырех главных ингредиентов: верхний кусок хлеба, ломтик сыра, ломтик ветчины и нижний кусок хлеба. Все ингредиенты имеют приямоугольную форму. Однажды он решил быстро приготовить этот сэндвич. Чтобы это сделать, он подбросил ингредиенты в воздух в надежде, что они упадут и сами сложатся в нужном порядке. Однако...
C++ Наследование Используя механизм наследования реализовать иерархию: Окружность –> Цилиндр. У базового класса присутствуют методы: конструктор, вычисление площади, вывод площади. подробнее

Показать сообщение отдельно
fasked
Эксперт С++
4933 / 2513 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
20.02.2011, 15:28     Сводная таблица
Старался как мог

employee.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
#ifndef _EMPLOYEE_H
#define _EMPLOYEE_H 1
 
#include <assert.h>
#include <stddef.h>
#include <string.h>
 
 
# define MAX_EMPLOYEE_NAME          11
# define MONTHS_PER_YEAR            12
# define EMPLOYEE_PAYMENTS_FOR_YEAR MONTHS_PER_YEAR
 
 
/*  this structure defines the employee's type 
    which includes the name and charges for the year
*/
typedef struct {
    char name[MAX_EMPLOYEE_NAME];
    int  payments[EMPLOYEE_PAYMENTS_FOR_YEAR];
} employee_t, *pemployee_t;
 
/*
*/
void employee_copy (pemployee_t destination,
                    pemployee_t source)
{
    assert(destination);
    assert(source);
 
    memcpy(destination, source, sizeof(employee_t));
}
 
#endif /* employee.h */
employeelist.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
122
123
124
125
126
127
128
129
130
131
#ifndef _EMPLOYEE_LIST_H
#define _EMPLOYEE_LIST_H 1
 
#include "employee.h"
#include <malloc.h>
 
struct _tag_node {
    struct _tag_node *next;
    employee_t employee;
};
 
/*  list for a work with employee's structure
*/
typedef struct {
    struct _tag_node *head;
    struct _tag_node *tail;
} employee_list_t, *pemployee_list_t;
 
size_t employee_list_size (pemployee_list_t list)
{
    struct _tag_node *node = NULL;
    size_t size = 0;
    assert(list);
 
    node = list->head;
    while (node != NULL) {
        ++size;
        node = node->next;
    }
 
    return size;
}
 
int employee_list_empty (pemployee_list_t list)
{
    assert(list);
    return list->head == NULL;
}
 
void employee_list_pop_front (pemployee_list_t list)
{
    struct _tag_node *node = NULL;
    assert(list);
    assert(!employee_list_empty(list));
 
    node = list->head;
    list->head = node->next;
 
    free(node);
}
 
/*  initialization of `employee's' list'
    it makes allocation of needed memory
*/
void employee_list_init (pemployee_list_t list)
{
    assert(list);
    memset(list, 0, sizeof(*list));
}
 
/*  shutdown of `employee's list'
    it makes deallocation of allocated memory
*/
void employee_list_release (pemployee_list_t list)
{
    assert(list);
    while (!employee_list_empty(list))
        employee_list_pop_front(list);
}
 
pemployee_t employee_list_front (pemployee_list_t list)
{
    assert(list);
    assert(!employee_list_empty(list));
    return &list->head->employee;
}
 
pemployee_t employee_list_back (pemployee_list_t list)
{
    assert(list);
    assert(!employee_list_empty(list));
    return &list->tail->employee;
}
 
/*  add new `employee' in the end of list
*/
void employee_list_push_back (pemployee_list_t list,
                              pemployee_t employee)
{
    struct _tag_node *node = NULL;
    assert(list);
    assert(employee);
    
    if ((node = (struct _tag_node *)malloc(sizeof(*node))) == NULL) {
        assert(node);
    }
 
    node->next = NULL;
    employee_copy(&node->employee, employee);
 
    if (employee_list_empty(list)) {
        list->head = node;
        list->tail = node;
    }
    else {
        list->tail->next = node;
        list->tail = node;
    }
}
 
/*  search the `employee' in the list by the name
*/
pemployee_t search_employee (pemployee_list_t list,
                             const char *name)
{
    struct _tag_node *node = NULL;
    assert(list);
    assert(name);
 
    node = list->head;
    while (node != NULL) {
        if (strcmp(name, node->employee.name) == 0)
            return &node->employee;
 
        node = node->next;
    }
 
    return NULL;
}
 
#endif /* employeelist.h */
indata.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
#ifndef _INPUT_DATA_H
#define _INPUT_DATA_H 1
 
 
#include <assert.h>
 
/*  maximum length of short month's name
*/
# define MAX_MONTH_NAME 4
 
 
/* short names of months 
*/
char const * month_names[MONTHS_PER_YEAR] = {
    "JAN", "FEB", "MAR", "APR", "MAY", "JUN", 
    "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"
};
 
/*  this structure defines the 
    format of the data in a input file
*/
typedef struct {
    char name[MAX_EMPLOYEE_NAME];
    char month[MAX_MONTH_NAME];
    int  payment;
} indata_t, *pindata_t;
 
/*  this makes it possible to detect index of mounth by its short name.
    if a short name of month is founded function returns its index,
    otherwise it returns -1
*/
int count_month (const char *month)
{
    int i;
    assert(month);
 
    for (i = 0; i < MONTHS_PER_YEAR; ++i)
        if (strcmp(month, month_names[i]) == 0)
            return i;
 
    return -1;
}
 
void indata_clear (pindata_t indata)
{
    assert(indata);
    memset(indata, 0, sizeof(*indata));
}
 
pindata_t indata_read (pindata_t indata, 
                       FILE * stream)
{
    assert(indata);
    assert(stream);
 
    indata_clear(indata);
    fscanf(stream, "%s %s %d", indata->name, indata->month, &indata->payment);
 
    return indata;
}
 
#endif /* indata.h */
main.c
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
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
 
#include "employeelist.h"
#include "indata.h"
 
/*  output filename and input filename should be sent 
    to the program as arguments of command line, where
    - 'argv[1]' - input filename 
    - 'argv[2]' - output filename. 
 
    for example, 'myprog file.in file.out'.
*/
# define INFILE_NAME    argv[1]
# define OUTFILE_NAME   argv[2]
 
/*  this function returns the pointer to
    clear `employee' with the name
*/
pemployee_t employee_create_new (const char *name)
{
    static employee_t employee;
    assert(name);
 
    memset(&employee, 0, sizeof(employee));
    strncpy(employee.name, name, MAX_EMPLOYEE_NAME - 1);
 
    return &employee;
}
 
/*  update information in the list
    if the `employee' already exists in the list then
    its payments updated, otherwise new employee added in the list
*/
void employee_list_update_info (pemployee_list_t list,
                                pindata_t in_data)
{
    pemployee_t pemployee;
    if ((pemployee = search_employee(list, in_data->name)) == NULL) {
        employee_list_push_back(list, employee_create_new(in_data->name));
        pemployee = employee_list_back(list);
    }
 
    pemployee->payments[count_month(in_data->month)] += in_data->payment;
}
 
int main(int argc, char **argv)
{
    /* counters */
    size_t i = 0, j = 0;
    size_t number_of_records = 0;
 
    /* filestreams */
    FILE *input_file    = NULL;
    FILE *output_file   = NULL;
 
    /* inputdata struct */
    indata_t in_data;
 
    /* list of every `employee' */
    employee_list_t summary_table;
    
 
    /* opening of the input file for read only */
    if ((input_file = fopen(INFILE_NAME, "r")) == NULL) {
        fprintf(stderr, "can't open file %s\n", INFILE_NAME);
        exit(1);
    }
 
    /* reading number of records in the input file */
    fscanf(input_file, "%d", &number_of_records);
 
    /* initialization of employee's list */
    employee_list_init(&summary_table);
 
    /* reading the input file */
    do {
        employee_list_update_info(&summary_table, indata_read(&in_data, input_file));
    } while (--number_of_records);
 
    /* closing the input file */
    fclose(input_file);
 
    /* opening the output file for writing */
    if ((output_file = fopen(OUTFILE_NAME, "w")) == NULL) {
        fprintf(stderr, "can't open file %s\n", OUTFILE_NAME);
        exit(1);
    }
 
    /* writing the summary table in output file */
    fprintf(output_file, "%d\n", employee_list_size(&summary_table));
    while (!employee_list_empty(&summary_table)) {
        fprintf(output_file, "%s ", employee_list_front(&summary_table)->name);
 
        for (j = 0; j < EMPLOYEE_PAYMENTS_FOR_YEAR; ++j)
            fprintf(output_file, "%d ", employee_list_front(&summary_table)->payments[j]);
 
        fprintf(output_file, "\n");
        employee_list_pop_front(&summary_table);
    }
 
    /* closing the output file */
    fclose(output_file);
 
    /* release the employee list */
    employee_list_release(&summary_table);
 
 
    return 0;
}
Пример результата работы.

Входные данные:
Код
8
Ivanov NOV 10
Petrov FEB 5
Ivanov JAN 2
Petrov FEB 4
Sidorov JUN 9
Petrov SEP 20
Sidorov JUL 45
Ivanov MAY 1
Выходные данные:
Код
3
Ivanov 2 0 0 0 1 0 0 0 0 0 10 0 
Petrov 0 9 0 0 0 0 0 0 20 0 0 0 
Sidorov 0 0 0 0 0 9 45 0 0 0 0 0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru