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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
#1

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

25.12.2011, 20:04. Просмотров 664. Ответов 10
Метки нет (Все метки)

Задана фраза - последовательность, содержащая от 2 до 30 слов, в каждом из которых от 2 до 10 букв; между соседними словами - не менее одного пробела, за последним словом - точка. Напечатать все слова, отличные от последнего слова, предварительно преобразовав каждое из них по следующему правилу: если слово нечётной длины, то удалить его среднюю букву.
Программа должна читать текст из файла input.txt и выводить последовательность в файл output.txt
\

Суть в том, что я понимаю, как нужно сделать задачу, но практических знаний совершенно не хватает. Пожалуйста, помогите с кодом.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.12.2011, 20:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача на обработку текста (sos) (C++):

Выполнить обработку текста - C++
Друзья, помогите пожалуйста: Выполнить обработку текста из внешнего текстового файла, созданного в редакторе. Результаты обработки...

Задача на обработку - C++
В каждой компоненте файла АБИТУРИЕНТ содержится: − фамилия абитуриента; − номер экзаменационного листа; − оценки ("З", "4" или...

Задача на обработку строк - C++
Дана строка символов. Преобразовать строку, удалив из нее все символы, не являющиеся буквами или цифрами.

Задача на обработку строки - C++
Народ, помогите решить задачу! Не знаю, как решать! Определить, равно ли количество символов в слове значению числа, стоящего перед...

Задача на последовательную обработку символов - C++
Дан текст произвольной длины,оканчивающийся точкой. Текст состоит из букв,разделенных пробелами. Подсчитать кол-во слов,оканчивающихся на...

задача на обработку символьных строк - C++
2. Разработать программу подсчёта статистики массива символьных строки в следующем виде: длина строки, количество пробелов, количество...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
10.01.2012, 07:20  [ТС] #2
Может всё же поможет кто? Погибаю как бы... Сам копался - толку мало(( Не получается.
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
10.01.2012, 07:51 #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]); К=нулю, если одинаковые
Начинайте делать и выкладывайте, что получается.
0
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
10.01.2012, 08:06  [ТС] #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);
}
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
10.01.2012, 08:27 #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);
    }
}
1
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
10.01.2012, 09:31  [ТС] #6
Спасибо! Оказалось действительно проще... Осталось написать сравнение с последним словом и всё =) С этим-то справлюсь.
0
zss
Модератор
Эксперт С++
6382 / 5947 / 1927
Регистрация: 18.12.2011
Сообщений: 15,264
Завершенные тесты: 1
10.01.2012, 09:41 #7
Сравнение с последним словом уже написано - строка 30
0
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
10.01.2012, 10:17  [ТС] #8
Это я заметил. Но почему-то на деле программа не сравнивает и выводит все слова, независимо от того, идентичны ли они последнему или нет.
0
neske
1495 / 862 / 82
Регистрация: 26.03.2010
Сообщений: 2,951
10.01.2012, 15:09 #9
C
1
if(strcmp(mas[i],mas[str-1])!=0)
?
1
Henny
0 / 0 / 0
Регистрация: 12.12.2011
Сообщений: 8
11.01.2012, 13:22  [ТС] #10
Да, эта строка. Но там немного неточность была. Программа проверяет уже отредактированные слова с последним. Так что эту проверку надо было перенести чуть выше) До цикла for.
0
easybudda
Модератор
Эксперт CЭксперт С++
9629 / 5577 / 947
Регистрация: 25.07.2009
Сообщений: 10,712
11.01.2012, 18:55 #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
$
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2012, 18:55
Привет! Вот еще темы с ответами:

Задача на обработку символов в строке - C++
Условие:Задать предложение.Убрать повторяющиеся буквы &quot;е&quot;.Вывести результат на экран с новой строки. как написать текст...

Задача на обработку символьной информации - C++
В заданном предложении найти слово, в котором количество буквы 'а' максимальна. Вывести найденное слово и посчитать, сколько раз буква 'а'...

задача на обработку последовательности символов - C++
Даны натуральное число n , символы S1, .... Sn. Заменить в последовательности S1, .... Sn, каждую группу букв child группой букв children. ...

SOS!!!!!SOS!!!!Даны натуральные числа от 20 до 50 - C++
Даны натуральные числа от 20 до 50.Напечатать те из них, которые делятся на 3,но не делятся на 5 помогите ПлиЗЗ Компилирую в Тurbo C++...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.01.2012, 18:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru