Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Неправильно считает количество строк (больше на 1)


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

А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);          
                };
};



Автор: Fazil6 29.12.2008, 13:11
Код

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

Автор: Gunslinger 29.12.2008, 13:17
Fazil6, тогда: кол-во строк=14, а вто последний адрес не меняется - А26.

Автор: mes 29.12.2008, 13:37
Цитата(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...

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


Автор: Gunslinger 29.12.2008, 15:02
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);  
 };

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

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

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

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

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

Автор: mes 31.12.2008, 12:54
Цитата(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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)