Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 19.04.2016
Сообщений: 42
1

Оформление строк и файлов в виде функций

10.10.2016, 15:37. Показов 682. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот задача:
Написать программу, которая считывает текст из файла и выводит на экран сначала предложения, начинающиеся с однобуквенных слов, а затем все остальные.

Ниже вы увидите рабочий код, который нужно оформить в виде функций

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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
char  *ltrim(char * S);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    FILE *Inp;
 
    int i, j, k, Pi, Pj;
 
    char buff[500];
 
    char Phr[500][500];
 
    char c;
 
    char *Str;
 
 
    for (i = 0; i < 500; i++)
        for (j = 0; j < 500; j++)
            Phr[i][j] = 0;
 
 
 
 
 
    Inp = fopen("C:\\Users\\user\\Desktop\\Учеба\\Хохлов\\3 семестр\\txt.txt", "r");
 
    if (Inp == NULL)
    {
        cout << "Error by open!" << endl;
        system("pause");
        return -1;
    }
 
 
 
    Pi = 0;
    Pj = 0;
 
    while (1)
    {
 
        for (i = 0; i < 500; i++) buff[i] = 0;
 
        
 
        if (fgets(buff, 500, Inp) == NULL)
        {
            k = 0;
            break;
        }
 
 
        for (i = 0; i < 500; i++)
        {
            c = buff[i]; 
 
            if (c == 0) break;  
 
            if ((c != 13) && (c != 10))
                                        
            {
 
                Phr[Pi][Pj++] = c;
 
                if ((c == '.') || (c == '!') || (c == '?'))
                {
                    Pi++;
                    Pj = 0;
                }
 
            }
        }
 
    }
 
 
    fclose(Inp);
 
 
    for (i = 0; i < Pi; i++)
    {
        Str = ltrim(Phr[i]);
        if (Str[1] == ' ') cout << Str << " ";
    }
 
 
    for (i = 0; i < Pi; i++)
    {
        Str = ltrim(Phr[i]);
        if (Str[1] != ' ') cout << Str << " ";
    }
    system("pause");
    return 0;
 
}
 
 
char * ltrim(char * S)
{
    int i, l = strlen(S);
 
    for (i = 0; i < l; i++)
 
    {
        if (*S != ' ') break;
        S++;
    }
 
    return S;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.10.2016, 15:37
Ответы с готовыми решениями:

Оформление в виде функций
Выделение памяти под массив, инициализацию элементов массива, выполнения предусмотренных заданием...

Оформление программы в виде функций
Программа определяет произведение элементов в тех строках, которые не содержат отрицательных...

Оформление программы в виде функций
Программа вычисляет среднее арифметическое четных элементов массива. Помогите оформить в виде...

Вывод строк с двузначными числами, оформление в виде функции
Написать программу, считывающую текст из файла и выводящую на экран строки, содержащие только...

6
0 / 0 / 0
Регистрация: 19.04.2016
Сообщений: 42
11.10.2016, 01:36  [ТС] 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
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
132
133
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
 
char * ltrim(char * S);
void obrabotka(int i, int j, char &c, char *buff, char *Phr, int Pi, int *Pj);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    FILE *Inp;
 
    int i, j, k, Pi, Pj;
 
    char buff[500];
 
    char Phr[500][500];
 
    char c;
 
    char *Str;
 
 
    // Чистим хранилище
 
    for (i = 0; i < 500; i++)
        for (j = 0; j < 500; j++)
            Phr[i][j] = 0;
 
 
 
    // Открываем файл
 
    Inp = fopen("C:\\Users\\user\\Desktop\\Учеба\\Хохлов\\3 семестр\\txt.txt", "r");
 
    if (Inp == NULL)
    {
        cout << "Error by open!" << endl;
        system("pause");
        return -1;
    }
 
    // Главный цикл обработки
 
    Pi = 0;
    Pj = 0;
 
    while (1)
    {
        // Чистка буфера
 
        for (i = 0; i < 500; i++) buff[i] = 0;
 
        // Читаем очередную строку
 
        if (fgets(buff, 500, Inp) == NULL)
        {
            k = 0;
            break;
        }
 
        // Обработка
        obrabotka(i, j, c, buff, Phr[500], Pi, &Pj);
 
    }
 
    // Закрываем файл
 
    fclose(Inp);
 
    // Печатаем фразы с однобуквенным первым словом
 
    for (i = 0; i < Pi; i++)
    {
        Str = ltrim(Phr[i]);
        if (Str[1] == ' ') cout << Str << " ";
    }
 
    // А теперь - все остальные
 
    for (i = 0; i < Pi; i++)
    {
        Str = ltrim(Phr[i]);
        if (Str[1] != ' ') cout << Str << " ";
    }
    system("pause");
    return 0;
 
}
 
