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

Разделение функции - C++

Восстановить пароль Регистрация
 
korsarqa
 Аватар для korsarqa
7 / 7 / 0
Регистрация: 06.12.2011
Сообщений: 170
06.06.2012, 14:36     Разделение функции #1
Вообщем вот задание:
Пусть имеется файл с текстовыми данными (размер не менее 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
#include <iostream>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
 
using namespace std;
 
bool isVowel(char c) {
    return (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='A' || c=='E' || c=='I' || c=='O' || c=='U');
}
 
bool sentEnd(char c) {
    return (c=='.' || c=='!' || c=='?');
}
 
int countSymbols(char *fileName) {
    int res=0;
    char c;
    FILE *f=fopen(fileName, "r");
    while ((c = fgetc(f)) != EOF) {
        if (c != 10 && c != 13) {
            res++;
        }
    }
    fclose(f);
    return res;
}
 
struct numStat {
    int vowel;
    int consonant;
    int word;
    int sentances;
};
void main(){
    setlocale(LC_ALL,"");
    const int MAX_PATH = 256;
    char *fileName= new char[MAX_PATH];
    cout << "Путь к файлу: "<<endl; 
    cin >> fileName;
    FILE *f=fopen(fileName, "r");
    struct numStat count; 
    
    char c;
    count.vowel=0;
    count.consonant=0;
    count.word=0;
    count.sentances=0;
    int i=0, res;
    int strLen=0;
 
        
    if (f) {
        res=countSymbols(fileName);
        while((c=getc(f))!=EOF) {
            if ((c>='a' && c<='z') || (c>='A' && c<='Z')) {
                if (isVowel(c)) {
                    count.vowel++;
                } else {
                    count.consonant++;
                } 
            } else if (c==' ' || c=='\n') {
                if (strLen>0) count.word++;
                if (c == '\n') strLen=-1;
            } else if (sentEnd(c)) {
                count.sentances++;
            }
 
            strLen++;
        }
 
    system("cls");
    cout<<"Статистика:"<<endl<<endl<<endl;
    cout<<"Всего предложений: "<<count.sentances<<endl;
    cout<<"Всего слов: "<<count.word+1<<endl;
    cout<<"Всего букв: "<<res<<endl;
    cout<<"Гласных в тексте: "<<count.vowel<<endl;
    cout<<"Согласных в тексте: "<<count.consonant<<endl;
    cout<<"Средняя длина слова: "<<res/(count.word+1)<<endl;
    cout<<"Средняя длина предложения: "<<(count.word+1)/count.sentances<<endl;
    getch();
    } else {
        cout << "Файл не найден!" << endl;
        getch();
    }
    
}
Все работает, все хорошо. Но у меня здесь стоит еще одна задача. Функцию main мне надо разделить на 2 функции( в 1 расчет необходимых данных, во 2 просто вывод).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.06.2012, 14:36     Разделение функции
Посмотрите здесь:

C++ Разделение файла.
Разделение числа C++
разделение массива C++
C++ Разделение на файлы
C++ Разделение строки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
06.06.2012, 14:56     Разделение функции #2
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
#include <cctype>
#include <сstdio>
#include <iostream>
#include <string>
 
using namespace std;
 
bool isVowel(char c) {
    return (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='A' || c=='E' || c=='I' || c=='O' || c=='U');
}
 
bool sentEnd(char c) {
    return (c=='.' || c=='!' || c=='?');
}
 
int countSymbols(FILE* f) {
    int res=0;
    char c;
    while ((c = fgetc(f)) != EOF)
        if (c != 10 && c != 13)
            res++;
    return res;
}
 
struct numStat {
    int vowel;
    int consonant;
    int word;
    int sentances;
};
 
numStat GetStat(FILE* f) {
    numStat count;
    char c;
    count.vowel = 0;
    count.consonant = 0;
    count.word = 0;
    count.sentances = 0;
    int strLen;
    while((c=getc(f))!=EOF) {
        if ((c>='a' && c<='z') || (c>='A' && c<='Z')) {
            if (isVowel(c))
                count.vowel++;
            else
                count.consonant++;
        } else if (c==' ' || c=='\n') {
            if (strLen>0) count.word++;
            if (c == '\n') strLen=-1;
        } else if (sentEnd(c))
            count.sentances++;
 
        strLen++;
    }
    return count;
}
 
void PrintStat(const numStat& count, int res) {
    cout << "Статистика:" << endl << endl << endl;
    cout << "Всего предложений: " << count.sentances << endl;
    cout << "Всего слов: " << count.word+1 << endl;
    cout << "Всего букв: " << res << endl;
    cout << "Гласных в тексте: " << count.vowel << endl;
    cout << "Согласных в тексте: " << count.consonant << endl;
    cout << "Средняя длина слова: " << res/(count.word+1) << endl;
    cout << "Средняя длина предложения: " << (count.word+1)/count.sentances << endl;
}
 
void main() {
    setlocale(LC_ALL,"");
    cout << "Путь к файлу: " << endl; 
    string fileName;
    getline(cin, fileName);
    FILE *f = fopen(fileName.data(), "r");
 
    if (f) {
        system("cls");
        int res = countSymbols(f);
        fclose(f);
        f = fopen(fileName.data(), "r");
        PrintStat(GetStat(f), res);
        fclose(f);
    } else
        cerr << "Файл не найден!" << endl;
    system("pause");
}
korsarqa
 Аватар для korsarqa
7 / 7 / 0
Регистрация: 06.12.2011
Сообщений: 170
06.06.2012, 18:20  [ТС]     Разделение функции #3
Переделал благодаря вышенаписанному:
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
#include <iostream>
#include <stdio.h>
#include <ctype.h>
#include <conio.h>
 
using namespace std;
 
bool isVowel(char c) {
    return (c=='a' || c=='e' || c=='i' || c=='o' || c=='u' || c=='A' || c=='E' || c=='I' || c=='O' || c=='U');
}
 
bool sentEnd(char c) {
    return (c=='.' || c=='!' || c=='?');
}
 
int countSymbols(char *fileName) {
    int res=0;
    char c;
    FILE *f=fopen(fileName, "r");
    while ((c = fgetc(f)) != EOF) {
        if (c != 10 && c != 13) {
            res++;
        }
    }
    fclose(f);
    return res;
}
 
struct numStat {
    int vowel;
    int consonant;
    int word;
    int sentances;
};
int raschet() {
    struct numStat count;
    char c;
    count.vowel=0;
    count.consonant=0;
    count.word=0;
    count.sentances=0;
    int i=0, res;
    int strLen=0;
    const int MAX_PATH = 256;
    char *fileName= new char[MAX_PATH];
    cout << "Путь к файлу: "<<endl; 
    cin >> fileName;
    FILE *f=fopen(fileName, "r");
        
    if (f) {
        res=countSymbols(fileName);
        while((c=getc(f))!=EOF) {
            if ((c>='a' && c<='z') || (c>='A' && c<='Z')) {
                if (isVowel(c)) {
                    count.vowel++;
                } else {
                    count.consonant++;
                } 
            } else if (c==' ' || c=='\n') {
                if (strLen>0) count.word++;
                if (c == '\n') strLen=-1;
            } else if (sentEnd(c)) {
                count.sentances++;
            }
 
            strLen++;
        }
    } else {
        cout << "Файл не найден!" << endl;
        getch();
    }
    return count;
    }
void main(const numStat& count, int res){
    setlocale(LC_ALL,""); 
    system("cls");
    cout<<"Статистика:"<<endl<<endl<<endl;
    cout<<"Всего предложений: "<<count.sentances<<endl;
    cout<<"Всего слов: "<<count.word+1<<endl;
    cout<<"Всего букв: "<<res<<endl;
    cout<<"Гласных в тексте: "<<count.vowel<<endl;
    cout<<"Согласных в тексте: "<<count.consonant<<endl;
    cout<<"Средняя длина слова: "<<res/(count.word+1)<<endl;
    cout<<"Средняя длина предложения: "<<(count.word+1)/count.sentances<<endl;
    getch();
}
Ошибка: не компилируется, все дело в том, что я не знаю как надо возвращать значение
C++
1
    return count;
не работает

Добавлено через 20 минут
Блин помогите
Кот Ангенс
 Аватар для Кот Ангенс
317 / 267 / 37
Регистрация: 24.05.2012
Сообщений: 629
06.06.2012, 19:04     Разделение функции #4
Цитата Сообщение от korsarqa Посмотреть сообщение
C++
1
int raschet()
Цитата Сообщение от korsarqa Посмотреть сообщение
C++
1
return count;
Несоответствие типов. Нужно numStat raschet();
Цитата Сообщение от korsarqa Посмотреть сообщение
C++
1
void main(const numStat& count, int res)
main не может принимать такие аргументы.
Yandex
Объявления
06.06.2012, 19:04     Разделение функции
Ответ Создать тему
Опции темы

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