Напечатать в алфавитном порядке все буквы, входящие в текст - C (СИ)
Формулировка задачи:
Весь текст находится в txt файле, все данные должны быть обработаны и занесены в алфавитном порядке в выходной текст, а так же отобразиться на экране. При этом пользователь должен ввести название входного и выходного файлов.
P.S. До этого делал это же задание с немного отличными требованиями в паскале на PascalABC.NET, теперь вот на С первую же программу такую дали
Может кто объяснить, почему switch не хочет пропускать символы? Без него все работает, но выводит в добавок и те символы, которые мне не нужны. К тому же в конце текста откуда-то появляется буква "я".
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <locale.h>
#include <ctype.h>
int main(void)
{
int i,j,k,TextSize;
char InPName[15],OutPName[15], Symbol;
FILE *InPutFile,*OutPutFile;
char OurText[100];
setlocale(LC_ALL, "RUSSIAN");
printf("Данная программа отсортирует ваш текст в алфавитном порядке.\n");
printf("Введите имя исходного файла \n");
k = 0;
while (k == 0)
{
scanf("%s", InPName);
if ((InPutFile = fopen(InPName, "r")) == NULL)
{
printf("Ошибка при открытии файла. Повторите ввод\n");
k = 0;
}
else{
k = 1;
}
}
printf("Введите имя файла для результата \n");
scanf("%s", OutPName);
OutPutFile = fopen(OutPName, "w");
fseek(InPutFile, 0, SEEK_SET);
printf("Исходныйтекст: \n \r");
TextSize = 0;
while (!feof(InPutFile))
{
Symbol = getc(InPutFile);
printf("%c", Symbol);
TextSize++;
OurText[TextSize] = toupper(Symbol);
}
fclose(InPutFile);
for (i = 0; i <= TextSize; i++)
{
Symbol = OurText[i];
j = i - 1;
while ((j >= 1) && (OurText[j] > Symbol))
{
OurText[j + 1] = OurText[j];
j --;
}
OurText[j + 1] = Symbol;
}
printf("\n");
printf("Получившийся текст: \n \r");
for (i = 0; i <= TextSize; i++)
{
switch (OurText[i])
{
case 'A' - 'Z' || 'А' - 'Я':
printf("%c", OurText[i]);
putc(OurText[i], OutPutFile);
}
}
fclose(OutPutFile);
system("pause");
return 0;
}Решение задачи: «Напечатать в алфавитном порядке все буквы, входящие в текст»
textual
Листинг программы
switch (OurText[i])
{
case 'A' - 'Z' || 'А' - 'Я':
printf("%c", OurText[i]);
putc(OurText[i], OutPutFile);
}
Объяснение кода листинга программы
В представленном коде выполняется следующая последовательность действий:
- В зависимости от значения переменной
OurText[i]выполняется одно из действий:- Если значение
OurText[i]входит в диапазон от 'A' до 'Z' (включительно) или от 'А' до 'Я' (включительно), то выполняется блок кода внутри соответствующего случая (label) в структуреswitch. - Если значение
OurText[i]не входит в указанные диапазоны, то выполняется ничего.
- Если значение
- Внутри блока кода для случая, когда значение
OurText[i]входит в диапазон от 'A' до 'Z' или от 'А' до 'Я', выполняется следующая последовательность действий:- Значение
OurText[i]преобразуется в символ и выводится на экран с помощью функцииprintf(). - Значение
OurText[i]также записывается в файлOutPutFileс помощью функцииputc(). Список действий в коде:
- Значение
- Преобразование значения
OurText[i]в символ. - Проверка значения
OurText[i]на вхождение в диапазон от 'A' до 'Z' или от 'А' до 'Я'. - Вывод символа на экран с помощью функции
printf(). - Запись символа в файл
OutPutFileс помощью функцииputc().