Форум программистов, компьютерный форум CyberForum.ru

Задача на обработку текста (sos) - C++

Восстановить пароль Регистрация
 
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
25.12.2011, 20:04     Задача на обработку текста (sos) #1
Задана фраза - последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 букв; между соседними словами - не менее одного пробела, за последним словом - точка. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: если слово нечётной длины, то удалить его среднюю букву.
Программа должна читать текст из файла input.txt и выводить последовательность в файл output.txt
\

Суть в том, что я понимаю, как нужно сделать задачу, но практических знаний совершенно не хватает. Пожалуйста, помогите с кодом.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
10.01.2012, 07:20  [ТС]     Задача на обработку текста (sos) #2
Может всё же поможет кто? Погибаю как бы... Сам копался - толку мало(( Не получается.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
10.01.2012, 07:51     Задача на обработку текста (sos) #3
1. Создайте массив words[30][11];
2. Откройте файл FILE *ff=fopen("input.txt","rt");
2. В цикле считайте фразу по словам в массив функцией fscanf(ff,"%s"&word[i]);
3. Длина каждого слова int L=strlen(word[i]); Средняя буква =L/2;
4. Сравнение слов K=strcmp(word[i],word[j]); К=нулю, если одинаковые
Начинайте делать и выкладывайте, что получается.
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
10.01.2012, 08:06  [ТС]     Задача на обработку текста (sos) #4
Боюсь, мало что соображаю в этом...пытался разбираться по похожей программе, но с удалением первой буквы в словах. К сожалению, неудачно... Ниже привожу код.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int possl(char x[10], char y[10])
{
int i=0;
while (x[i]==y[i]&&x[i]!=0&&y[i]!=0)
i++;
if(x[i]==y[i]) return 1; else return 0;
}
/* Main */
void main(void)
{
char mas[30][10];
FILE *in;
in=fopen("input.txt","rt");
char ch;
int i=0,j=0,w=1;
while (!feof(in))
{
ch=fgetc(in);
if(ch=='.') {mas[i][j]=0;break;}
if(ch!=' ') {mas[i][j]=ch; j++; w=0;}
else
if(!w)
{mas[i][j]=0; i++; j=0; w=1;}
}
fclose(in);
int str=i; 
for(i=0;i<str;i++)
if(!possl(mas[i],mas[str]))
for(j=0;j<strlen(mas[i]);j++)
{
ch=mas[i][j];
mas[i][j]=mas[i][j+1];
mas[i][j+1]=ch;
}
FILE *out;
out=fopen("output.txt","wt");
for (i=0;i<str;i++)
if(!possl(mas[i],mas[str]))
{
int j=0;
while (mas[i][j]!=0)
{
fputc(mas[i][j],out);
j++;
}
fputc(' ',out);
}
fclose(out);
}
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
10.01.2012, 08:27     Задача на обработку текста (sos) #5
Ваша задача ведь проще
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <string.h>
#include <stdio.h>
void main(void)
{
    char mas[30][11];
    FILE *in;
    in=fopen("input.txt","rt");
    if(in!=NULL)
    {
        int i=0;
        while (!feof(in) && i<30)
        {
            fscanf(in,"%s",&mas[i]);
            int L=strlen(mas[i]);
            if(mas[i][L-1]=='.')break;
            i++;
        }
        fclose(in);
        int str=i; 
        for(i=0;i<str;i++)
        {
            int L=strlen(mas[i]);
            if(L%2!=0)
                for(int j=L/2;j<L-1;j++)
                    mas[i][j]=mas[i][j+1];
        }
        FILE *out;
        out=fopen("output.txt","wt");
        for (i=0;i<str;i++)
            if(strcmp(mas[i],mas[str])!=0)
                fprintf(out,"%s ",mas[i]);
        fclose(out);
    }
}
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
10.01.2012, 09:31  [ТС]     Задача на обработку текста (sos) #6
Спасибо! Оказалось действительно проще... Осталось написать сравнение с последним словом и всё =) С этим-то справлюсь.
zss
Модератор
Эксперт С++
 Аватар для zss
5942 / 5547 / 1783
Регистрация: 18.12.2011
Сообщений: 14,164
Завершенные тесты: 1
10.01.2012, 09:41     Задача на обработку текста (sos) #7
Сравнение с последним словом уже написано - строка 30
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
10.01.2012, 10:17  [ТС]     Задача на обработку текста (sos) #8
Это я заметил. Но почему-то на деле программа не сравнивает и выводит все слова, независимо от того, идентичны ли они последнему или нет.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,689
10.01.2012, 15:09     Задача на обработку текста (sos) #9
C
1
if(strcmp(mas[i],mas[str-1])!=0)
?
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
11.01.2012, 13:22  [ТС]     Задача на обработку текста (sos) #10
Да, эта строка. Но там немного неточность была. Программа проверяет уже отредактированные слова с последним. Так что эту проверку надо было перенести чуть выше) До цикла for.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2012, 18:55     Задача на обработку текста (sos)
Еще ссылки по теме:

Задача на обработку строк C++
C++ Задача на обработку

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.01.2012, 18:55     Задача на обработку текста (sos) #11
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
    
#define WORDS_MAX 30
#define WORD_LEN 11
#define WORD_MIN_LEN 2
#define WORD_MASK "%10s"
#define INPUT_FILE "input.txt"
#define OUTPUT_FILE "output.txt"
    
int main(void){
    FILE * f;
    char words[WORDS_MAX][WORD_LEN], * p;
    int i, count, len;
    
    if ( ! ( f = fopen(INPUT_FILE, "r") ) ){
        perror("fopen");
        exit(1);
    }
    
    for ( count = 0; count < WORDS_MAX && fscanf(f, WORD_MASK, words[count]) == 1; ++count ){
        if ( strlen(words[count]) < WORD_MIN_LEN ){
            fprintf(stderr, "Wrong content in input file!\n");
            exit(1);
        }
        if ( p = strrchr(words[count], '.') ){
            *p = '\0';
            ++count;
            break;
        }
    }
    
    if ( ferror(f) || fclose(f) ){
        perror("FILE");
        exit(1);
    }
    
    if ( count < 2 ){
        fprintf(stderr, "Only one word found in input file!\n");
        exit(1);
    }
    
    if ( ! ( f = fopen(OUTPUT_FILE, "w") ) ){
        perror("fopen");
        exit(1);
    }
    
    for ( i = 0; i < count - 1; ++i ){
        if ( strcmp(words[i], words[count-1]) ){
            if ( ( len = strlen(words[i]) ) & 1 ){
                p = words[i] + len / 2;
                memmove(p, p + 1, strlen(p));
            }
            if ( fprintf(f, "%s ", words[i]) < 0 ){
                perror("fprintf");
                exit(1);
            }
        }
    }
    
    if ( fclose(f) ){
        perror("FILE");
        exit(1);
    }
    
    fprintf(stderr, "Done.\n");
    exit(0);
}
Код
andrew@rd-andrew ~/cpp/files
$ cat input.txt
abc defg abcd abcde defg abcdefg abcd. zzz abc
andrew@rd-andrew ~/cpp/files
$ gcc -o even_words_not_like_last even_words_not_like_last.c

andrew@rd-andrew ~/cpp/files
$ ./even_words_not_like_last
Done.

andrew@rd-andrew ~/cpp/files
$ cat output.txt
ac defg abde defg abcefg
andrew@rd-andrew ~/cpp/files
$
Yandex
Объявления
11.01.2012, 18:55     Задача на обработку текста (sos)
Ответ Создать тему
Опции темы

Текущее время: 00:09. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru