В текстовом файле нужно найти самое длинное предложение - 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; }

Объяснение кода листинга программы

  1. В этом коде представлена реализация буфера в виде структуры buf_t.
  2. Структура buf_t содержит указатель на строку (s), индекс позиции в этой строке (p) и размер строки (n).
  3. Функция buf_init инициализирует буфер, устанавливая все его поля в начальные значения.
  4. Функция buf_add добавляет символ в буфер. Если буфер пуст, он выделяет память под буфер. Если буфер заполнен, он удваивает его размер и добавляет новый символ.
  5. Функция buf_copy копирует содержимое одного буфера в другой.
  6. Функция buf_clear освобождает память, выделенную под буфер.
  7. Функция find_maxprop находит самое длинное предложение во входном потоке. Она использует буфер для хранения символов, которые могут составлять предложение.
  8. Если входной поток пуст или достигнут конец файла, функция возвращает 0.
  9. В противном случае она читает следующий символ из входного потока и добавляет его в буфер.
  10. Если символ является знаком пунктуации, функция проверяет, является ли предложение в буфере самым длинным из всех, которые она находила до сих пор.
  11. Если это так, она копирует содержимое буфера в буфер, который она передает в функцию buf_str, чтобы получить строку, представляющую предложение.
  12. Если предложение не является самым длинным, она очищает буфер и продолжает читать входной поток.
  13. Если во входном потоке достигнут конец файла или произошла ошибка чтения, функция возвращает 0.
  14. В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
  15. Если во входном потоке достигнут конец файла или произошла ошибка чтения, функция возвращает 0.
  16. В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
  17. Если входной поток пуст или достигнут конец файла, функция возвращает 0.
  18. В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.
  19. Если входной поток пуст или достигнут конец файла, функция возвращает 0.
  20. В противном случае она продолжает читать входной поток и проверять, является ли следующий символ знаком пунктуации.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5
Похожие ответы