char * ltrim(char * S)   // Удалить левые пробелы
{
    int i, l = strlen(S);
 
    for (i = 0; i < l; i++)
 
    {
        if (*S != ' ') break;
        S++;
    }
 
    return S;
}
 
void obrabotka(int i, int j, char &c, char *buff, char *Phr, int Pi, int *Pj)
{
    
    for (i = 0; i < 500; i++)
    {
        c = buff[i];  // очередной символ
 
        if (c == 0) break;  // конец строки
 
        if ((c != 13) && (c != 10)) // переводы строки и возвраты каретки 
                                    // нам не нужны...
        {
            Pj += 1;
            Phr[Pi][Pj] = c;    // кладем правильный символ на место
 
            if ((c == '.') || (c == '!') || (c == '?'))  // конец фразы?
            {
                Pi++;  // переход на новую строку массива Phrases
                Pj = 0;
            }
 
        }
    }
}
Но теперь выдает ошибку
Миниатюры
Оформление строк и файлов в виде функций  
0
0 / 0 / 0
Регистрация: 19.04.2016
Сообщений: 42
11.10.2016, 01:37  [ТС] 3
Не понимаю, что это за ошибка
0
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 9
11.10.2016, 02:16 4
Добавлено через 12 минут
Цитата Сообщение от Дриддерс Посмотреть сообщение
for (i = 0; i < 500; i++)
Нельзя так работать со строкой, ты же не можешь гарантировать, что в строке всегда будет 500 символов, как альтернатива
while (buff[i] != '\0')
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
11.10.2016, 02:26 5
Как минимум:
C++
1
obrabotka(i, j, c, buff, Phr[500], Pi, &Pj);//Phr[500] уже за пределами.
Плюс к этому
C++
1
2
            Pj += 1;
            Phr[Pi][Pj] = c;
Pj - это указатель, значит "двигаем" его вперед,
а ведь там даже не массив.
Phr[Pi][Pj] превратится в *(*(Phr+Pi) + Pj),
т.е. в результате имеем значение элемента,
который у нас был в Phr[Pi] (а он уже за пределами массива),
и это значение добавили к указателю Pj,
получив этот адрес, разыменовали указатель
и пытаемся туда что-то пропихнуть (c).

Намудрили Вы здесь на славу,
память просто в решето расстреляли.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.10.2016, 03:39 6
Цитата Сообщение от Дриддерс Посмотреть сообщение
которая считывает текст из файла
который вы конечно же не предоставили.
а нафига? мы ж типа телепаты.
сами как нить догадаемся на каких данных вы её гоняли.

реализация функции:
void obrabotka(int i, int j, char &c, char *buff, char *Phr, int Pi, int *Pj)
полный шандец!

дело не в том, что реализовали вы её не правильно.
вы такую жепь момент сотворили забавный))

я приведу иллюстрацию:
http://rextester.com/SJIN69932

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
#include <iostream>
 
