- •2003 Содержание
- •1. Задание
- •2. Примеры, отражающие смысловую сторону задания
- •3. План решения поставленной задачи
- •4. Спецификация функций
- •4.7. Функция _gets()
- •4.8. Функция FreeMassive()
- •4.9.Функция PutStr()
- •4.10. Функция ChangeArray()
- •4.11. Функция CountWord()
- •4.12. Функция ChangeStr()
- •4.13. Функция AddToStr()
- •5. Схема алгоритма главной Функции
- •6. Структура вызовов функций
- •7. Набор тестов
- •8. Инструкция пользователю
- •9. Заключение
- •10. Текст программы
9. Заключение
Создание данной программы явилось первым шагом к написанию приложений, имеющих практическое значение. В результате выполнения поставленной задачи были получены огромные практические навыки работы на языке Си. Был приобретен опыт работы со строками, функциями, динамической памятью и операторами цикла.
10. Текст программы
#include<conio.h>
#include<stdio.h>
#include<alloc.h>
#include<string.h>
#define END "end"
// Cool'ное меню
void Menu()
{
printf( "\n\t\t ▓▓ ▓▓ ▒▒▒▒▒▒ ▓▓ ▓▓ ▒▒ ▒▒▒▒▒ ");
printf( "\n\t\t ▓▓▓ ▓▓▓ ▒▒ ▓▓ ▓▓ ▒▒ ▒▒ ▒▒ ");
printf( "\n\t\t ▓▓ ▓ ▓▓ ▒▒▒▒▒ ▓▓▓▓▓▓▓ ▒▒▒▒▒▒ ▒▒ ");
printf( "\n\t\t ▓▓ ▓▓ ▒▒ ▓▓ ▓▓ ▒▒ ▒▒ ▒▒ ");
printf( "\n\t\t ▓▓ ▓▓ ▒▒▒▒▒▒ ▓▓ ▓▓ ▒▒ ▒▒▒▒▒ \n\n ");
printf( "\n\n\t1 Справка." );
printf( "\n\n\t2 Ввод текста." );
printf( "\n\n\t3 Вывод текста." );
printf( "\n\n\t4 Условие формирования нового текста." );
printf( "\n\n\t5 Вывод нового текста." );
printf( "\n\n\t6 Выход. " );
}
void Help()
{
puts( "\n\n\tЭта программа предназначена для формирования нового текста, который" );
puts( " является результатом следующего преобразования исходного текста: заменить" );
puts( " заданное слово на другое слово столько раз, сколько оно встречается в" );
puts( " первой строке текста" );
puts( "\n\t Ввод текста пользователем заканчивается словом end, введенным через" );
puts( " пробел от остального текста. Максимальное кол-во строк - 25. А максимальная" );
puts( " длина слов для замены – 15 символов. ");
puts( "\n\n\t\t\t\tThis programme made by \1 Yura \1" );
puts( "\n\t\t\t\t\t\2 C вопросами обращаться в группу 3371 \2" );
getch();
}
// Проверяем - является ли символ разделитилем
int CharIsDevider( char Char )
{
if( Char == '\t' || Char == ' ' || Char == '.' || Char == ','|| Char == ';'|| Char == ':'|| Char == '!'|| Char == '?' )
return 1;
else
return 0;
}
// Return length of Word
int GetWord( char *Str, int *pPos, char *Word )
{
int iStrLen = strlen( Str );
Word[0] = '\0';
int iWordLen = 0;
while( *pPos < iStrLen )
{
if( CharIsDevider( Str[*pPos] ) && iWordLen != 0 )
{
if( !CharIsDevider( Word[iWordLen - 1] ) )
{
Word[iWordLen] = '\0';
return iWordLen;
}
}
else if( iWordLen != 0 )
{
if( CharIsDevider( Word[iWordLen - 1] ) )
{
Word[iWordLen] = '\0';
return iWordLen;
}
}
Word[iWordLen] = Str[*pPos];
iWordLen++;
(*pPos)++;
}
Word[iWordLen] = '\0';
return iWordLen;
}
// Убираем пробелы в конце строки
void StrStrim( char *Str )
{
for( int i = strlen( Str ) - 1; i >= 0; i-- )
if( CharIsDevider( Str[i] ) )
Str[i] = '\0';
else
i = -1;
}
void _gets( char *Str, int Limit)
{
int Count = 0;
while( Str[Count] != 13 && Count < Limit )
{
Str[Count] = getch();
if( Str[Count] == 13)
continue;
else
Count++;
}
if( Limit == 79)
puts("");
Str[Count] = 0;
}
// Получаем Массив строк
char **GetStr( int *pStrCount )
{
char Str[79];
char *szLastWord;
char **pResult = NULL;
int iEnd = 0;
*pStrCount = 0;
while( !iEnd )
{
_gets( Str, 79 );
char Word[80];
int iPosition = 0;
int iWordLen = 0;
while( (iWordLen = GetWord( Str, &iPosition, Word )) && !iEnd )
{
if( !strcmp( Word, END ) )
{
iEnd = 1;
Str[iPosition - iWordLen] = '\0';
StrStrim( Str );
}
}
int iStrLen = strlen( Str );
if( iEnd && iStrLen == 0 )
{
continue;
}
else
{
if( *pStrCount == 0 )
pResult = (char**)malloc( sizeof(char*) );
else
pResult = (char**)realloc( pResult, (*pStrCount + 1)*sizeof(char*) );
if( pResult == NULL )
{
*pStrCount = 0;
return NULL;
}
pResult[*pStrCount] = (char*)malloc( (iStrLen + 1)*sizeof(char) );
if( pResult[*pStrCount] != NULL )
strcpy( pResult[*pStrCount], Str );
(*pStrCount)++;
}
}
return pResult;
}
// Выводим массив строк
void PutStr( char **StrArray, int l )
{
int i;
clrscr();
puts( "\nВведены строки\n" );
if( StrArray == NULL )
{
return;
}
for( i = 0; i < l; i++ )
if( StrArray[i] != NULL )
puts( StrArray[i] );
}
// Считаем количество вхождений СЛОВА в СТРОКЕ
int CountWord( char *Str, char *Tamplate )
{
int iPos = 0;
int iCount = 0;
char Word[64];
while( GetWord( Str, &iPos, Word ) )
{
if( !strcmp( Word, Tamplate) )
iCount++;
}
return iCount;
}
// ДИНАМИЧЕСКИ добавляем в конец строки слово
void AddToStr( char **Str, char *Word )
{
int iLen = strlen( Word ) + 1;
if( *Str == NULL )
{
*Str = (char*)malloc( iLen * sizeof(char) );
if( *Str == NULL )
return;
strcpy( *Str, Word );
}
else
{
iLen += strlen( *Str );
*Str = (char*)realloc( *Str, iLen * sizeof(char) );
if( *Str == NULL )
{
return;
}
strcat( *Str, Word );
}
}
// Заменяем в строке занное СЛОВО на другое СЛОВО
char* ChangeStr( char *Str, char *Chto, char *NaChto, int *iCount )
{
char *pResult = NULL;
int iPos = 0;
char Word[60];
while( GetWord( Str, &iPos, Word ) )
{
if( strcmp( Word, Chto ) || *iCount == 0 )
AddToStr( &pResult, Word );
else
{
AddToStr( &pResult, NaChto );
(*iCount)--;
}
}
return pResult;
}
// Создаем новый массив строк с измененными словами
char **ChangeArray( char **StrArray, int iStrCount )
{
char Chto[15] = "";
char NaChto[15] = "";
printf( "\nВведите слово, которое вы хотите заменить " );
_gets( Chto, 15 );
printf( "\nВведите слово, на которое Вы хотите заменить заданное слово ");
_gets( NaChto, 15);
if( iStrCount == 0 )
return NULL;
char **pResult = (char**)malloc( iStrCount*sizeof(char*) );
if( pResult == NULL )
return pResult;
pResult[0] = (char*)malloc( (strlen(StrArray[0]) + 1)*sizeof(char) );
if( pResult != NULL )
strcpy( pResult[0], StrArray[0] );
int iRepeatCount = CountWord( StrArray[0], Chto );
for( int i = 1; i < iStrCount; i++ )
pResult[i] = ChangeStr( StrArray[i], Chto, NaChto, &iRepeatCount );
return pResult;
}
void FreeMassive( char **massive, int RowCount )
{
if( massive == NULL)
return;
for( int i = 0; i < RowCount; i++ )
delete massive[i];
delete massive;
}
// Основная функция программы =)
void main()
{
int iStrCount = 0;
char **ChangeArrey = NULL;
char **StrArray = NULL;
char **NewStr = NULL;
unsigned char e;
do
{
clrscr();
Menu();
e = getch();
switch( e )
{
case '1':
clrscr();
Help();
break;
case '2':
clrscr();
FreeMassive( StrArray, iStrCount);
StrArray = GetStr( &iStrCount );
break;
case '3':
clrscr();
if( StrArray != NULL )
PutStr( StrArray, iStrCount );
else
printf( "\nТекст не сформирован!" );
getch();
break;
case '4':
clrscr();
FreeMassive( NewStr, iStrCount);
if( StrArray != NULL )
NewStr = ChangeArray( StrArray, iStrCount );
else
{
printf( "\nМассив не сформирован!" );
getch();
}
break;
case '5':
clrscr();
if( NewStr != NULL )
PutStr( NewStr, iStrCount );
else
printf( "\nМассив не сформирован!" );
getch();
break;
default:
break;
}
}
while( e != '6' );
FreeMassive( NewStr, iStrCount);
FreeMassive( StrArray, iStrCount);
}