Консультация № 178158
01.05.2010, 14:31
0.00 руб.
01.05.2010, 20:21
0 4 1
Редактирование ошибок. Что, только учимся писать по-русски?


Доброго времени суток дорогие эксперты!
Требуется решить задачу на турбо c или на Code block.
Дан текстовый файл. Вывести все согласные, которых нет ни в одном слове.

Примечание:
Если возможно, вспомогательными файлами не пользоваться.
Оставлять комментарии необходимо!

Спасибо за внимание!

Обсуждение

Неизвестный
03.05.2010, 15:36
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.
Прокомментированный текст программы приведен в приложении. Имя сканируемого файла может быть задано в командной строке или введено с клавиатуры по запросу программы. Программа читает его построчно (в принципе, можно читать и посимвольно) и проверяет каждый символ на совпадение с русскими сограсными буквами. Если это согласная, то устанавливается флаг наличия этой буквы (без учета регистра).

Программа компилировалась и проверялась в режиме "чистого Си" в Borland C++ 3.1 и MSVC++ 6.0 (сохраните в файле с расширением .c). Если Ваш компилятор не понимает комментарии, начинающиеся с '//', то замените их на /* */.

Успехов!

Приложение:
/*
Вопрос № 178158
Дан текстовый файл. Вывести все согласные, которых нет ни в одном слове.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifndef _countof
#define _countof(array) (sizeof(array)/sizeof(array[0]))
#endif

// объявление констант и типа BOOL для наглядности
#define FALSE 0
#define TRUE 1

typedef int BOOL;

char szConsonants[] = "бвгджзйклмнпрстфхцчшщъьБВГДЖЗЙКЛМНПРСТФХЦЧШЩЪЬ";

#define N_CONSONANTS ((_countof(szConsonants)-1)/2) /* количество согласных */
// (-1) из-за конечного нуля в строке szConsonants

int flags[N_CONSONANTS]; // массив признаков наличия согласных
// по умолчанию, в Си статические переменные инициализируются нулями,
// поэтому в коде программы нет явной инициализации

int main( int argc, char* argv[] )
{
char szNameBuf[_MAX_PATH], *pFileName;
FILE* f;
unsigned char str[1024]; // буфер для строк
int i;
BOOL bMsg;

if( argc >= 2 ) // если в командной строке переданы параметры,
pFileName = argv[1]; // то первый из них - имя обрабатываемого файла
else { // иначе - запрашиваем имя файла у пользователя
printf( "Введите имя файла: " );
pFileName = gets( szNameBuf );
}

// открываем файл
f = fopen( pFileName,"rt" );
if( !f ) {
printf( "Ошибка при открытии файла "%s"\n", pFileName );
return 1;
}
printf( "\nСканирование файла '%s'...", pFileName );

// читаем файл построчно
while( fgets( (char*)str, sizeof str, f )) { // читаем очередную строку
unsigned char* p = str;
while( *p ) { // сканируем строку посимвольно
char* pch = strchr( szConsonants, *p );
if( pch ) { // если это согласная, то устанавливаем признак ее наличия
if( (i = pch - szConsonants) > N_CONSONANTS )
i -= N_CONSONANTS;
flags[i] = TRUE;
}
++p; // к следующему символу
}
}
fclose( f ); // закрываем файл

// теперь сканируем массив признаков наличия согласных и выводим те буквы,
// которым соответствуют нули
bMsg = FALSE; // сообщение не выведено
for( i = 0; i < _countof(flags); ++i )
if( !flags[i] ) {
if( !bMsg ) { // печатаем сообщение, если этого не было сделано ранее
printf( "\nВ тексте отсутствуют следующие согласные: " );
bMsg = TRUE;
}
printf( "%c", szConsonants[i] );
}

if( !bMsg )
printf( "\nВ тексте встречаются все русские согласные." );

printf("\n");

system( "pause" );
return 0;
}
Неизвестный
03.05.2010, 15:42
общий
Юдин Евгений Сергеевич:
Ни турбо c (по причине его древности), ни Code block у меня нет, поэтому решение предложено на С, проверено в Borland C++ 3.1 (отличается от Turbo C++ некоторыми доп. возможностями) и MSVC++ 6.0.
Что означает "вспомогательными файлами не пользоваться" мне не понятно. Если приведенное решение Вас не устраивает, то пишите в мини-форум, разберемся.
Обратите внимание, что в консоли (как и в Turbo C) используется кодировка DOS.
Неизвестный
06.05.2010, 14:00
общий
Цитата: 307758
Что означает "вспомогательными файлами не пользоваться" мне не понятно.

это значит что работу делать в 1 фаиле без подключения дополнительных
Неизвестный
06.05.2010, 14:08
общий
Юдин Евгений Сергеевич:
А стандартные заголовочные файлы (.h) тоже нельзя использовать? А как тогда читать файлы (условие: "Дан текстовый файл.")? Строки несложно обработать и без стандартной библиотеки, а чтение файлов как? Если целевая платформа - DOS, то это можно сделать через прерывания, а если Windows?
Форма ответа