Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа, которая вычисляет дату рождения по коду, Зацените, плз. Можете юзать исходники :) 
V
    Опции темы
medicdim
  Дата 11.6.2007, 17:13 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот сам код (правда я поленился повставлять комменты):

Код

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;
AnsiString str, tmp="12345";
long num=0;
int f=0;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
str=Edit1->Text;
if (str!="")
        {
        for (int i=1; i<=5; i++)
                {
                tmp[i]=str[i];
                }
        try
                {
                num=StrToFloat(tmp);
                Label1->Caption="Äàòà ðîæäåíèÿ: "+DateToStr(1/01/1900+TDateTime(StrToInt(tmp))+1);
                f=StrToFloat(str[9]);
                if (!(f&1)) Label3->Caption=" Ïîë æåíñêèé";
                else Label3->Caption=" Ïîë ìóæñêîé";
                }
        catch(...)
                {
                Application->MessageBox("Ââåäèòå òîëüêî öèôðû","Îøèáêà",NULL);
                Label1->Caption="";
                Edit1->Text="";
                }
        }

}


На форму нужно кинуть следуюшие контролы:
Edit1, Button1, Label1, Label3;

Мне важно знать ваше мнение.

Добавлено через 36 секунд
Киррилицу почемуто не понимает... :(

Добавлено через 7 минут и 25 секунд
Привожу куски кода, в которых слдержится кириллица:
Код

Label1->Caption="Дата рождения: "+DateToStr(1/01/1900+TDateTime(StrToInt(tmp))+1);

if (!(f&1)) Label3->Caption=" Пол женский";

else Label3->Caption=" Пол мужской";

Application->MessageBox("Введите только цифры","Ошибка",NULL);

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


Эксперт
***


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

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



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

Добавлено через 21 секунду
хотя в принципе, все это обсуждали...


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
medicdim
Дата 12.6.2007, 08:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дело в том, что проблемы-то нету smile... 
Я просто выложил код для того чтобы его оценили проффесионалы (стиль, методы и т.д.). 
А с кодировкой проблема когда я в форум вставил кириллицу копи-пастом.
PM MAIL   Вверх
Fin
Дата 12.6.2007, 14:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


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

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



medicdim, Для Борландовских продуктов не знаю, но для Visual Studio спасает русскую кодировку, если предварительно переключить клавиатуру в русскую кодировку. А затем уже копировать код на форум.

Это сообщение отредактировал(а) Fin - 12.6.2007, 14:51


--------------------
Пролетал мимо.
PM MAIL   Вверх
Klin
Дата 12.6.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Хорошо, оценим. Для начала, просмотрим ваш код с точки зрения правильности операций...
    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
    AnsiString str, tmp="12345";
  •  Одна из переменных не инициализирована, на протяжении длительного времени не понятно, что там за значение – инициализируйте свои переменные сразу. Ну а использовать только цифры в AnsiString не слишком продуманный ход, но все зависит от задачи. Дальше.
    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
    long num=0;int f=0;
  •  Использование long можно заменить int, но об этом позже
    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
    str=Edit1->Text;
  •  ИМХО объявлять переменную ради этого не стоило, даже если писать много:
    Код

     Memo1->Lines->Strings[Edit1->Text.ToInt()];

     Лучше использовать указатель: 
    Код

     AnsiString &str = Edit1->Text;

    Хотя в данном случае, можно обойтись и без него.
    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
    if (str!="")
  •  Люблю людей, которые мыслят не стандартно smile Не легче без накрутки:
    Код

     if (str) . . . . . .


    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
            for (int i=1; i<=5; i++)                {                tmp[i]=str[i];                }
  •  После этого захотелось перекреститься  smile Ты объявлял переменную типа AnsiString и набил ее от балды (по другому это назвать нельзя) только для этого?  "Не только..." - скажешь ты:
    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
    Label1->Caption="Äàòà ðîæäåíèÿ: "+DateToStr(1/01/1900+TDateTime(StrToInt(tmp))+1);

     "Зачем?" - спрошу я. Есть функции которые позволяют не забивать программу бессмыслеными переменными. Здесь поможет функция SubString:
    Код

     Edit1->Text.SubString(1,5);


    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
            try                {                num=StrToFloat(tmp);
  •  Об необходимости использования try потом, а сейчас об num. А был ли мальчик? Зачем он в коде я не понимаю, наверно красивый интерпретатор smile

    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
    if (!(f&1)) Label3->Caption=" Ïîë æåíñêèé";
  •  Этот момент мне тоже не нравиться. Еще одна переменная, еще одна функция...
Теперь в общем о коде...
  •  Если введено меньше 9 чисел происходит незарегистрированная ошибка - не продумано
  •  Еще если меньше 9 чисел, то определяет цифры как символы
  •  try и catch в данном случае можно (а имхо и лучше) не использовать, а написать обход вручную
  •  Еще раз могу подчеркнуть использование переменной tmp - этот момент меня действительно выбил
  •  Если вы используете переменные к примеру только в действии кнопки, то и объявлять стоит их в этом действии
Пару советов на будущее:
    Цитата(medicdim @  11.6.2007,  18:13 Найти цитируемый пост)
     (правда я поленился повставлять комменты):
  •  Сразу минус: всегда расставляйте комментарии в вашем коде, если хотите чтобы его хотя бы читали. Да и тебе будет легче
  •  Если в каждой подгруппе использовать TAB, то код у вас может растянуться, измените расстояние  tab на 2-3.
Твой код может выглядеть как-то так:
Код

const AnsiString &str=Edit1->Text; // указатель на текст из Edit1 (если писать лень ;)
if (str.ToIntDef(0)) // функция превращает текст в 0, а условие работает, если не равно NULL (0) 
 if (str.Length() == 9) { // если чисел равно 9
   Label1->Caption="Дата рождения: "+DateToStr(1/01/1900+TDateTime(StrToInt(Edit1->Text.SubString(1,5)))+1);
   if (str[9]!='1') Label2->Caption=" Пол женский"; // если девятый символ не "1"
   else Label2->Caption=" Пол мужской";
  }
 else Application->MessageBox("Цифр слишком мало, введите минимум 9 цифр","Ошибка",0); // вывод сообщения "ошибка"
else {
  Application->MessageBox("Введите только цифры!","Страшнейшая ошибка",0); // вывод сообщения "грубая ошибка"
  Label1->Caption="";
  Label2->Caption="";
  Edit1->Text="";
  // очищаем всё
 }


Но и тут необходимо продумать некоторые моменты:
  •  Если будет цифр больше, чем предусмотрено integer, то цифры объявит символами
  •  А будет ли всегда 9 цифр?
  •  Не лучше в строке 5 (мой код) убрать из условия "НЕ"
Точно сказать, что лучше трудно, т.к. увы не известна задача. И помни - главное усердие и все получиться. Удачи.


Это сообщение отредактировал(а) Klin - 12.6.2007, 15:32


--------------------
Я человек - попробуйте обвинить меня за это.
PM MAIL   Вверх
medicdim
Дата 14.6.2007, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за критику. В дальнейшем буду пытаться придерживаться советов  smile

Добавлено через 3 минуты и 27 секунд
Кстати не рассказал что вообще программка делает:
Она вычисляет дату рождения человека и его пол по идентификационному коду.

А вот сдесь расписан алгоритм:
http://developerguru.net/archive/2007/03/2...-usability.aspx
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

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

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

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

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


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

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


 




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


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

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