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

Удалить в каждом слове все последующие вхождения первой буквы. Строчные и прописные буквы считать эквивалентными

10.11.2020, 15:37. Показов 1801. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
При выводе ответа, почему то заменяет первую букву на "X", а не ее все последующие вхождения в выделенном слове (специально заменяю на "X", а не удаляю, чтобы было наглядно). Конкретно работаю с этим участком кода:
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
void obrabotka_file(char *fname_i, char *fname_r)
{
    FILE *in, *out;         //исходный и результирующий файлы (потоки)
    char st_source[RAZ];        //обрабатываемая строка
    char st_result[RAZ];        //результирующая строка
    char *p = new char(RAZ);    //указатель на выделенное слово
    in = fopen(fname_i, PR_R);  //открываем файл на чтение
    out = fopen(fname_r, PR_W); //открываем файл на запись
    fgets(st_source, RAZ, in);      //читаем первую строку из файла in
    while (!feof(in))           //пока не найден признак конца файла
    {
        st_result[0] = '\0';            //очищаем результирующую строку
        p = strtok(st_source, " \n");   //выделяем первое слово (лексему) в исходной строке
        while (p)               //Пока очередное слово выделено
        {//обрабатываем слово
            for (int i = 0; i < strlen(p); i++) //проход по каждой букве слова
            {
                if (p[i] == p[0])  //если первая буква совпадает со следующими
                { 
                    p[i] = 'X';    //буквами в слове, то эти буквы заменяются на X
                    strcat(st_result, p);       //добавляем слово к результату
                    strcat(st_result, " "); //добавляем пробел между слов
                }
 
            }   
            p = strtok(NULL, " \n");        //выделение последующих слов
        }//while(p)
        st_result[strlen(st_result) - 1] = '\0';    //убираем последний пробел
        if (strlen(st_result))              //если строка не пустая
            fprintf(out, "%s\n", st_result);    //записываем строку в новый файл
        fgets(st_source, RAZ, in);          //считываем новую строку из файла
    }//while(!feof(in))
    fclose(in);         //Закрываем файл in
    fclose(out);            //Закрываем файл out
}
Полный код программы:
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
#define _CRT_SECURE_NO_WARNINGS
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<clocale>
 
using namespace std;
 
#define FNAME_I "D:\\st_i.txt\0"//имя исх. файла задано константной строкой
#define FNAME_R "D:\\st_r.txt\0"//имя рез. файла задано константной строкой
const int RAZ = 81;             //максимальная длина строки
const char PR_R[] = "r";            //признак открытия файла на чтение
const char PR_W[] = "w";            //признак открытия файла на запись
void make_file(char *);         //функция создания файла
int proverka_file(char *, const char *);    //функция проверки наличия файла
void obrabotka_file(char *, char *);    //функция обработки содержимого
void vivod_file(char *);    //вывод содержимого файла на печат
 
//main_Begin______________________________________________________________
int main()
{
    char fname_i[] = FNAME_I;
    char fname_r[] = FNAME_R;
    setlocale(LC_ALL, "Russian");
    cout << " Программа создает файл строк." << endl;
    cout << " Затем файл построчно читается, при этом в каждой строке " << endl;
    cout << " во всех словах, разделенными произвольным количеством " << endl;
    cout << " пробелов, удаляются последующие вхождения первой буквы. " << endl;
    cout << " Создаем исходный файл: " << endl;
 
    //создаем исходный файл
    make_file(fname_i);
 
    //выводим его содержимое
    if (!proverka_file(fname_i, PR_R))
    {
        cout << " Ошибка открытия файла. " << fname_i << " на чтение " << endl;
        cout << " Нажмите <Enter> " << endl;
        getchar();
        return 0;  //если исходный файл не создан
    }
    cout << " Содержимое исходного файла:" << endl;
    vivod_file(fname_i);
 
    //обрабатываем файл
    obrabotka_file(fname_i, fname_r);
 
    //выводим содержимое результата
    if (!proverka_file(fname_r, PR_R))
    {
        cout << " Ошибка открытия файла. " << fname_r << " на чтение" << endl;
        cout << " Нажмите <Enter> " << endl;
        getchar();
        return 0;   //если результирующий файл не создан
    }
    cout << " Во всех словах в каждой строке удалены " << endl;
    cout << " последующие вхождения первой буквы. " << endl;
    vivod_file(fname_r);
 
    cout << endl << " Для завершения нажмите <Enter>";
    getchar();
    return 0;
}
//main_End________________________________________________________________
 
