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

Файлы и функции - C++

Восстановить пароль Регистрация
 
maddoxx
0 / 0 / 0
Регистрация: 17.02.2013
Сообщений: 24
17.02.2013, 03:44     Файлы и функции #1
Доброго времени суток.
У меня есть следующий код
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
#include <stdio.h>
#include <conio.h>
#include <iostream>
 
#define size 2
#define buf 256
#define dSize 10
#define NULL 0
 
struct train
{
    char name[buf];
    int  number;
    char date[dSize];
}; 
 
extern void input(train *mas);
extern void output(train *mas);
extern void sort(train *mas);
 
void main()
{ 
    train *mas;
    mas = new train [size]; 
    if (mas != NULL)
    {
        input(mas);
        sort(mas);
        output(mas);
    }
    else
        printf("\nMenory error!\n");
    _getch();
}
 
void input(train *mas)
{
    register int i,j;
    printf("\nInput information\n");
    for(i=0; i<size; i++)
    {
        fflush(stdin);
        printf("\n\nInput name for element [%d]: ",i+1);    //Считываем название поезда до нажатия Enter или до конца буфера (256 символов)
        for(j=0; j<buf; j++)
        {
            char tmp;
            scanf("%c",&tmp);
            if (tmp == '\n')
            {
                mas[i].name[j] = '*';
                j=buf;
            }
            else
                mas[i].name[j] = tmp;
        }
 
        fflush(stdin);
        printf("Input number for element [%d]: ",i+1);      //Считываем номер поезда
        scanf("%d",&mas[i].number);
 
        fflush(stdin);
        printf("Input date for element [%d] (format xx.xx.xxxx): ",i+1);    //Считываем дату отправления (10 символов с разделителем '.')
        for(j=0; j<dSize; j++)
            scanf("%c",&mas[i].date[j]);
    }
}
 
void output(train *mas)
{
    register int i,j;
    system("cls");
    printf("\nOutput information\n");
    for(i=0; i<size; i++)
    {
        printf("\n\nElement [%d]",i+1);         //Какой номер елемента выводим
        printf("\nName: ");                     //Выводим имя
        for(j=0; j<buf; j++)
        {
            if (mas[i].name[j] == '*')          //До первого искуственно образованного символа конца строки
                j = buf;
            else
                printf("%c",mas[i].name[j]);
        }
        printf("\nNumber: %d",mas[i].number);   //Выводим номер
        printf("\nDate: ");                     
        for(j=0; j<dSize; j++)
            printf("%c",mas[i].date[j]);            //Выводим дату
    }
}
 
void sort(train *mas)
{
    register int i,j;
    for(i=0; i<size-1; i++)
        for(j=i+1; j<size; j++)
            if (mas[i].name[0] > mas[j].name[0])
            {
                fflush(stdin);
                train swap = mas[i];
                mas[i] = mas[j];
                mas[j] = swap;
            }
}
Помогите пожалуйста вынести любую из функций в отдельный файл, сам пытался ничего не получилось.
Суть задания была такая:
В каждом задании по возможности ввод, вывод, сортировку оформить как отдельные функции (применить к этим функциям классы хранения), функцию сортировки массива структур поместить в отдельный файл, структурную переменную объявить как статическую, счетчики циклов объявить как регистровые переменные, передачу значений осуществить через внешние переменные, осуществить динамическое распределение памяти под структуры.
Заранее спасибо
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.02.2013, 03:44     Файлы и функции
Посмотрите здесь:

Файлы и функции C++
Файлы + функции C++
C++ структуры, функции, файлы
C++ Функции и файлы
Функции,файлы, структуры C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
СПП
25 / 25 / 2
Регистрация: 15.12.2012
Сообщений: 71
17.02.2013, 05:28     Файлы и функции #2
Цитата Сообщение от maddoxx Посмотреть сообщение
Помогите пожалуйста вынести любую из функций в отдельный файл
Что-то вроде этого??? - каждая функция в отдельном файле, я думаю вы об этом просили

main.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
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
 
#include "struct_train.h"
#include "input.cpp"
#include "output.cpp"
#include "sort.cpp"
 
#define size 2
#define buf 256
#define dSize 10
#define NULL 0
 
 
extern void input(train *mas);
extern void output(train *mas);
extern void sort(train *mas);
 
int main()
{ 
    train *mas;
    mas = new train [size]; 
    if (mas != NULL)
    {
        input(mas);
        sort(mas);
        output(mas);
    }
    else
        printf("\nMenory error!\n");
    _getch();
 
return 0;
}
train.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef     train_h
#define     train_h
 
