Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.74/47: Рейтинг темы: голосов - 47, средняя оценка - 4.74
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460

Вывести в алфавитном порядке все буквы, которые встречаются в файле

20.08.2015, 18:46. Показов 9884. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,

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



C++ (Qt)
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
#include <iostream>
#include <sstream>
#include <string>
#include <cstdio>
#include <fstream>
using namespace std;
int main()
{
    int a,i=0;
    char ch;
     
            fstream in;   //открываем файл ДЛЯ ЧТЕНИЯ  
            in.open("TeExt.txt"); //ОТКРЫЛИ файл для чтения           
                if(!in)      // Проверяем, открыли ли мы файл.
                {cout<< "Cannot";} // Если не открыли, то в консоли появиться "Cannot"
 
        for(;;){ //бесконечный цикл, с условием выхода в конце
          in.open("TeExt.txt");  //открыли файл, каретка на первом символе
            while(!in.eof()){ //делать пока не достигнем конца файла
                in.get(ch);  //считываем символ
                a=(int)ch;   //конвертируем его в ASCII код
                    if(a==97+i) {    //сравниваем с буквой а (ASCII код буквы а=97)
                       cout<<(char)(97+i)<<endl; //если нашли то выводим его на экран
                       in.close(); //после этого закрываем файл, чтобы потом при выходе из цикла его открыть с кареткой                   в начале
                       i++; //и увеличиваем i на единицу
                       break;} // и выходим из второго цикла
            break;             //
            }
         }while(i!=26); //условия окончания первого цикла
 
            return 0;
        }
Миниатюры
Вывести в алфавитном порядке все буквы, которые встречаются в файле  
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.08.2015, 18:46
Ответы с готовыми решениями:

Вывести в алфавитном порядке все буквы, которые встречаются в тексте
Задан текст из латинских букв. Вывести в алфавитном порядке все буквы, которые встречаются в тексте Вот мои наработки, но почету-то не...

Вывести в алфавитном порядке все буквы,которые встречаются в тексте только один раз
Задан текст из латинских букв .Вывести в алфовитном порядке все буквы,которые встречаются в тексте только один раз. Вывод исходного...

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

11
1 / 1 / 2
Регистрация: 20.08.2015
Сообщений: 10
20.08.2015, 19:06
1.
C++
1
for(;;){}while(i!=26);
Это что за цикл такой то?
2. Если в тексте нет определенной буквы, в вашем случае, на этой букве закончится поиск, так как і стоит увеличивать после прогонки по файлу.
0
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
20.08.2015, 19:14  [ТС]
Цитата Сообщение от algoholic Посмотреть сообщение
1.
Код C++Выделить код
1
for(;{}while(i!=26);
Это что за цикл такой то?
2. Если в тексте нет определенной буквы, в вашем случае, на этой букве закончится поиск, так как і стоит увеличивать после прогонки по файлу.
Спасибо, думаю, Вы правы.
Вот такой код, думаю, лучше

C++ (Qt)
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
#include <iostream>
#include <sstream>
#include <string>
#include <cstdio>
#include <fstream>
using namespace std;
int main()
{
    int a,i=0;
    char ch;
     
    
            fstream in;   //открываем файл ДЛЯ ЧТЕНИЯ //хранить в себе имя нашего файла, которое мы введем с клавиатуры
            in.open("TeExt.txt"); //ОТКРЫЛИ файл для чтения
            //открываем файл с именем, которое хранится в переменной s
                        // либо создаём его, если его не было
            if(!in)      // Проверяем, открыли ли мы файл.
            {cout<< "Cannot";} // Если не открыли, то в консоли появиться "Cannot"
 
        for(;;){
          in.open("TeExt.txt");
            while(!in.eof()){//можно считать вот так все символы
                in.get(ch);
                a=(int)ch;
                    if(a==97+i){
                       cout<<(char)(97+i)<<endl;
                       in.close();
                       i++;
                       break;}
                    else{
                    i++;
                    in.close();
                    break;
                    }
 
            }
         }while(i!=26);
 
            return 0;
        }

Однако, после компиляции (проходит успешно) выдаёт просто черный экран и ничего... Не могу понять, как так?
0
1 / 1 / 2
Регистрация: 20.08.2015
Сообщений: 10
20.08.2015, 19:14
Лучший ответ Сообщение было отмечено Blitzor DDD как решение

Решение

Переделал Ваш код. Теперь все работает:
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>
#include <sstream>
#include <string>
#include <cstdio>
#include <fstream>
using namespace std;
int main()
{
    int a,i=0;
    char ch;
    fstream in;
 
        while(i!=26){
            in.open("TeExt.txt");
            while(!in.eof()){
                in>>ch;
                a=(int)ch;
                    if(a==97+i) {
                       cout<<(char)(97+i)<<endl;
                        break;
                       }
            }
            in.close();
            i++;
         }
 
            return 0;
        }
1
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
20.08.2015, 19:17  [ТС]
Спасибо огромное!

Вы совсем не новичек!) А можете сказать, почему мой второй вариант не работает?
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
20.08.2015, 19:18
Решается эта задача с помощью множества. Читаем файл побуквенно и добавляем каждую букву в множества. В конце множество выводим, предварительно отсортировав (если оно было неотсортировынным).
Вот мой вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <algorithm>  // std::copy
#include <fstream>    // std::ifstream
#include <iostream>   // std::cin, std::cout
#include <iterator>   // std::istreambuf_iterator, std::ostream_iterator
#include <ostream>    // std::endl
#include <set>        // std::set
 