//make_file_ Begin________________________________________________________
//функция создания файла
void make_file(char* fname_i)
{
    char st[RAZ];           //исходная строка
    FILE *in;               //текстовый файл
    char otv;               //ответ пользователя
   /*Открываем файл в режиме чтения (r)
   Если файл с таким именем уже есть, то либо пользователь вводит
   новое имя, либо новые записи будут записаны поверх старых*/
    while (proverka_file(fname_i, PR_R))
    {
        cout << " Файл с заданным именем уже есть! Зададите новое имя Y/N? ";
        cin.get(otv);
        if (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н')
        {
            cout << " Введите новое имя:" << endl;
            cin >> fname_i;
            cin.get();  //убираем символ '\n' из потока
        }
        else {
            cin.get();  //убираем символ '\n' из потока
            break;
        }
    }
    /*проверяем возможность открытия файла для записи
    поскольку полное имя файла могло быть задано с ошибкой*/
    if (!proverka_file(fname_i, PR_W))
    {
        cout << " Ошибка открытия файла " << fname_i << " на запись " << endl;
        cout << " Нажмите <Enter> " << endl;
        getchar();
        exit(0);
    }
    /*Открываем файл в режиме записи (w) текста (по умолчанию).
    Если файл с таким именем уже есть, то новые данные
    будут записаны поверх старых*/
    in = fopen(fname_i, PR_W);
    cout << " Создание файла." << endl;
    cout << " Признак окончания ввода - ввод пустой строки. " << endl;
    cout << " Введите строку и нажмите <Enter> " << endl;
    cout << " --> ";
    cin.getline(st, RAZ);   /* функция вводит строку целиком, включая
                              пробелы и символ \n */
    while (strlen(st))
    {
        fprintf(in, "%s\n", st);
        cout << " Введите строку и нажмите <Enter> " << endl; 
        cout << " --> ";
        cin.getline(st, RAZ);
    }
    fclose(in);     //закрываем файл
}
//make_file_End___________________________________________________________
 
//proverka_file_Begin_____________________________________________________
//функция проверки наличия файла
int proverka_file(char *fname, const char *pr)
{
    //Открываем файл
    if ((fopen(fname, pr)) == NULL) //если файл не существует
        return(0);
    return(1);
}
//proverka_file_End_______________________________________________________
 
//obrabotka_file_Begin____________________________________________________
//функция обработки содержимого файла
void obrabotka_file(char *fname_i, char *fname_r)
{
    FILE *in, *out;         //исходный и результирующий файлы (потоки)
    char st_source[RAZ];        //обрабатываемая строка
    char st_result[RAZ];        //результирующая строка
    char *p = new char(RAZ);    //указатель на выделенное слово
    in = fopen(fname_i, PR_R);  //открываем файл на чтение
    out = fopen(fname_r, PR_W); //открываем файл на запись
    fgets(st_source, RAZ, in);      //читаем первую строку из файла in
    while (!feof(in))           //пока не найден признак конца файла
    {
        st_result[0] = '\0';            //очищаем результирующую строку
        p = strtok(st_source, " \n");   //выделяем первое слово (лексему) в исходной строке
        while (p)               //Пока очередное слово выделено
        {//обрабатываем слово
            for (int i = 0; i < strlen(p); i++) //проход по каждой букве слова
            {
                if (p[i] == p[0])  //если первая буква совпадает со следующими
                { 
                    p[i] = 'X';    //буквами в слове, то эти буквы заменяются на X
                    strcat(st_result, p);       //добавляем слово к результату
                    strcat(st_result, " "); //добавляем пробел между слов
                }
 
            }   
            p = strtok(NULL, " \n");        //выделение последующих слов
        }//while(p)
        st_result[strlen(st_result) - 1] = '\0';    //убираем последний пробел
        if (strlen(st_result))              //если строка не пустая
            fprintf(out, "%s\n", st_result);    //записываем строку в новый файл
        fgets(st_source, RAZ, in);          //считываем новую строку из файла
    }//while(!feof(in))
    fclose(in);         //Закрываем файл in
    fclose(out);            //Закрываем файл out
}
//obrabotka_file_End______________________________________________________
 
//vivod_file_Begin________________________________________________________
//функция вывода содержимого файла на экран
    void vivod_file(char *fname)
{
    FILE *in_out;
    char st[RAZ];               //считанная строка
 
    in_out = fopen(fname, PR_R);    //открываем файл на чтение
    fgets(st, RAZ, in_out);     //читаем строку из файла in_out
    while (!feof(in_out))           //пока не найден признак конца файла
    {
        cout << st;             //выводим очередную строку на экран
        fgets(st, RAZ, in_out);     //читаем строку из файла in_out
    }
    fclose(in_out);         //закрываем файл
}
//vivod_file_End__________________________________________________________
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.11.2020, 15:37
Ответы с готовыми решениями:

В заданном предложении в каждом слове удалить все последующие вхождения первой буквы предложения
Уважаемые гуру! Могу я просить у вас о помощи? Никак не получается решить задачу по Паскалю! Для...

В заданном предложении в каждом слове удалить все последующие вхождения первой буквы предложения
Уважаемые программисты! Помогите найти ошибку в тексте программы для этой задачи: &quot;В заданном...

В каждом слове заменить все последующие вхождения первой буквы слова на символ *
Нужна помощь в двух задачах. 1. В зад. строке слова разделены пробелами (кол-во произвольное). В...

Строки. В каждом слове заменить последующие вхождения первой буквы на символ «.»
Ребята, пацаны, мужики, помогите пожжжалуйста, мне 2 задачки нужно решить, не то что бы срочно, но...

1
447 / 323 / 129
Регистрация: 18.07.2017
Сообщений: 1,454
11.11.2020, 13:18 2
Лучший ответ Сообщение было отмечено 9cell как решение

Решение

Цитата Сообщение от 9cell Посмотреть сообщение
C++
1
2
3
4
5
cout << " Программа создает файл строк." << endl;
cout << " Затем файл построчно читается, при этом в каждой строке " << endl;
cout << " во всех словах, разделенными произвольным количеством " << endl;
cout << " пробелов, удаляются последующие вхождения первой буквы. " << endl;
cout << " Создаем исходный файл: " << endl;
Почему бы не выкинуть весь вывод в файл и потом просто не читать его на экран вместо того, чтобы нагромождать вывод?
Цитата Сообщение от 9cell Посмотреть сообщение
#define _CRT_SECURE_NO_WARNINGS
Что у вас за мода пошла варнинги отключать!!?
Цитата Сообщение от 9cell Посмотреть сообщение
C++
1
2
3
4
5
6
7
int proverka_file(char *fname, const char *pr)
{
    //Открываем файл
    if ((fopen(fname, pr)) == NULL) //если файл не существует
        return(0);
    return(1);
}
Потрясающий полет мысли. Это как конфету обернуть в 2 фантика.
Цитата Сообщение от 9cell Посмотреть сообщение
//proverka_file_End_______________________________________________________
//obrabotka_file_Begin____________________________________________________
Спасибо, кэп. Это для тех, кто не видит скобки и не может по выравниванию посмотреть? Вообще много капитанских комментариев.
Цитата Сообщение от 9cell Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void vivod_file(char *fname)
{
    FILE *in_out;
    char st[RAZ];               //считанная строка
in_out = fopen(fname, PR_R);    //открываем файл на чтение
    fgets(st, RAZ, in_out);     //читаем строку из файла in_out
    while (!feof(in_out))           //пока не найден признак конца файла
    {
        cout << st;             //выводим очередную строку на экран
        fgets(st, RAZ, in_out);     //читаем строку из файла in_out
    }
    fclose(in_out);         //закрываем файл
}
C++
1
 
Больно уж много лишних телодвижений

Добавлено через 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
// main.cpp
#include "header.h"
 
int main(){
    char fname_i[] = FNAME_I;
    char fname_r[] = FNAME_R;
    setlocale(LC_ALL, "Russian");
    cout << " Программа создает файл строк." << endl;
    cout << " Затем файл построчно читается, при этом в каждой строке " << endl;
    cout << " во всех словах, разделенными произвольным количеством " << endl;
    cout << " пробелов, удаляются последующие вхождения первой буквы. " << endl;
    cout << " Создаем исходный файл: " << endl;
 
    //создаем исходный файл
    make_file(fname_i);
 
    //выводим его содержимое
    if (!fopen(fname_i, PR_R))
    {
        cout << " Ошибка открытия файла. " << fname_i << " на чтение " << endl;
        cout << " Нажмите <Enter> " << endl;
        getchar();
        return 0;  //если исходный файл не создан
    }
    cout << " Содержимое исходного файла:" << endl;
    vivod_file(fname_i);
 
    //обрабатываем файл
    obrabotka_file(fname_i, fname_r);
 
    //выводим содержимое результата
    if (!fopen(fname_r, PR_R))
    {
        cout << " Ошибка открытия файла. " << fname_r << " на чтение" << endl;
        cout << " Нажмите <Enter> " << endl;
        getchar();
        return 0;   //если результирующий файл не создан
    }
    cout << " Во всех словах в каждой строке удалены " << endl;
    cout << " последующие вхождения первой буквы. " << endl;
    vivod_file(fname_r);
 
    cout << endl << " Для завершения нажмите <Enter>";
    getchar();
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// header.h
#pargma once
 
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<clocale>
 
using namespace std;
 
#define FNAME_I "D:\\st_i.txt\0"            //имя исх. файла задано константной строкой
#define FNAME_R "D:\\st_r.txt\0"            //имя рез. файла задано константной строкой
const int RAZ = 81;                         //максимальная длина строки
const char PR_R[] = "r";                    //признак открытия файла на чтение
const char PR_W[] = "w";                    //признак открытия файла на запись
void make_file(char *);                     //функция создания файла
int proverka_file(char *, const char *);    //функция проверки наличия файла
void obrabotka_file(char *, char *);        //функция обработки содержимого
void vivod_file(char *);                    //вывод содержимого файла на печат
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
// functions.cpp
#include "header.h"
 
//функция создания файла
void make_file(char* fname_i){
    while (fopen(fname_i, PR_R)){
        char otv;
        cout << " Файл с заданным именем уже есть! Зададите новое имя Y/N? ";
        cin >> otv;
        if (otv == 'Y' || otv == 'y' || otv == 'Н' || otv == 'н'){
            cout << " Введите новое имя:" << endl;
            cin >> fname_i;
            cin.get();  //убираем символ '\n' из потока
        }
        else {
            cin.get();  //убираем символ '\n' из потока
            break;
        }
    }
 
    FILE* in = fopen(fname_i, PR_W);
    if (in){
        cout << " Ошибка открытия файла " << fname_i << " на запись " << endl;
        cout << " Нажмите <Enter> " << endl;
        getchar();
        exit(0);
    }
    
    cout << " Создание файла." << endl;
    cout << " Признак окончания ввода - ввод пустой строки. " << endl;
    cout << " Введите строку и нажмите <Enter> " << endl;
    cout << " --> ";
 
    char st[RAZ];
    cin.getline(st, RAZ);   /* функция вводит строку целиком, включая
                              пробелы и символ \n */
    while (strlen(st)){
        fprintf(in, "%s\n", st);
        cout << " Введите строку и нажмите <Enter> " << endl; 
        cout << " --> ";
        cin.getline(st, RAZ);
    }
    fclose(in);     //закрываем файл
}
 
//функция обработки содержимого файла
void obrabotka_file(char *fname_i, char *fname_r){
    FILE *in = fopen(fname_i, PR_R);
    FILE* out = fopen(fname_r, PR_W);
 
    char st_source[RAZ];
    char st_result[RAZ];
    char *p = new char(RAZ);
 
    fgets(st_source, RAZ, in);
    while (!feof(in))
    {
        st_result[0] = '\0';
        p = strtok(st_source, " \n");
        while (p){
            for (int i = 0; i < strlen(p); i++) //проход по каждой букве слова
            {
                if (p[i] == p[0])  //если первая буква совпадает со следующими
                { 
                    p[i] = 'X';    //буквами в слове, то эти буквы заменяются на X
                    strcat(st_result, p);       //добавляем слово к результату
                    strcat(st_result, " "); //добавляем пробел между слов
                }
 
            }   
            p = strtok(NULL, " \n");        //выделение последующих слов
        }//while(p)
        st_result[strlen(st_result) - 1] = '\0';    //убираем последний пробел
        if (strlen(st_result))              //если строка не пустая
            fprintf(out, "%s\n", st_result);    //записываем строку в новый файл
        fgets(st_source, RAZ, in);          //считываем новую строку из файла
    }//while(!feof(in))
    fclose(in);         //Закрываем файл in
    fclose(out);            //Закрываем файл out
}
 
//функция вывода содержимого файла на экран
void vivod_file(char *fname){
    char st[RAZ];
    FILE *in_out = fopen(fname, PR_R);
    while (fgets(st, RAZ, in_out))
        cout << st;
 
    fclose(in_out);
}
Добавлено через 40 минут
Цитата Сообщение от 9cell Посмотреть сообщение
При выводе ответа, почему то заменяет первую букву на "X"
А что должно происходить?
1
11.11.2020, 13:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2020, 13:18
Помогаю со студенческими работами здесь

В заданном тексте в каждом четном слове заменить все строчные буквы на прописные
В заданном тексте в каждом четном слове заменить все строч-ные буквенные символы на прописные, а...

Удалить из слова все последующие вхождения первой буквы
Дана последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 строчных...

Удалить из строки все последующие вхождения первой буквы
Дана строка, состоящая из слов, разделенных пробелами (одним или несколькими). Напечатать все...

Удалить из слова все последующие вхождения первой буквы
Уважаемые форумчане, помогите закончить лабу. Массив есть, а вот с удаление букв проблема. ...

Удалить из слова все последующие вхождения первой буквы
Условие задания: Дан текст в файле . Между соседними словами – не менее одного пробела, за...

Удалить из слова все последующие вхождения первой буквы
Помогите нужен метод, дана строка надо удалить все последующие вхождения первой буквы.


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

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