#define size 2
#define buf 256
#define dSize 10
#define NULL 0
 
struct train
{
    char name[buf];
    int  number;
    char date[dSize];
}; 
 
 
#endif  // train_h
input.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
#ifndef     input_cpp
#define     input_cpp
 
#include "struct_train.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
 
#define size 2
#define buf 256
#define dSize 10
#define NULL 0
 
void input(train *mas)
{
    register int i,j;
    printf("\nInput information\n");
    for(i=0; i<size; i++)
    {
        fflush(stdin);
        printf("\n\nInput name for element [%d]: ",i+1);    //Считываем название поезда до нажатия Enter или до конца буфера (256 символов)
        for(j=0; j<buf; j++)
        {
            char tmp;
            scanf("%c",&tmp);
            if (tmp == '\n')
            {
                mas[i].name[j] = '*';
                j=buf;
            }
            else
                mas[i].name[j] = tmp;
        }
 
        fflush(stdin);
        printf("Input number for element [%d]: ",i+1);      //Считываем номер поезда
        scanf("%d",&mas[i].number);
 
        fflush(stdin);
        printf("Input date for element [%d] (format xx.xx.xxxx): ",i+1);    //Считываем дату отправления (10 символов с разделителем '.')
        for(j=0; j<dSize; j++)
            scanf("%c",&mas[i].date[j]);
    }
}
 
#endif  // input.cpp
output.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
#ifndef     output_cpp
#define     output_cpp
 
#include "struct_train.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
 
#define size 2
#define buf 256
#define dSize 10
#define NULL 0
 
void output(train *mas)
{
    register int i,j;
    system("cls");
    printf("\nOutput information\n");
    for(i=0; i<size; i++)
    {
        printf("\n\nElement [%d]",i+1);         //Какой номер елемента выводим
        printf("\nName: ");                     //Выводим имя
        for(j=0; j<buf; j++)
        {
            if (mas[i].name[j] == '*')          //До первого искуственно образованного символа конца строки
                j = buf;
            else
                printf("%c",mas[i].name[j]);
        }
        printf("\nNumber: %d",mas[i].number);   //Выводим номер
        printf("\nDate: ");                     
        for(j=0; j<dSize; j++)
            printf("%c",mas[i].date[j]);            //Выводим дату
    }
}
 
#endif // output_cpp
sort.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
#ifndef     sort_cpp
#define     sort_cpp
 
#include "struct_train.h"
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <stdlib.h>
 
#define size 2
#define buf 256
#define dSize 10
#define NULL 0
 
void sort(train *mas)
{
    register int i,j;
    for(i=0; i<size-1; i++)
        for(j=i+1; j<size; j++)
            if (mas[i].name[0] > mas[j].name[0])
            {
                fflush(stdin);
                train swap = mas[i];
                mas[i] = mas[j];
                mas[j] = swap;
            }
}
 
#endif  // sort_cpp
maddoxx
0 / 0 / 0
Регистрация: 17.02.2013
Сообщений: 24
17.02.2013, 12:31  [ТС]     Файлы и функции #3
Да спасибо большое, именно это мне и нужно было
Вот только еще вопрос есть что и для чего нужно вот это:
C++
1
2
#ifndef     input_cpp
#define     input_cpp
и в каждом файле так. Это вроде бы макросы какие то?

Добавлено через 18 минут
Вот что у меня получилось:
source.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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include "train.h"
#include "sort.cpp"
 
#define size 2
#define buf 256
#define dSize 10
#define NULL 0
 
extern void input(train *mas);
extern void output(train *mas);
extern void sort(train *mas);
 
void main()
{ 
    static train *mas;
    mas = new train [size]; 
    if (mas != NULL)
    {
        input(mas);
        sort(mas);
        output(mas);
    }
    else
        printf("\nMenory error!\n");
    _getch();
}
 
void input(train *mas)
{
    register int i,j;
    printf("\nInput information\n");
    for(i=0; i<size; i++)
    {
        fflush(stdin);
        printf("\n\nInput name for element [%d]: ",i+1);    //Считываем название поезда до нажатия Enter или до конца буфера (256 символов)
        for(j=0; j<buf; j++)
        {
            char tmp;
            scanf("%c",&tmp);
            if (tmp == '\n')
            {
                mas[i].name[j] = '*';
                j=buf;
            }
            else
                mas[i].name[j] = tmp;
        }
 
        fflush(stdin);
        printf("Input number for element [%d]: ",i+1);      //Считываем номер поезда
        scanf("%d",&mas[i].number);
 
        fflush(stdin);
        printf("Input date for element [%d] (format xx.xx.xxxx): ",i+1);    //Считываем дату отправления (10 символов с разделителем '.')
        for(j=0; j<dSize; j++)
            scanf("%c",&mas[i].date[j]);
    }
}
 