int main() {
    using namespace std;
    // Открываем файл для чтения
    ifstream file("test.txt");
    // Читаем все символы из файла в множество.
    // если нужно будет прочитать лишь только буквы,
    // то следует воспользоваться std::copy_if или
    // std::remove_if для удаления не нужных символов
    set<char> letters((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
    // Выводим символы из множества на экран.
    // Т.к. каждый элемент встречается в мнножестве один раз,
    // а также std::set — отсортированное множество,
    // то каждый символ будет выведен один раз по алфавиту
    copy(letters.begin(), letters.end(), ostream_iterator<char>(cout));
    cout << endl;
}
1
14 / 14 / 1
Регистрация: 17.08.2015
Сообщений: 460
20.08.2015, 19:20  [ТС]
Цитата Сообщение от mymedia Посмотреть сообщение
Решается эта задача с помощью множества. Читаем файл побуквенно и добавляем каждую букву в множества. В конце множество выводим, предварительно отсортировав (если оно было неотсортировынным).
Вот мой вариант
Вы знаете, может быть, это и работает, но я пока совершенно не понимаю синтаксиса туут. Я сам начал программировать на С++ примерно месяц назад.

Но выглядит круто)
0
1 / 1 / 2
Регистрация: 20.08.2015
Сообщений: 10
20.08.2015, 19:26
Не за что. Я на форуме новичок просто
Ваш код не работает из-за банальных ошибок в циклах.
Начиная с того, что не существует цикла вида for(){}while() и заканчивая ошибками в расположении инкрементов/команд закрытия файла.
Ошибки элементарные, по-этому старайтесь сначала самостоятельно пройтись по своему коду, выполнив каждый шаг в уме/на бумажке. Так проще понять свои ошибки
0
 Аватар для ture
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
20.08.2015, 19:27
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
#include <iostream>
using std::cout;
using std::endl;
#include <fstream>
using std::ifstream;
#include <cctype>
 
int main() {
    ifstream fin(R"(C:\Users\etyurin\Desktop\1.txt)");
    if(fin.is_open()) {
        char m[26] = {0};
        char c;
        while(fin >> c)
            if(isalpha(c))
                m[tolower(c) - 'a']++;
 
        for(int i = 0; i < 26; i++)
            if(m[i]>0)
                cout << char('a' + i) << " - " << int(m[i]) << endl;
        fin.close();
    }
 
    system("pause");
    return 0;
}
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
20.08.2015, 21:02
ture, если какая-то буква встретится в файле 256 раз, то у вас она имхо не выведется.

Добавлено через 5 минут
UPD скорее всего все еще хуже - char по умолчанию (в Студии по крайней мере) сигнед, а проверка у вас на >0 - то есть не выведутся буквы, встретившиеся от 128 до 256 раз (и так далее с периодом 256).
0
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
20.08.2015, 22:06
Может, так заработает как надо?
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
#include <fstream>    // std::ifstream
#include <iostream>   // std::cout
#include <ostream>    // std::endl
 
int main() {
    using namespace std;
    ifstream file("test.txt"); // oткрываем файл для чтения
    bool letters['Z'-'A' + 1] = { }; // массив флагов: истина, если буква уже встречаласть в тексте
    while (file) { // читаем файл посимвольно, пока он не кончится
        char ch;
        file >> ch;
        if (isalpha(ch)) { // если текущий считанный символ — буква
            letters[toupper(ch)-'A'] = true; // то устанавливаем соответствующий флаг
        }
    }
    for (char ch = 'A'; ch <= 'Z'; ch++) { // цикл от 'A' до 'Z' включительно
        if (letters[ch-'A'] and isalpha(ch)) { // если выставлени флаг и ch — буква
            // стоит отметить, что не гарантируется, что коды букв идут без пропусков,
            // однако можно быть уверенным, что они идут по алфафиту
            cout << ch;
        }
    }
    cout << endl;
}
0
 Аватар для ture
553 / 361 / 206
Регистрация: 27.11.2014
Сообщений: 1,049
20.08.2015, 23:52
mymedia, угу, так оно точнее, я чёто тупанул.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2015, 23:52
Помогаю со студенческими работами здесь

Вывести в алфавитном порядке все буквы, которые входят в текст по одному разу
Программа на тему регулярные типы: векторы. Дан текст из малых латинских букв, за которым следует точка. Вывести в алфавитном порядке...

Вывести в алфавитном порядке все согласные буквы, которые не входят ни в одно слово
Помогите решить задачу написать программу в Паскале ABC, пожалуйста. За ранее спасибо. Дан текст на русском языке. Вывести в алфавитном...

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

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

Вывести в алфавитном порядке: все звонкие согласные буквы, которые входят хотя бы в одно слово
Дана непустая последовательность слов из малых русских букв; между соседними словами - запятая, за последним словом - точка. Вывести в...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru