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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Неправильно считает количество строк (больше на 1), как подправить цикл? 
V
    Опции темы
Gunslinger
Дата 29.12.2008, 13:07 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Привет! Проблема такая. Есть табличка эксел, нужно подсчитать количество строк. Подсчет виду по одному полю:
Код

А10 наименование
А11       1// номер столбца
А12   текст
А13   текст
А14   текст
....
А25    текст //14 строк

В результате вместо: количество строк= 14, последний адрес=А25 выдает: кол-во строк=15, последн. адрес=А26.
Основной код:
Код

Сells d; ToExcel Exl; ToTable T;
d.SetA("A11");
T.ChkCountRaws(d,Exl);
Edit1->Text=d.ReturnAddress();
Edit1->Text=T.ReturnCountRaws();//возвращает количество строк

Проблемный метод:
Код

void ChkCountRaws(Cells& c,ToExcel& Ex){
                 CountRaws=1;//в привате
                 c=SetNextAddr(c); //---------здесь положили А12; всегда прибавляет к номеру строки 1,= перегружен
                              while(c.is_String()){                        // bool is_String(){if(sValue=="") return false; else return true;}
                               c=Ex.ExtractValue(c);
                           c.Convert_to_str();
                                           if(c.is_String()==false) {break;}; 
                           CountRaws++;
                        c=SetNextAddr(c);          
                };
};



PM MAIL   Вверх
Fazil6
Дата 29.12.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

CountRaws=0;//в привате

PM MAIL   Вверх
Gunslinger
Дата 29.12.2008, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Fazil6, тогда: кол-во строк=14, а вто последний адрес не меняется - А26.
PM MAIL   Вверх
mes
Дата 29.12.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Gunslinger @  29.12.2008,  13:17 Найти цитируемый пост)
тогда: кол-во строк=14, а вто последний адрес не меняется - А26. 

Цитата(Gunslinger @  29.12.2008,  13:07 Найти цитируемый пост)
//---------здесь положили А12;


А12+14 строк = А26 ! // правильно

Ваш цикл останавливается на пустой строке 

Цитата(Gunslinger @  29.12.2008,  13:07 Найти цитируемый пост)
А10 наименование
А11       1// номер столбца
А12   текст
А13   текст
А14   текст
....
А25    текст //14 строк

А26 - пустая ! // и тут правильно

Если хотите останавливаться на предпоследней строке, то
1. либо сохраняйте предыдущий адрес
2. либо заведите дополнительную переменную-клетку, которая будет тестировать на пустоту строки
3. либо добавьте метод SetPrevAddr
4...

Перед тем как писать код, старайтесь в голове сформулировать чего Вы хотите получить в итоге, тогда и подобных казусов не будет..



Это сообщение отредактировал(а) mes - 29.12.2008, 13:38


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 29.12.2008, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



mes, я думал do-while вополнится до встречи с пустой строкой, при этом, если строка окажется пустой, то адрес не увеличится. ошибся. 
Код

void ChkCountRaws(Cells& c,ToExcel& Ex){
         String buff="";
     CountRaws=0;//в привате
     c=SetNextAddr(c); 
          while(c.is_zeroString()!=true){                        // bool is_zeroString(){if(sValue=="") return true; else return false;}
                           c=Ex.ExtractValue(c);
                           c.Convert_to_str();
               if(c.is_zeroString()==true) {
                                      c=buff;
                              break;};
           buff=c.ReturnAddress();
       CountRaws++;
           c=SetNextAddr(c);  
 };

Теперь все корректно выводит.
Спасибо за помощь.

PM MAIL   Вверх
mes
Дата 30.12.2008, 22:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Gunslinger @  29.12.2008,  15:02 Найти цитируемый пост)
Теперь все корректно выводит.

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


--------------------
PM MAIL WWW   Вверх
Gunslinger
Дата 31.12.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 842
Регистрация: 30.12.2006
Где: Астрахань

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



Цитата(mes @  30.12.2008,  22:58 Найти цитируемый пост)
не очень красиво

как и моя жизнь...
С наступающим 2009м!

PM MAIL   Вверх
mes
Дата 31.12.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Gunslinger @  31.12.2008,  12:38 Найти цитируемый пост)
как и моя жизнь...

Вот попытался подправить, если конечно правильно понял, что требуется:
Код

void ChkCountRaws(Cells& c,ToExcel& Ex)
{
     String lastgood = "";
     CountRaws=0;//в привате // приватные члены принято обозначать префиксом, например так  m_CountRaws
  
     for (;!c.is_zeroString();  ++CountRaws;)
     {                   
          lastgood=c.ReturnAddress();
          c=SetNextAddr(c); 

          c=Ex.ExtractValue(c);
          c.Convert_to_str();
    };
     c=lastgood;
}

Цитата(Gunslinger @  31.12.2008,  12:38 Найти цитируемый пост)
С наступающим 2009м!

Взаимно! и всего самого самого!  smile 

Это сообщение отредактировал(а) mes - 31.12.2008, 14:13


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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