Все лабы по инфе за 2ой сем на С++ (Текст программы MaxWord)

Посмотреть архив целиком

Текст программы MaxWord


#include

#include

#include

#include


char *getbuf(char *, FILE *);

void format(char *);

int maxword(char *);

void print(char *, int);

int errormes(int, char *);


char **poutword; // Для хранения уже выведеных слов

int numoutword = 0, sizeoutword = 0;


int main(int argc, char *argv[])

{

int maxlenword = 0, curlenword, i;

char inbuf[BUFSIZ];

FILE *pfile;


if (argc != 2) return errormes(1, NULL);

if ((pfile = fopen(argv[1], "r")) == NULL)

return errormes(2, argv[1]);

while (getbuf(inbuf, pfile) != NULL) // Ищем максимальную длину слова в файле

{

format(inbuf);

curlenword = maxword(inbuf);

if (maxlenword < curlenword)

maxlenword = curlenword;

}

rewind(pfile); // Возвращаемся в начало файла

while (getbuf(inbuf, pfile) != NULL) // Выводим слова имеющие максимальную длину

{

format(inbuf);

print(inbuf, maxlenword);

}

for (i = 0; i < numoutword; i++) // Освобождаем выделенную память

free(poutword[i]);

free(poutword);

fclose(pfile);

return 0;

}

char *getbuf(char *pinbuf, FILE *pfile) // Осуществляем ввод строки из файла в буфер

{

return fgets(pinbuf, BUFSIZ, pfile);

}

void format(char *pstr) // Заменяет все символы кроме латинских букв на пробелы

{

while (*pstr != '\0')

{

if (!isalpha(*pstr))

*pstr = ' ';

pstr++;

}

return;

}

int maxword(char *pstr) // Ищет максимальную длину слов из буфера (строки) pstr

{

int maxlen = 0, curlen;

char *pword;


while ((pword = strtok(pstr, " ")) != NULL)

{

curlen = strlen(pword);

if (maxlen < curlen)

maxlen = curlen;

pstr = NULL;

}

return maxlen;

}

void print(char *pstr, int maxlen) // Выводит слова длины maxlen из буфера (строки) pstr

{

char *pword;

int k, existword;


while ((pword = strtok(pstr, " ")) != NULL)

{

if (strlen(pword) == maxlen) // Если слово имеет максимальную длину

{ // Проверяем не было ли уже такого слова

for (k = 0, existword = 0; k < numoutword; k++)

{ // Если слово уже было

if (!strcmp(poutword[k], pword))

existword |= 1; // Ставим флаг существования в единицу (операция "или")

}

if (!existword) // Если слова еще не встречалось

{

fprintf(stdout, "%s\n", pword); // Выводим слово

sizeoutword += sizeof(char *); // Считаем новый размер м-ва указ-лей на слова

poutword = realloc(poutword, sizeoutword); // Увел-ем размер массива указателей

if (poutword == NULL) exit(errormes(3, NULL)); // Если недостаточно памяти

poutword[numoutword] = calloc(maxlen + 1, sizeof(char)); // Выд. память под слово

if (poutword[numoutword] == NULL) exit(errormes(3, NULL));

strcpy(poutword[numoutword], pword); // Копируем слово в выделеный массив

numoutword++; // Увеличиваем счетчик выведенных слов

}

}

pstr = NULL; // При повторном вызове в strtok передаем NULL

}

return;

}

int errormes(int kod, char *pstr) //Вывод сообщения об ошибке соответствующее коду kod


{

if (kod == 1)

fprintf(stderr, "\nНеобходимо указать имя файла.\n");

if (kod == 2)

{

fprintf(stderr, "\nОшибка открытия файла на чтение.\n");

perror(pstr);

}

if (kod == 3)

fprintf(stderr, "\nНедостаточно памяти, возможно файл слишком большой.\n");

return -1;

}


Случайные файлы

Файл
153611.rtf
141821.rtf
3526.rtf
14492-1.rtf
Med psy 2.doc




Чтобы не видеть здесь видео-рекламу достаточно стать зарегистрированным пользователем.
Чтобы не видеть никакую рекламу на сайте, нужно стать VIP-пользователем.
Это можно сделать совершенно бесплатно. Читайте подробности тут.