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

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

Восстановить пароль Регистрация
 
Тина_Ливингстон
0 / 0 / 0
Регистрация: 01.11.2011
Сообщений: 59
16.01.2012, 01:19     Задача с файлами и строками! #1
В текстовом файле записаны строки длиной не более 255 символов, слова в которых разделены хотя бы одним пробелом или знаками препинания. В каждой строке поменять местами слова максимальной и минимальной длины. Если максимальных и/или минимальных слов несколько, то брать последнее. Результат записать в новый текстовый файл.

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

Операции с файлами и строками. C++
C++ Работа с файлами и строками
Лабы с файлами и строками C++
C++ Работа со строками и файлами
C++ Работа с файлами и строками
C++ Робота с файлами и строками
Работа со строками и файлами C++
Работа с файлами, со строками C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
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;
}
Это для введённой строки. Посмотрите, как работает, не сможете прикрутить файловый ввод/вывод - пишите...
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
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;
}
Yandex
Объявления
16.01.2012, 17:14     Задача с файлами и строками!
Ответ Создать тему
Опции темы

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