В текстовом файле нужно найти самое длинное предложение - 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.
- В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д