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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Стуктура текста 
V
    Опции темы
Garcian
Дата 11.5.2009, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Здравствуйте Уважаемые Программисты!
Имеется следущая задача:
Для слов, разделенных более чем одним пробелом, оставить 1 пробел. Пользоваться можно только структурами. Осуществляется чтение из текста.
Вот мой код:
Код

#include <iostream>
#include <fstream>
#include <conio.h>

using namespace std;

struct Str {
    char T[30];
    int Lenght;
};

struct Text {
    Str T[30];
    int Size;
};    
    
int ReadStr (Text *t, int ind, fstream *fin)
{
    int a=0; char fl;
    t -> T[ind].Lenght = 0;
    while(1)
 {
        *fin >> fl;
        if((!fin -> eof())&&(fl != '\n')) t -> T[ind].T[t -> T[ind].Lenght++] = fl;
        if(t -> T[ind].Lenght == 30){
            a = 2;
            while(!fin -> eof()){
                *fin >> fl;
                if(fl == '\n')break;
            }
            if(fin -> eof()) a = 0;
            break;
        }
        if(fl == '\n') {a = 1; break; }
        if(fin -> eof()) {a = 0;break; }
  }
    return a;
}

void ReadText (Text *t, fstream *fin)
{
    int a;
    t -> Size = 0;
    while(1)
 {
        a = ReadStr(t,t -> Size++, fin);
        if((!a)||(t -> Size >= 15)) break;
 }
}    

void OutText (Text *t) 
{
    int i,j;
    for (i = 0; i < t -> Size; i++) {
        for (j = 0; j < t -> T[i].Lenght; j++) 
        cout << t -> T[i].T[j];
        cout << endl;    
    }
}   

int Alchemist (Text *t)  
{
    int  a, g, k;
    for (int i = 0; i < t -> Size; i++) { 
        for (int j = 0; j < t -> T[i].Lenght; j++) {
            if (t -> T[i].T[j] == ' ') a = j; 
            if (t -> T[i].T[a] == t -> T[i].T[a+1]) 
            { 
                for (k = a + 1; ((t -> T[i].T[k] == ' ') && (k < t -> T[i].Lenght)); k++) { 
                for (int i = 0; i < t -> Size; i++) {
                    for (int j = 0; j < t -> T[i].T[k]; j++) {
                        for (g = k; g < t -> T[i].Lenght - 1; g ++) 
                        {
                            t -> T[i].T[j] = t -> T[i].T[j+1];
                            t -> T[i].Lenght--;
                        }                      
                    }
                }
                }    
        }    
            else return 0;
        }
    }
}                
                                       
 

int main () 
{
    Text t;
    fstream fin;
    fin.open("C:\\Users\\5\\L3_in.txt", ios::in);
    fin.unsetf (ios::skipws);
    ReadText (&t, &fin);
    fin.close();
    cout << "Ishodniy text: " << endl << endl;
    OutText (&t);
    cout << endl << endl << "result: " << endl << endl;
    Alchemist (&t);
    OutText(&t);
    getch();
}  


С чтением и выводом на экран все в порядке. Тем не менее программа виснет.
Видимо ошибка в функции, выполняющей главную задачу (хотя мне она кажется правильной).
Помогите, пож-ста! 
--------------------
Неродивый студент
PM MAIL   Вверх
bsa
Дата 11.5.2009, 19:47 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну раз считаешь, что виснет главная функция, то дойди до нее отладчиком и посмотри. Или сделай отладочный вывод.

Кстати, для решения твоей задачи совсем не надо пользоваться структурами. Это легко делается в несколько строчек:
Код
#include <fstream>
#include <iostream>
#include <iomanip>

int main()
{
   std::ifstream file("file.txt");
   if ( !file.is_open() )
      return 1; //файл не открыт
   file >> std::noskipws; //запрет автоматического пропуска пробельных символов
   bool space = false;
   char c;
   while( (file >> c).good() ) {
      if (!space) { //если до этого был не пробел - то в любом случае выводим на экран
          if (c == ' ') //если текущий симвом - пробел, то выставляем флаг
            space = true;
      } else { //перед этим был пробел
            if (c == ' ')
               continue; //если текущий символ тоже пробел, то не выводим его
            else
                space = false; //в противном случае снимаем флаг
      }
      std::cout << c; //выводим на экран
   }
   return 0;
}

PM   Вверх
Garcian
Дата 11.5.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



bsa, спасибо конечно, я бы и не пользовался - задание же дается на изучение структур, поэтому только с ними. Я бы про ошибку и не спрашивал, но уж слишком долго я вожусь с ней. А проблема не в мэйне, а в Alchemistе, хотя опять же - по синтаксису все верно (да и по логике все должно работать)
--------------------
Неродивый студент
PM MAIL   Вверх
artsb
Дата 11.5.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Garcian, у тебя в функции Alchemist в подциклах объявляются счётчики с такими же именами как и во внешних. Лучше так не делать. Попробуй дать им другие имена.


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Dov
Дата 11.5.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

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



Цитата(Garcian @  11.5.2009,  18:34 Найти цитируемый пост)
int  a, g, k;

У тебя начальные значения не инициализированы, по-этому могут содержать мусор в дальнейших вычислениях, если условия не выполнятся.. 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
artsb
Дата 11.5.2009, 21:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(Dov @  11.5.2009,  21:07 Найти цитируемый пост)
У тебя начальные значения не инициализированы, по-этому могут содержать мусор в дальнейших вычислениях, если условия не выполнятся..  

Кстати, да. Я что-то не заметил smile
Т.е. если это условие не выполнится
Код

 if (t -> T[i].T[j] == ' ') a = j; 

то в переменной а останется мусор. И тогда здесь
Код

 if (t -> T[i].T[a] == t -> T[i].T[a+1]) 

вы можете ссылаться на не существующий элемент массива. Как известно, в С++ нет контроля границ...

Это сообщение отредактировал(а) artsb - 11.5.2009, 21:36


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Garcian
Дата 12.5.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо большое) Теперь не виснет) Но и программа работает не так как надо) Вообще в мэйне я рано закрыл файл. Потом при не обнаружении пробела в первом символе программа не выполняется. ДАже если это не так выдает не пойми что)
--------------------
Неродивый студент
PM MAIL   Вверх
Garcian
Дата 12.5.2009, 01:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



эххх впринципе до строки
Код

for (k = a + 1; ((t -> T[i].T[k] == ' ') && (k < t -> T[i].Lenght)); k++) {

все верно.. дальше уже непорядок. Помогите разобраться smile 
--------------------
Неродивый студент
PM MAIL   Вверх
artsb
Дата 12.5.2009, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Что-то всё так запутано smile
Код

int Alchemist (Text *t)  
{
    int  a = 0, g = 0, k = 0;
    for (int i = 0; i < t -> Size; i++) { 
        for (int j = 0; j < t -> T[i].Lenght; j++) {
            if (t -> T[i].T[j] == ' ') a = j; 
            if (t -> T[i].T[a] == t -> T[i].T[a+1]) 
            { 
                for (k = a + 1; ((t -> T[i].T[k] == ' ') && (k < t -> T[i].Lenght)); k++) { 
                for (int n = 0; n < t -> Size; n++) {  // не понятно, зачем вы опять
                    for (int m = 0; m < t -> T[n].T[k]; m++) {  // пробегаете по всем строкам. Везде одинаковое количество пробелов?
                        for (g = k; g < t -> T[n].Lenght - 1; g ++)  // здесь "-1", как мне кажется, лишний
                        {
                            //  здесь вы нигде не используете g
                            t -> T[n].T[m] = t -> T[n].T[m+1];
                            t -> T[n].Lenght--; // вы при каждой итерации уменьшаете Length, а выше у вас стоит проверка!
                        }                      
                    }
                }
                }    
        }    
            else return 0;
        }
    }
}  



--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Garcian
Дата 12.5.2009, 19:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



artsb, да тут бреда много) 
Цитата(artsb @  12.5.2009,  09:26 Найти цитируемый пост)
 здесь "-1", как мне кажется, лишний

тут есть риск выйти за границу имхо (рассматривал как то, уже подзабыл). В общем попробую исправить,  новый вариант выложу еще)

--------------------
Неродивый студент
PM MAIL   Вверх
gosn1ck
Дата 12.5.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Garcian @ 11.5.2009,  20:47)
bsa, спасибо конечно, я бы и не пользовался - задание же дается на изучение структур, поэтому только с ними. Я бы про ошибку и не спрашивал, но уж слишком долго я вожусь с ней. А проблема не в мэйне, а в Alchemistе, хотя опять же - по синтаксису все верно (да и по логике все должно работать)

не пойму, а что мешает в коде представленном bsa заменить char c на 
Код

struct Text{
char c;
};
Text T;
T->c;




 
PM MAIL ICQ   Вверх
bsa
Дата 12.5.2009, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



структуры тут вообще за уши притянуты. задача вообще к структурам никакого отношения не имеет...
PM   Вверх
artsb
Дата 12.5.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(bsa @  12.5.2009,  21:20 Найти цитируемый пост)
структуры тут вообще за уши притянуты. задача вообще к структурам никакого отношения не имеет... 

Человек решил разобраться со структурами сразу на сложном примере smile


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Garcian
Дата 12.5.2009, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



 smile слушайте, задачи не я составляю))

Обязательно использовать структуры и разбивать программу на фунцкии (потом из этих функций и структур надо еще проект составить  smile ).


artsb, со структурами я впервые познакомился тут http://forum.vingrad.ru/forum/topic-255282/unread-1.html

По задаче, исправил ф-цию мэйн:

Код

int main () 
{
    Text t;
    fstream fin;
    fin.open("C:\\Users\\5\\L3_in.txt", ios::in);
    fin.unsetf (ios::skipws);
    ReadText (&t, &fin);
    cout << "Ishodniy text: " << endl << endl;
    OutText (&t);
    cout << endl << endl << "result: " << endl << endl;
    Alchemist (&t);
    OutText(&t);
    getch();
    fin.close();
}  


по Alchemist:

Код

int Alchemist (Text *t)  
{
    int  a = 0, g = 0, k = 0;
    for (int i = 0; i < t -> Size; i++) { 
        for (int j = 0; j < t -> T[i].Lenght; j++) {
            if (t -> T[i].T[j] == ' ') { 
                a = j; 
                if (t -> T[i].T[a] == t -> T[i].T[a+1]) 
                    { 
                        for (k = a + 1; ((t -> T[i].T[k] == ' ') && (k < t -> T[i].Lenght)); k++) { 
                            t -> T[i].Lenght = k;// новое
                           /* for (g = k; g < t -> T[n].Lenght ; g ++)  
                            {
                                 t -> T[i].T[g] = t -> T[i].T[g+1]; //новое
                                 t -> T[i].T[g--]; // новое
                            } // по сути цикл не работает */                     
                        }
                     }
              }    
        }    
   }
} 


замучался... добился того, что программа нормально воспринимает файл без пробелов и с одним разделителем между словами. Если же разделителей больше двух - строка стирается до конца  smile 
Код

for (k = a + 1; ((t -> T[i].T[k] == ' ') && (k < t -> T[i].Lenght)); k++) { 
                            t -> T[i].Lenght = k;

после этого внутренний цикл не играет роли
 Не знаю, где я потерял логическую цепь. Уповаю на вашу поддержку  smile 

Это сообщение отредактировал(а) Garcian - 12.5.2009, 22:38
--------------------
Неродивый студент
PM MAIL   Вверх
artsb
Дата 12.5.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

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



Цитата(Garcian @  12.5.2009,  22:28 Найти цитируемый пост)
Не знаю, где я потерял логическую цепь. Уповаю на вашу поддержку

Мне будет проще написать сначала. Потом выложу то, что получится  smile 


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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