Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] обработка текстового файа, помощь в алгоритме 
:(
    Опции темы
Jater
Дата 2.1.2009, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.11.2008

Репутация: 1
Всего: 1



Код
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
int i=0,max=0,min=1,r=0;   
char *ptr;
char *s=new char[255];
char *tmp;
char *tmp1;
char b[50][101],b1[50][101];
FILE *in;
char seps[] = " \r\n";  //разделители
    if((in=fopen("1.txt","rt"))!=NULL)                                // объявление и открытие файла
    {   
        while((fgets(s,255,in))!=NULL)
        {
            ptr=strtok(s,seps);
            while(ptr!=NULL)
            {    
                strcpy(&b[r][0],ptr);  //загоняю в массив все лексемы
                r++;
                ptr=strtok(NULL,seps);                                            //получение новой лексемы       
            }   
        }
    }
    else
    {
        cout<<"open file trouble";
        return 0;
    }
    fclose(in);
    for(i=0;i<r;i++)
        cout<<&b[i][0]<<endl;
    for(i=0;i<r;i++)    // определяю, max длины слово
    {
        if(strlen(&b[i][0])>max)
        {
            max=strlen(&b[i][0]);
            tmp=&b[i][0];
        }
    }
    cout<<"max length : "<<tmp<<endl;
    for(i=0;i<r;i++)              // min  длины слово
    {
        
        if(strlen(&b[i][0])<=min)
        {
            min=strlen(&b[i][0]);
            tmp1=&b[i][0];
        }
    }
    cout<<"min length : "<<tmp1<<endl;
for(i=0;i<r;i++)             //заменяю самое max на min
{
    if(strcmp(&b[i][0],tmp)==0)
    {
        strcpy(&b[i][0],tmp1);
    }

}
for(i=0;i<r;i++) 
{
         if(strcmp(&b[i][0],tmp1)==0)
    {
        strcpy(&b[i][0],tmp);
    }
}

cout<<endl;
    for(i=0;i<r;i++)
        cout<<&b[i][0]<<endl;
    return 0;
}



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

вот что на экране:
jlksajklsad
dsaasasewir
dsaasasewir
ewre
r
t
ry
u
try
t
rt
tyr
r
trr
max length : jlksajklsad
min length : r

r
dsaasasewir
dsaasasewir
ewre
r
t
ry
u
try
t
rt
tyr
r
trr


Я почти довел задачу до конца,но возникла проблема при замене слова max длины на min  и наоборот!!!
т.е.  получается,что я сначала заменяю max  на min, а потом все min на max))))!
подскажите пожалуйста,что поменять!!!!!
PM MAIL   Вверх
bsa
Дата 2.1.2009, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Так на каком языке ты пишешь? Если на C++, то зачем пользоваться fopen/fclose/fgets и string.h, когда можно намного удобнее использовать fstream, stringstream и string?
PM   Вверх
Jater
Дата 2.1.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.11.2008

Репутация: 1
Всего: 1



я то на С++,но нас именно так учили))
PM MAIL   Вверх
Hades
Дата 2.1.2009, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



меняем только
Код

char *tmp = new char[255];
char *tmp1 = new char[255];
...
min=strlen(&b[i][0]);
strcpy(tmp1, &b[i][0]);
...
min=strlen(&b[i][0]);
strcpy(tmp1, &b[i][0]);

и всё должно работать,
думаю теперь поймёте в чём ошибка.
PM MAIL   Вверх
Jater
Дата 2.1.2009, 22:39 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.11.2008

Репутация: 1
Всего: 1



да вот что-то не совсем.....
ПРОБЛЕМА в том что мне одновременно нужно поменять,слово максимальной длины на слово минимальной длины и наоборот!!!!!!
т.е. было
Цитата

jlksajklsad
dsaasasewir
dsaasasewir
ewre
r
t
ry
u
try
t
rt
tyr
r
trr
max length : jlksajklsad
min length : r


а должно стать вот так
Цитата

r
dsaasasewir
dsaasasewir
ewre
jlksajklsad
t
ry
u
try
t
rt
tyr
jlksajklsad
trr

PM MAIL   Вверх
Hades
Дата 2.1.2009, 23:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



Цитата(Jater @  2.1.2009,  15:42 Найти цитируемый пост)

Код

for(i=0;i<r;i++)
{    
    if(strcmp(&b[i][0],tmp)==0)    
    {        
        strcpy(&b[i][0],tmp1);    
    }
}

for(i=0;i<r;i++) 
{         
    if(strcmp(&b[i][0],tmp1)==0)    
    {        
        strcpy(&b[i][0],tmp);    
    }
}


поменяйте на
Код

for(i=0;i<r;i++)             
{
    if(strcmp(&b[i][0],tmp)==0)
    {
        strcpy(&b[i][0],tmp1);
    }
    else if(strcmp(&b[i][0],tmp1)==0)
    {
        strcpy(&b[i][0],tmp);
    }

}

PM MAIL   Вверх
Jater
Дата 2.1.2009, 23:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.11.2008

Репутация: 1
Всего: 1



Код
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
int i=0,max=0,min=1,r=0;   
char *ptr;
char *s=new char[255];
char *tmp;
char *tmp1;
char b[50][101],b1[50][101];
FILE *in;
char seps[] = " \r\n";  //разделители
    if((in=fopen("1.txt","rt"))!=NULL)                                // объявление и открытие файла
    {   
        while((fgets(s,255,in))!=NULL)
        {
            ptr=strtok(s,seps);
            while(ptr!=NULL)
            {    
                strcpy(&b[r][0],ptr);  //загоняю в массив все лексемы
                r++;
                ptr=strtok(NULL,seps);                                            //получение новой лексемы       
            }   
        }
    }
    else
    {
        cout<<"open file trouble";
        return 0;
    }
    fclose(in);
    for(i=0;i<r;i++)
        cout<<&b[i][0]<<endl;
    for(i=0;i<r;i++)    // определяю, max длины слово
    {
        if(strlen(&b[i][0])>max)
        {
            max=strlen(&b[i][0]);
            tmp=&b[i][0];
        }
    }
    cout<<"max length : "<<tmp<<endl;
    for(i=0;i<r;i++)              // min  длины слово
    {
        
        if(strlen(&b[i][0])<=min)
        {
            min=strlen(&b[i][0]);
            tmp1=&b[i][0];
        }
    }
    cout<<"min length : "<<tmp1<<endl;
for(i=0;i<r;i++)             
{
    if(strcmp(&b[i][0],tmp)==0)
    {
        strcpy(&b[i][0],tmp1);
    }
    else 
        if(strcmp(&b[i][0],tmp1)==0)
        {
            strcpy(&b[i][0],tmp);
        }
}
cout<<endl;
    for(i=0;i<r;i++)
        cout<<&b[i][0]<<endl;
    return 0;
}


этот код ,к сожалению не делает то что нужно....
проверьте  сами...может у вас и будет работать...хотя вроде все логично
PM MAIL   Вверх
Hades
Дата 2.1.2009, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



Jater, 
я же написал
Цитата(Hades @  2.1.2009,  20:12 Найти цитируемый пост)

Код

char *tmp = new char[255];
char *tmp1 = new char[255];
...
max=strlen(&b[i][0]);
strcpy(tmp, &b[i][0]);
...
min=strlen(&b[i][0]);
strcpy(tmp1, &b[i][0]);




Это сообщение отредактировал(а) Hades - 2.1.2009, 23:34
PM MAIL   Вверх
Jater
Дата 2.1.2009, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.11.2008

Репутация: 1
Всего: 1



Точно!!!работает....сори,что туплю....)))спасибо огромное!
пока не очень понял как то что я изменил повлияло на долгожданный результат!!!! можно немного пояснить?



т.е. почему из-за того что char *tmp = new char[255];       и потому что  я скопировал в tmp  и tmp1 &b[i][0]  ???
                                            char *tmp1 = new char[255];

Это сообщение отредактировал(а) Jater - 2.1.2009, 23:43
PM MAIL   Вверх
Hades
Дата 2.1.2009, 23:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 226
Регистрация: 8.8.2008

Репутация: нет
Всего: 37



tmp указывает на максимальную строку
Код

if(strcmp(&b[i][0],tmp)==0)
{
    strcpy(&b[i][0],tmp1);
}

здесь мы меняем максимальную строку на минимальную,
и получается что теперь tmp указывает на минимальную строку.

Добавлено через 1 минуту и 34 секунды
P.S. Пройдитесь по программе пошагово.
PM MAIL   Вверх
Jater
Дата 2.1.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 1.11.2008

Репутация: 1
Всего: 1



большое спасибо за помощь!!!!!!
PM MAIL   Вверх
bsa
Дата 6.1.2009, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196




M
bsa
Jater, если вопрос исчерпан, то пометь тему решенной

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.