void output(train *mas)
{
    register int i,j;
    system("cls");
    printf("\nOutput information\n");
    for(i=0; i<size; i++)
    {
        printf("\n\nElement [%d]",i+1);         //Какой номер елемента выводим
        printf("\nName: ");                     //Выводим имя
        for(j=0; j<buf; j++)
        {
            if (mas[i].name[j] == '*')          //До первого искуственно образованного символа конца строки
                j = buf;
            else
                printf("%c",mas[i].name[j]);
        }
        printf("\nNumber: %d",mas[i].number);   //Выводим номер
        printf("\nDate: ");                     
        for(j=0; j<dSize; j++)
            printf("%c",mas[i].date[j]);            //Выводим дату
    }
}
train.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef     train_h
#define     train_h
 
#define size 2
#define buf 256
#define dSize 10
 
struct train
{
    char name[buf];
    int  number;
    char date[dSize];
}; 
 
#endif  // train_h
sort.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
#ifndef     sort_cpp
#define     sort_cpp
 
#include "train.h"
#include <stdio.h>
 
#define size 2
 
void sort(train *mas)
{
    register int i,j;
    for(i=0; i<size-1; i++)
        for(j=i+1; j<size; j++)
            if (mas[i].name[0] > mas[j].name[0])
            {
                fflush(stdin);
                train swap = mas[i];
                mas[i] = mas[j];
                mas[j] = swap;
            }
}
 
#endif  // sort_cpp
И вот такие ошибки:
1. error LNK2005: "void __cdecl sort(struct train *)" (?sort@@YAXPAUtrain@@@Z) уже определен в sort.obj C:\Documents and Settings\Admin\Рабочий стол\rampage\rampage\source.obj
2. error LNK1169: обнаружен многократно определенный символ - один или более C:\Documents and Settings\Admin\Рабочий стол\rampage\Debug\rampage.exe 1

Я тут прочитал что нельзя заголовочный файл включать куда любо более одного раза. Может быть ошибки из за этого?

Добавлено через 12 минут
Все спасибо, исправил тем что создал отдельный заголовочный файл для функции в котором вот такой код
C++
1
2
3
4
5
6
#ifndef     sort_h
#define     sort_h
 
extern void sort(train *mas);
 
#endif  // sort_h
и подключал уже его к головному модулю
СПП
25 / 25 / 2
Регистрация: 15.12.2012
Сообщений: 71
17.02.2013, 14:46     Файлы и функции #4
Цитата Сообщение от maddoxx Посмотреть сообщение
Да спасибо большое, именно это мне и нужно было
Вот только еще вопрос есть что и для чего нужно вот это: Код C++1
2
C++
1
2
#ifndef * * input_cpp
#define * * input_cpp
и в каждом файле так. Это вроде бы макросы какие то?
в народе их называют инпут-гуарды или как-то так, они не дают опасности включить один и тот же файл повторно
допустим есть главный файл
C++
1
2
// главный файл main.cpp
int main(){return 0;}
и есть 1 хидер
C++
1
2
3
4
5
6
7
8
//1 хидер head.h
// где включены такие библиотеки 
#include <iostream>
#include <clocale>
#include <cstdlib>
 
//и внимание
#include "__file2.cpp"
допустим в _file2.cpp тоже нужно работать с
C++
1
#include <iostream>
и получается что мы подключаем 2 раза одну и туже библиотеку, и компилятор на это будет ругаться





Если разбирать вот это конструкцию из макросов
C++
1
2
3
4
#ifndef     __file.cpp
#define    __file.cpp
    /* . . . */
#endif
то компиляция поисходит так
считывает перваыю сторочку #ifndef __file.cpp
то компилятор считывает эту ликсемы и принимает значение true так как раньше она не была определена
вторая строчка #define __file.cpp определяет эту ликсему

если компилятор в каком-то другом файле вновь включает эту строку то она определяется как false
и переходит к #else - (его тут нету, я им непользуюсь в таких случаях) или к
#endif - как в нашем варианте
и непозволяет подключить библиотеку дважды


Не по теме:

Как то так, я надеюсь более опытные программисты дополнят мой ответ, или исправят его))
но общие черты я помоему оюьяснил

Yandex
Объявления
17.02.2013, 14:46     Файлы и функции
Ответ Создать тему
Опции темы

Текущее время: 23:50. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru