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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что за баг? 
:(
    Опции темы
Guest
  Дата 22.12.2005, 23:08 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Что происходит с if1 и for1, проверяю их в конце и оказывается они какие-то другие.

Код

   #include <stdio.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>
int retro;
int i,s,f,w,d;
char z[80];

char if1[8],switch1[8],for1[8],while1[8],do1[8];




int re(char b[8],char a[80])
           {int r=0,m=0;
            for(int i=0;r==1;i++)
            {if((a[i]=='/')&&(a[i+1]=='/')){retro++;r=1;m=0;}
             if(b[m]=='*')r=1;
             if((b[m]!=a[i])&&(b[m]!='*'))m=0;
             if((a[i]==b[m])&&(r==0))m++;
             if(i==78)r=1;
              }
            return m;
}

void progon(char a[80])
           {if(re(if1,a)!=0)i++;
            if(re(switch1,a)!=0)s++;
            if(re(for1,a)!=0)f++;
            if(re(while1,a)!=0)w++;
            if(re(do1,a)!=0)d++;
}


void print()
           {cout<<" In file:"<<endl;
            cout<<i<<" if"<<endl;
            cout<<s<<" switch"<<endl;
            cout<<f<<" for"<<endl;
            cout<<w<<" while"<<endl;
            cout<<d<<" do"<<endl;
            cout<<retro<<" comments"<<endl;
}

int main(int argc, char *argv[])
{

  strcpy(if1,     "if*     ");
  strcpy(for1,    "for*    ");
  strcpy(switch1, "switch* ");
  strcpy(while1,  "while*  ");
  strcpy(do1,     "do*     ");



  FILE *f;
  f=fopen("zoo.txt","r");

  while(! feof(f))
       {fgets(z,80,f);

        progon(z);
        }
  print();
     cout<<if1<<endl;
     cout<<for1<<endl;
     cout<<switch1<<endl;
  cout<<"for exit print q";
  char x;
  while(x!='q')cin>>x;

  return 0;
}


  Вверх
Fedor
Дата 23.12.2005, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


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

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



Цитата(Guest @ 22.12.2005, 23:08)
проверяю их в конце и оказывается они какие-то другие.

какие другие? покажи результат.


Попробуй во всех функциях, где значения не должны меняться, поставить const перед типом параметра. Например:

Код

int re(const char b[8], const char a[80])

так избежишь нежелательных ошибок


З.Ы. А вообще, стиль написания кода оставляет желать лучшего...


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
BreakPointMAN
Дата 23.12.2005, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

  strcpy(if1,     "if*     ");
  strcpy(for1,    "for*    ");
  strcpy(switch1, "switch* ");
  strcpy(while1,  "while*  ");
  strcpy(do1,     "do*     ");

Ты случайно про нуль-символ '\0' не забыл? Строковые константы "if* ", "for* " и т.д., которые ты пытаешься запихнуть в if1, for1 и т.д. занимают только печатных символов 8, а где же место под признак окончания строки???
Код

char if1[8],switch1[8],for1[8],while1[8],do1[8];

Попробуй везде на 9 поменять, перекомпилить и запустить программку еще раз...

Это сообщение отредактировал(а) BreakPointMAN - 23.12.2005, 00:14


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
Guest
Дата 23.12.2005, 11:56 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Цитата(Fedor @ 23.12.2005, 00:07)
А вообще, стиль написания кода оставляет желать лучшего...

А поконкретней можно? Разумная критика мне тоже нужна.
  Вверх
Neitron
Дата 23.12.2005, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да отступы тупые...


--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
Fedor
Дата 23.12.2005, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Днепрянин
****


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

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



Цитата(Guest @ 23.12.2005, 11:56)
А поконкретней можно? Разумная критика мне тоже нужна.

С удовольствием:
1) во-первых, действительно, так как ты пишешь отступы, никто не пишет - должны быть четко видны уровни. А у тебя например, в функции print оступы 12 символов, а в main - 2, хотя уровень один и тот-же.
2) открывающая скобка желательно должна быть под открывающей.
3) в строке с открывающей скобкой не желательно иметь кода. Плохой пример - цикл в функции re. Визуально сложно на первый взгляд увидеть границы блока цикла.
4) все, что можно сделать константой, нужно сделать константой. Чтоб избежать случайных ошибок. Пример - параметры в ф-ции re нужно сделать константой.
5)
Код

if(re(do1,a)!=0)d++;

подобный стиль не очень хороший. Нагляднее писать так:
Код

if ( re(do1, a) != 0 )
{
   d++;
}


6) переменные, функции и т.п. нужно называть так, чтоб уже само имя максимально описывало то, что хранится в этой переменной.


Это я написал, что ЛИЧНО МНЕ не понравилось в твоем коде. Тут конечно, tastes differ, т.е. другим может не понравится мой стиль. Но в любом случае в первую очередь должна иметь место быть наглядность кода, т.е. другие (и не только другие, а и ты через 10 лет) должны посмотреть на код и сразу понять, что делает та или иная функция.


--------------------
Мы - Днепряне. Мы всех сильней.
PM ICQ   Вверх
JoyEx
Дата 23.12.2005, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дядя
**


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

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



Цитата(Fedor @ 23.12.2005, 16:43)
Но в любом случае в первую очередь должна иметь место быть наглядность кода, т.е. другие (и не только другие, а и ты через 10 лет) должны посмотреть на код и сразу понять, что делает та или иная функция


Я не smile согласен.
Перед увольнением, в последний день, так как автор темы делает можно делать.


--------------------
Если ты уже никого не боишься, значит ты самый страшный 
PM IM ICQ AOL YIM MSN   Вверх
Neitron
Дата 23.12.2005, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все таки такой стиль записи много лучше
Код
    
if(re(do1,a)!=0) d++;




--------------------
Хороший программист никогда ничего не делает хорошо с первого раза. Он понимает важность патчей.
Ⓘ ⓁⒾⓀⒺ ⓂⓄⓏⒾⓁⓁⒶ
PM MAIL   Вверх
blackofe
Дата 23.12.2005, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Fedor @ 23.12.2005, 16:43)
Но в любом случае в первую очередь должна иметь место быть наглядность кода, т.е. другие (и не только другие, а и ты через 10 лет) должны посмотреть на код и сразу понять, что делает та или иная функция.

насчет стиля я бы поспорил или, вернее, порассуждал. к примеру, для меня важно, чтобы я мог одним взглядом охватить как можно больше кода. поэтому лишние открывающие скобки меня раздражают. к примеру, такому коду, занимающему 4 строчки

Код

if ( re(do1, a) != 0 )
{
   d++;
}


я предпочту код, занимающий 3 строчки:

Код

if(re(do1, a)) {
   d++;
}


или даже 2:

Код

if(re(do1, a))
   d++;


с другой стороны это не должно превращаться в самоцель в ущерб читабельности. и вот это

Код

if(re(do1, a) != 0) d++;


компактно, но нечитабельно. можно пропустить тело условного оператора. даже если тело, скажем, цикла состоит из точки с запятой, я его выношу в отдельную строку:

Код

for(a = n; a < m; ++a)
   ;


опять же не люблю лишних пробелов (вероятно из моего полиграфического прошлого smile) - к примеру, после открывающей круглой или квадратной скобок и перед закрывающими. с другой стороны пробел обязателен после запятой или после точки с запятой. указатели объявляю, как сто лет назад увидел у кернигана/ричи, т.е. вот так

Код

char *s;


а не так

Код

char* s;


хотя понимаю, что логичнее второй вариант, ибо точнее отражает суть объявления: "s имеет тип 'указатель на char'". но это уже из области привычек.

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

но это все мура. и предпочтения могут быть у разных программеров разные. и как писать программы - их личное дело. с одним соглашусь на 100%: если уж пишешь сюда - на форум - в надежде на то, что в твоем коде кто-то разберется, проанализирует и ответит, то в первую очередь должна иметь место быть наглядность кода, т.е. другие (и не только другие, а и ты через 10 лет) должны посмотреть на код и сразу понять, что делает та или иная функция. (с) smile
Добавлено @ 18:55
Цитата(Fedor @ 23.12.2005, 16:43)
4) все, что можно сделать константой, нужно сделать константой. Чтоб избежать случайных ошибок. Пример - параметры в ф-ции re нужно сделать константой.

за это обеими руками и ногами. smile сам сую константы везде, где только можно.

Это сообщение отредактировал(а) blackofe - 23.12.2005, 18:53
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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