void foo(char* matrix, int a, int* b)
{
    {
        const auto& v = matrix[a];
        std::cout << "type = "<<typeid(v).name()<<std::endl;
        std::cout << "value = "<<v<<std::endl;
    }
    
    
    const auto& v = matrix[a][b]; //<--- WTF ???????
    
    std::cout << "type = "<<typeid(v).name()<<std::endl;
    std::cout << "value = "<<v<<std::endl;
}
 
int main()
{
    std::cout << "Hello, world!\n";
    char matrix[2][2];
    
    int a = 0;
    int b = 0;
    
    foo(matrix[2], a, &b);
    
}
вот так ещё будет нагляднее:
http://rextester.com/YJRKM48780

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
 
void foo(char* matrix, int a, int* b)
{
    const char& v1 = matrix[a];
    const auto& v2 = v1[b]; //<--- WTF ???????
    
    std::cout << "type = "<<typeid(v2).name()<<std::endl;
    std::cout << "value = "<< v2 <<std::endl;
}
 
int main()
{
    std::cout << "Hello, world!\n";
    char matrix[2][2];
    
    int a = 0;
    int b = 0;
    
    foo(matrix[2], a, &b);
    
}
к обычному одиночному чару применяется оператор []
как будто бы это - массив, а не единичный символ.

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

мне всегда было любопытно:
наступит кто нибудь когда нибудь на эти грабли,
что с++ унаследовал от своего раздолбайского папочки си?

и вот оно! этот момент наступил!

итак, подсказку даёт старший брат жосиси:

Код
source_file.cpp: In function ‘void foo(char*, int, int*)’:
source_file.cpp:10:26: warning: array subscript has type ‘char’ [-Wchar-subscripts]
     const auto& v2 = v1[b]; //<--- WTF ???????
                          ^
если кто ещё не понял, строка:
C++
1
const auto& v2 = v1[b];
эквивалентна:
C++
1
const auto& v2 = b[v1];
где v1 - индекс массива, который имеет тип char.
жосиси стало это подозрительно,
и он решил предупредить на всякий случай:
не хороший такой душок идет от кода.

для тех кто совсем не въехал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int ar[]={1,2,3};
 
//запись вида:
ar[1];  
 
//эквивалентна:
int* p = ar; //<--- взяли адрес начала массива
p + 1; //<--- и от начала массива отщелкали sizeof(int)*1
// таким образом оказались на втором элементе
 
//однако!  1+p полностью эквивалентно записи p+1
//поэтому сишный компилятор позволяет писать:
1[ar];
 
// и этот вопиющий WAT????
// унаследовал язык с++
простой пример:
http://rextester.com/AZQX47702
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
 
int main()
{
    int ar[]={1,2,3};
    
    int& v1 = ar[1];
    int& v2 = 1[ar];
    
    std::cout << "Hello, world!\n";
    std::cout << "v1 = " << v1 << '\n';
    std::cout << "v2 = " << v2 << '\n';
}
вот такую жёпь сотворил господин Дриддерс

спасибо вам большое.
вы сделали мой вечер)))
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
11.10.2016, 03:51 7
Цитата Сообщение от hoggy Посмотреть сообщение
для тех кто совсем не въехал
И совсем уж для непонятливых:
C++
1
2
3
4
5
6
#include <iostream>
 
int main()
{
    std::cout << &6["Hello world"];
}
http://rextester.com/SCBPB98227
0
11.10.2016, 03:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2016, 03:51
Помогаю со студенческими работами здесь

Оформление вывода в виде таблицы
Доброго времени суток. Хотелось бы оформит вывод в виде таблицы, а-ля матрицы Подскажите пожалуйста...

Оформление программы в виде функции
Здравствуйте! Задали задание заполнить массив элементами от 0 до 100, в кол-во 20 ячеек. И при этом...

Оформление каждого пункта задания в виде функции
Помогите, я не очень понимаю как это сделать Задание: Оформить каждый пункт задания в виде...

Оформление выполненного кода в виде шаблона функции
Задание: в одномерном массиве, состоящем из n вещественных элементов, вычислить: 1)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru