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

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

Войти
Регистрация
Восстановить пароль
 
Тина_Ливингстон
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 59
#1

Задача с файлами и строками! - C++

16.01.2012, 01:19. Просмотров 494. Ответов 2
Метки нет (Все метки)

В текстовом файле записаны строки длиной не более 255 символов, слова в которых разделены хотя бы одним пробелом или знаками препинания. В каждой строке поменять местами слова максимальной и минимальной длины. Если максимальных и/или минимальных слов несколько, то брать последнее. Результат записать в новый текстовый файл.

Добавлено через 8 часов 17 минут
Помогите, пожалуйста!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2012, 01:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задача с файлами и строками! (C++):

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

Работа с файлами и строками - C++
Раздел "Работа с файлами и строками" Задание :"Написать программу, которая считывает английский текст из файла и выводит на экран слова,...

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

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

Работа с файлами и строками. - C++
Прошу помочь с этой задачкой, ибо СИ дается почему-то сложнее Паскаля, а темы на файлы, по-моему, самые сложные. Очень нужно. В общем...

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

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
easybudda
Модератор
Эксперт CЭксперт С++
9627 / 5575 / 947
Регистрация: 25.07.2009
Сообщений: 10,710
16.01.2012, 16:35 #2
Мы простых путей не ищем!
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    
typedef struct WORDINFO {
    char * wi_ptr;
    int wi_len;
} wordinfo_t;
    
int last_max_word(const char * str, const char * delim, wordinfo_t * wi){
    char * buf, * curPtr, * maxPtr;
    int maxLen, curLen;
    
    if ( ! ( buf = strdup(str) ) )
        return -1;
    
    for ( maxLen = 0, maxPtr = buf, curPtr = strtok(buf, delim); curPtr != NULL; curPtr = strtok(NULL, delim) ){
        if ( maxLen <= ( curLen = strlen(curPtr) ) ){
            maxLen = curLen;
            maxPtr = curPtr;
        }
    }
    
    wi->wi_len = maxLen;
    wi->wi_ptr = (char*)str + (maxPtr - buf);
    
    free(buf);
    return 0;
}
 
int last_min_word(const char * str, const char * delim, wordinfo_t * wi){
    char * buf, * curPtr, * minPtr;
    int minLen, curLen;
    
    if ( ! ( buf = strdup(str) ) )
        return -1;
    
    for ( minLen = strlen(buf), minPtr = buf, curPtr = strtok(buf, delim); curPtr != NULL; curPtr = strtok(NULL, delim) ){
        if ( minLen >= ( curLen = strlen(curPtr) ) ){
            minLen = curLen;
            minPtr = curPtr;
        }
    }
        
    wi->wi_len = minLen;
    wi->wi_ptr = (char*)str + (minPtr - buf);
    
    free(buf);
    return 0;
}
 
#define STR_LEN 256
#define DELIM " ,.!?-;:\t\n"
    
int main(void){
    char inStr[STR_LEN], outStr[STR_LEN], * ptr;
    
    while ( printf("String: ") && fgets(inStr, STR_LEN, stdin) && *inStr != '\n' ){
        wordinfo_t minWord, maxWord;
        
        if ( last_max_word(inStr, DELIM, &maxWord) || last_min_word(inStr, DELIM, &minWord) ){
            fprintf(stderr, "Memory error!\n");
            exit(1);
        }
        if ( minWord.wi_ptr == maxWord.wi_ptr ){
            fprintf(stderr, "The same words, nothing to change!\n");
            continue;
        }
        else if ( minWord.wi_ptr > maxWord.wi_ptr ){
            wordinfo_t tmp = minWord;
            minWord = maxWord;
            maxWord = tmp;
        }
        
        ptr = outStr;
        strncpy(ptr, inStr, minWord.wi_ptr - inStr);
        ptr += minWord.wi_ptr - inStr;
        strncpy(ptr, maxWord.wi_ptr, maxWord.wi_len);
        ptr += maxWord.wi_len;
        strncpy(ptr, minWord.wi_ptr + minWord.wi_len, maxWord.wi_ptr - (minWord.wi_ptr + minWord.wi_len));
        ptr += maxWord.wi_ptr - (minWord.wi_ptr + minWord.wi_len);
        strncpy(ptr, minWord.wi_ptr, minWord.wi_len);
        ptr += minWord.wi_len;
        strcpy(ptr, maxWord.wi_ptr + maxWord.wi_len);
        
        printf("Result: %s", outStr);
    }
    
    return 0;
}
Это для введённой строки. Посмотрите, как работает, не сможете прикрутить файловый ввод/вывод - пишите...
0
retmas
Жарю без масла
859 / 741 / 164
Регистрация: 13.01.2012
Сообщений: 1,694
16.01.2012, 17:14 #3
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#include <cctype>
#include <fstream>
#include <cstring>
 
using namespace std;
 
enum Delim
{
    WORD,
    DELIM,
    NONE
};
 
struct Token
{
    char* tok;
    Delim type;
    Token* prev;
    Token* next;
 
    Token() : tok(), type(NONE), prev(), next() {}
    Token(const char* s, size_t slen, Delim t) : type(t), prev(), next()
    {
        tok = new char[slen + 1];
        strncpy(tok, s, slen);
        tok[slen] = '\0';
    }
    // деструктор не заботится о next, т.к. выделение/освобождение памяти
    // под новые токены происходят в create_new_list_from_str/delete_list
    // поскольку структура не ставит преред собой задачи реализовать нормальный список
    ~Token()
    {
        delete[] tok;
    }
};
 
Token* create_new_list_from_str(const char*);
char* fill_str_from_list(char*, const Token*);
void delete_list(Token*);
Token* find_last_min_word(Token*);
Token* find_last_max_word(Token*);
void swap_tokens(Token*, Token*);
 
 
int main()
{
    ifstream ifs("D:\\work\\Study\\Test\\input.txt");
    ofstream ofs("D:\\work\\Study\\Test\\output.txt");
 
    while(ifs)
    {
        const int max_len = 255+1; // 255 символов + '\0'
        char line[max_len] = {0};
 
        ifs.getline(line, max_len);
        if(!ifs)
            break;
 
        Token* tok_list = create_new_list_from_str(line);
        Token* word_min = find_last_min_word(tok_list);
        Token* word_max = find_last_max_word(tok_list);
        swap_tokens(word_min, word_max);
        fill_str_from_list(line, tok_list);
        delete_list(tok_list);
        ofs << line << endl;
    }
 
    return 0;
}
 
Token* create_new_list_from_str(const char* str)
{
    Token* tlist = 0;
    Token* tcur = 0;
 
    if(str == 0)
        return tlist;
 
    while(*str != '\0')
    {
        const char* end = str;
        Token* token = 0;
 
        // выделяем из строки слово
        if(isalnum(*str))
        {
            while(isalnum(*end))
                ++end;
            token = new Token(str, end - str, WORD);
        }
        // выделяем из строки знаки препинания/пробелы
        else
        {
            while(ispunct(*end) || isspace(*end))
                ++end;
            token = new Token(str, end - str, DELIM);
        }
 
        str = end;
 
        if(tlist == 0)
            tlist = tcur = token;
        else
        {
            tcur->next = token;
            token->prev = tcur;
            tcur = token;
        }
    }
    return tlist;
}
 
void delete_list(Token* tlist)
{
    Token* t = tlist;
    while(t != 0)
    {
        tlist = t->next;
        delete t;
        t = tlist;
    }
}
 
Token* find_last_max_word(Token* tlist)
{
    int len_max = 0;
    Token* t = 0;
    while(tlist != 0)
    {
        if(tlist->type == WORD)
        {
            int cur_len = strlen(tlist->tok);
            if(cur_len >= len_max)
            {
                len_max = cur_len;
                t = tlist;
            }
        }
        tlist = tlist->next;
    }
    return t;
}
 
Token* find_last_min_word(Token* tlist)
{
    int len_min = 255;
    Token* t = 0;
    while(tlist != 0)
    {
        if(tlist->type == WORD)
        {
            int cur_len = strlen(tlist->tok);
            if(cur_len <= len_min)
            {
                len_min = cur_len;
                t = tlist;
            }
        }
        tlist = tlist->next;
    }
    return t;
}
 
void swap_tokens(Token* t1, Token* t2)
{
    char* p = t1->tok;
    t1->tok = t2->tok;
    t2->tok = p;
}
 
// str должна иметь достаточную длину
char* fill_str_from_list(char* str, const Token* tlist)
{
    int i = 0;
    while(tlist != 0)
    {
        strcpy(&str[i], tlist->tok);
        i += strlen(tlist->tok);
        tlist = tlist->next;
    }
    str[i] = '\0';
    return str;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2012, 17:14
Привет! Вот еще темы с ответами:

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

Лабы с файлами и строками - C++
Ребят, можете помочь с лабораторными ? 1)Заданная строка,заменить слово наименьшей длины количество его символов 2)Составить программу,...

Работа с файлами и строками - C++
помогите пожалуйста вот с этой программой Вообщем задание такое Прочитать текст из файла и вывести на экран только первые буквы слов. ...

Работа с файлами и строками - C++
Доброго времени суток, изучаю С++ по учебнику и практикуму Павловской 2003 г. Столкнулся с проблемой когда делал задачку по поиску...


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

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

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