В текстовом файле нужно найти самое длинное предложение - C (СИ)
Формулировка задачи:
в текстовом файле нужно найти самое длинное предложение
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <string.h>
- #include "time.h"
- void time_step (FILE*f)
- {
- time_t t;
- t=time(NULL);
- fprintf(f, " %s \n",ctime(&t));
- }
- main (int argc, char *argv[])
- {
- char buffer[20], ch, word[2000], N[2];
- FILE *fx, *fy, *flog;
- int SW, I, Pro;
- printf("Kratkoe izlozhenie zadachi:\n");
- printf("V tekstovom fayle nayti samoe dlinnoe predlozhenie\n");
- sprintf(buffer,"%s.log",argv[0]);
- if((flog=fopen(buffer,"a"))==NULL)
- {
- puts("Oshibka otkryitiya zhurnala");
- puts("press Enter");
- getchar();
- exit(0);
- }
- time_step(flog);
- fprintf(flog, "programma %s pristupila k rabote\n", argv[0]);
- if (argc<4)
- {
- time_step(flog);
- fprintf(flog, "Oshibka,nedostatochno argumentov komandnoy stroki,rabota zavershena\n", argv[0]);
- fclose(flog);
- printf("Oshibka,ispolzuyte %s <imya fayla> <imya fayla> \n",argv[0]);
- puts("Press Enter");
- getchar();
- exit(0);
- }
- if((fx=fopen(argv[1],"r"))==NULL)
- {
- time_step(flog);
- fprintf(flog, " Oshibka nevozmozhno otkryit vhodnoy fayl %s ", argv[1]);
- printf(" %s\n", argv[1]);
- printf("nevozmozhno otkryit fayl\n");
- puts("press Enter");
- getchar();
- fclose(flog);
- exit(0);
- }
- time_step(flog);
- fprintf(flog, "fayl %s uspeshno otkryit\n",argv[1]);
- if((fy=fopen(argv[2],"a"))==NULL)
- {
- time_step(flog);
- fprintf(flog,"Oshibka nevozmozhno otkryit vhodnoy fayl %s ",argv[2]);
- printf("nevozmozhno otkryit vhodnoy fayl\n");
- getchar();
- fclose(flog);
- exit(0);
- }
- time_step(flog);
- fprintf(flog,"fayl %s uspeshno otkryit\n",argv[2]);
- sprintf(N,"%s",argv[3]);
- SW=0;
- while(1)
- {//начало поиска
- {
- SW++;
- }
- }
- fprintf(fy,"samoe dlinnoe predlozenie %s ", );
- fprintf(fy,"\n");
- printf("\n");
- fclose(fx);
- fclose(fy);
- time_step(flog);
- fprintf(flog,"operatsiya vyipolnena uspeshno\n%s i %s uspeshno zakryityi, programma zavershila rabotu\n",argv[1],argv[2]);
- printf("operatsiya vyipolnena \n");
- puts("press Enter");
- getchar();
- fclose(flog);
- exit(0);
- }
Решение задачи: «В текстовом файле нужно найти самое длинное предложение»
textual
Листинг программы
- #include <stdio.h>
- #include <string.h>
- #include <malloc.h>
- typedef struct {
- char* s;
- size_t p;
- size_t n;
- } buf_t;
- inline void buf_init(buf_t* b);
- inline int buf_empty(buf_t* b);
- inline char buf_at(const buf_t* b, size_t i);
- inline const char* buf_str(buf_t* b);
- inline size_t buf_length(const buf_t* b);
- inline void buf_reset(buf_t* b);
- int buf_add(buf_t* b, char c);
- int buf_copy(buf_t* d, const buf_t* s);
- void buf_clear(buf_t* b);
- int find_maxprop(FILE* _in, buf_t* m);
- int main(void){
- buf_t m;
- /*
- работа с файлом
- FILE* fp = fopen("file.txt", "rt");
- buf_init(&m);
- if(find_maxprop(fp, &m))
- printf("find max: %s\n", buf_str(&m));
- fclose(fp);
- */
- buf_init(&m);
- if(find_maxprop(stdin, &m))
- printf("find max: %s\n", buf_str(&m));
- buf_clear(&m);
- return 0;
- }
- //найти самое длинное предложение во входном потоке
- int find_maxprop(FILE* _in, buf_t* m){
- int c;
- buf_t b;
- if((_in == NULL) || feof(_in))
- return 0;
- buf_init(&b);
- buf_reset(m);
- do {
- c = fgetc(_in);
- if(c == '.' || c == '!' || c == '?' || c == EOF){
- if(buf_length(&b) > buf_length(m)){
- if(! buf_copy(m, &b))
- goto err;
- }
- buf_reset(&b);
- } else {
- if(! buf_add(&b, (char)c))
- goto err;
- }
- } while((c != EOF) && !ferror(_in));
- buf_clear(&b);
- return 1;
- err:
- buf_clear(&b);
- buf_clear(m);
- return 0;
- }
- //--------------
- int buf_add(buf_t* b, char c){
- char* t;
- size_t m;
- if(b->s == NULL){
- b->s = (char*)malloc(b->n * sizeof(char));
- if(b->s == NULL)
- return 0;
- } else if((b->p + 1) >= b->n){
- m = b->p + 1 + (b->n >> 1);
- t = (char*)realloc(b->s, m * sizeof(char));
- if(t == NULL)
- return 0;
- b->s = t;
- b->n = m;
- }
- b->s[b->p++] = c;
- return 1;
- }
- int buf_copy(buf_t* d, const buf_t* s){
- size_t i;
- int r = 1;
- buf_reset(d);
- for(i = 0; i < buf_length(s); ++i){
- if(! buf_add(d, buf_at(s, i))){
- r = 0;
- break;
- }
- }
- return r;
- }
- void buf_clear(buf_t* b){
- if(b->s != NULL)
- free(b->s);
- b->s = NULL;
- b->p = 0;
- b->n = 32;
- }
- inline void buf_init(buf_t* b){
- b->s = NULL;
- b->p = 0;
- b->n = 32;
- }
- inline const char* buf_str(buf_t* b){
- b->s[b->p] = '\0';
- return &b->s[0];
- }
- inline char buf_at(const buf_t* b, size_t i) { return b->s[i]; }
- inline int buf_empty(buf_t* b) { return (b->s == NULL); }
- inline size_t buf_length(const buf_t* b) { return b->p; }
- inline void buf_reset(buf_t* b) { b->p = 0; }
Объяснение кода листинга программы
- В этом коде представлена реализация буфера в виде структуры buf_t.
- Структура buf_t содержит указатель на строку (s), индекс позиции в этой строке (p) и размер строки (n).
- Функция buf_init инициализирует буфер, устанавливая все его поля в начальные значения.
- Функция buf_add добавляет символ в буфер. Если буфер пуст, он выделяет память под буфер. Если буфер заполнен, он удваивает его размер и добавляет новый символ.
- Функция buf_copy копирует содержимое одного буфера в другой.
- Функция buf_clear освобождает память, выделенную под буфер.
- Функция find_maxprop находит самое длинное предложение во входном потоке. Она использует буфер для хранения символов, которые могут составлять предложение.
- Если входной поток пуст или достигнут конец файла, функция возвращает 0.
- В противном случае она читает следующий символ из входного потока и добавляет его в буфер.
- Если символ является знаком пунктуации, функция проверяет, является ли предложение в буфере самым длинным из всех, которые она находила до сих пор.
- Если это так, она копирует содержимое буфера в буфер, который она передает в функцию buf_str, чтобы получить строку, представляющую предложение.
- Если предложение не является самым длинным, она очищает буфер и продолжает читать входной поток.
- Если во входном потоке достигнут конец файла или произошла ошибка чтения, функция возвращает 0.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
- Если во входном потоке достигнут конец файла или произошла ошибка чтения, функция возвращает 0.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
- Если входной поток пуст или достигнут конец файла, функция возвращает 0.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
- Если входной поток пуст или достигнут конец файла, функция возвращает 0.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д