人体生物钟程序设计(C语言)

前几年在本站发布过博文介绍人体生物钟程序的制作方法。后来发现上传后显示的博文有错漏,计算符号脱漏。这会误导读者。今修订整理重新发布,展示一下漂亮的界面设计。

人体生物钟也就是人体生物节律。人体生物节律是自然进化赋予生命的基本特征之一,人类和一切生物都要受到生物节律的控制与影响。人体生物节律是指体力节律、情绪节律和智力节律。每个人从他出生那天起一直到生命终结,都存在着体力23天、情绪28天、智力33天的周期性波动规律,称为人体生物节律。每一个周期中又存在着高潮期、低潮期和临界期。由于它具有准确的时间性,因此也称之为人体生物钟。在我们日常生活中,有人会觉得自己的体力、情绪或智力有时很好,有时很坏。人从他诞生之日起,直至生命终结,其自身的体力、情绪和智力都存在着由强至弱、由弱至强的周期性起伏变化。人们把这种现象称作生物节律,或生物节奏、生命节律等。之所以产生这种现象的原因是生物体内存在着生物钟,它自动地调节和控制着人体的行为和活动。

人体生物节律有什么作用,网上有许多介绍,对于想编程的朋友都是了解的,这里就不赘言什么了。本文就谈如何制作。就二个要点:一是输入当前日期和出生日期,此程序使用myspringc编译器自带的安卓式样日期输入控件。其他语言日期输入都很简单。二是根据这二个日期计算总天数,依数值绘出曲线。难点是曲线的绘制。本程序给出了曲线算法和绘图方法,以及绘制漂亮的界面。程序使用最基本的绘图函数DrawLine,DrawRect,DrawCircle,设置颜色SetColor(a,r,g,b)。程序有详细注释介绍绘制方法。

本程序是用简单的C语言编译调试的。主要展示该语言超强的绘图功能。如何绘制图形曲线,绘制漂亮的界面。本人喜欢用编程语言的绘图功能绘制图形图案和漂亮的界面,能发挥你的想象力和创造力,很有趣,希望大家也喜欢。

下面的代码是用简单的C语言写的,很简洁 ,适用于初学者。

//  myspringc  v2.7  可编译安卓手机本机 app 应用
//  此样例可复制黏贴到 myspringc  编译
//  亦可用vb6, VC , Java 等改写

人体生物钟程序设计(C语言)_第1张图片

 

人体生物钟程序设计(C语言)_第2张图片 

人体生物钟程序设计(C语言)_第3张图片 

//*******    人体生物钟    ***************
//== 人体生物节律曲线 ==  Biorhythm  
//制作人:张纯叔    [email protected]
//****  myspringc  v2.7   编译  *********
Canvas cs;      //画布
float pi=3.1415926535;
float src[4];  //ClearDraw (cls) clear screen
int s1,s2,s3;      
int s1n,s2n,s3n;
int i,k,bx;    //bx 画标尺
int alln0,alln1;     //计算日期
int alln;   //set today-birthdate all days
int ns;     //draw
float a;
float dx,dy, x0,y0;
float x1,y1;
string s,ss,ss1,ss2,ss3,ss4,ss5,ss6;  //输出字串
string gs1,gs2,gs3,gs4,gs5,gs6;
int by,bm,bd;  //birthdate yy,mm,dd
int ty,tm,td;      //today
double bms,tms;
int d[3];          //input date
int count;
int context;    //canvasProc触屏按钮
int obj;
int id;
int event;

main(){
setDisplay(1);
cs.Active();
    cs.SetBackground(255,255,255);
    setTitle("人体生物钟 ( Biorhythm )");
    cs.SetProc (context, mycanvasProc);
    drawtable ();
 while (){}
 }//main()

mycanvasProc (int context,int obj,int id,int event,float x,float y){
      cs.SetFillMode(0);//0不填色,1填色
  //** 触控按钮 select button : input date  ****
    if (x>400&&x<560&&y>810&&y<880) {
           input_date ();   }      //输入日期
    if (x>300&&x<420&&y>980&&y<1050){
           input_date ();   }      //输入日期       
    if (x>440&&x<560&&y>980&&y<1050) {
           input_date ();   }      //重新开始
    if (x>580&&x<700&&y>980&&y<1050){
          clearOutput();    
          cs.ClearDraw (0,src);
          setDisplay (0);
          exit (0);    } //Exit 退出程序
}//mycanvasProc ()

drawbutton (){   //绘制按钮
        cs.SetColor (255,230,230,230);
      cs.DrawRect (4,940,715,1078);
        cs.SetColor (255,255,255,255);
      cs.DrawRect (11,960,707,963);
      cs.DrawRect (11,1065,707,1068);

    for (i=0;i<3;i++){   //draw 3-5 cmd_button
          cs.SetColor (255,150,150,150);
        cs.DrawRect (i*140+299,980,i*140+423,1052); 
          cs.SetColor (255,250,250,250);
        cs.DrawRect (i*140+297,978,i*140+420,1050); 
          cs.SetColor (255,200,240,250);
        cs.DrawRect (i*140+300,980,i*140+420,1050); 
                    }
  cs.SetTextSize (24);
  cs.SetTextStyle(1);
  cs.SetColor(255,50,150,220);
  cs.DrawText ("输入日期",313,1020);
  cs.DrawText ("重新开始",453,1020);
  cs.DrawText ("退出程序",595,1020);
       s="BIORHYTHM";     //立体字
  cs.SetTextSize (40);
  cs.SetTextStyle(1);
  cs.SetColor (255,100,100,100);
       cs.DrawText (s,20,1030);
  cs.SetColor (255,255,255,255);
       cs.DrawText (s,23,1033);

//draw Input button ****
      cs.SetColor (255,250,0,150);
  cs.DrawRect (399,819,561,881);
     cs.SetColor (255,120,150,250);
  cs.DrawRect (400,820,560,880);
  cs.SetTextSize (24);
  cs.SetTextStyle(0);
    cs.SetColor(255,250,250,0);
 cs.DrawText ("输入日期",435,855);
 cs.SetColor (255,250,0,150);
    s="请输入当前日期和出生日期 >>  ";
    cs.DrawText (s,80,860);
    cs.Update ();
}//drawbutton ()

input_date (){     //输入日期
//here get birth date & current date then show out
inputdd:
   getDate(d);
   pickDate("输入>    当前日期",d);
  ty=d[0];
  tm=d[1];
  td=d[2];
   //print "currentday = ",ty ,"-",tm,"-",td;
   pickDate("输入>    出生日期",d);
  by=d[0];
  bm=d[1];
  bd=d[2]; 
    //print "birthdate = ",by ,"-",bm,"-",bd;
clearOutput ();              //clear output text
cs.ClearDraw (0,src);  //clear screen

// calculate (alln)= all days from birthdate to today
gs1=intToString (by);
gs2=intToString (bm);
gs3=intToString (bd);
gs4=intToString (ty);
gs5=intToString (tm);
gs6=intToString (td);
  if (by>ty){
      ss="输入错误 !  重新输入当前日期,出生日期。";
      msgBox ("人体生物节律 " ,ss);
         goto inputdd;    }
  if (bm<10)gs2="0"+gs2;
  if (bd<10)gs3="0"+gs3;
  if (tm<10)gs5="0"+gs5;
  if (td<10)gs6="0"+gs6;
  print " Input  birthdate = ",gs1," - ",gs2," - ",gs3;
  print " Input  this Date = ",gs4," - ",gs5," - ",gs6;

//getDate and calculate past days alln ****
string yds;    
string ydds;
double tms;
yds="000031059090120151181212243273304334";
//计算生日 alln0
  ydds=subString(yds,(bm-1)*3,3);
  bms=stringToDouble(ydds);
  alln0=(by-1900)*365+((by-1900-1)/4)
              +(int)(bms)+bd;
  if ((by-by/4*4)==0&&bm>2)alln0=alln0+1;  //加闰
      // print "birth = ",alln0;  //test
//计算当前日 alln1
  ydds=subString(yds,(tm-1)*3,3);
  tms=stringToDouble(ydds);
  alln1=(ty-1900)*365+((ty-1900-1)/4)
             +(int)(tms)+td+1;    //*****
  if ((ty-ty/4*4)==0&&tm>2)alln1=alln1+1;  //加闰
      // print "current = ",alln1;   //test
      alln=alln1-alln0;    
      // print "all days = ",alln;   //test
  if (alln<1){    //容错
      ss="输入错误 !  重新输入当前日期,出生日期。";
      msgBox ("人体生物钟 " ,ss);
         goto inputdd;    }
    drawtable ();   //show...绘出曲线
 }//input_date ()

绘制曲线:初始图表样例

人体生物钟程序设计(C语言)_第4张图片

 

drawtable(){//draw table and show
   cs.ClearDraw(0,src);    //清屏重绘
//get birthdate yymmdd and current yymm ***
//calculate s1,s2,s3 and draw curve **********
//drawout and show biorhythm         **********
  cs.SetFillMode(1);//0不填色,1填色
    cs.SetColor(255,240,240,240);
    cs.DrawRect(10,10,710,600);
// draw table ===============
  cs.SetStrokeWidth(1);//画笔线宽
  cs.SetFillMode(1);//0不填色,1填色
  cs.SetTextSize(60);
  cs.SetTextStyle(1);     //粗体
 s="人体生物节律曲线";
    cs.SetColor(255,120,60,0);
       cs.DrawText(s,53,104);
    cs.SetColor(255,0,250,0);
       cs.DrawText(s,50,100);
    cs.SetFillMode(0);//0不填色,1填色
    cs.SetColor(255,250,150,0);
       cs.DrawText(s,50,100);

  cs.SetTextStyle(0);     
  cs.SetStrokeWidth (1);
  cs.SetTextSize (28);
  cs.SetColor(250,250,0,0);
ss="高潮区";
cs.DrawText (ss,560,210);
ss="临界区 ";
cs.DrawText (ss,560,270);
ss="低潮区 ";
cs.DrawText (ss,560,410);
  cs.SetFillMode(1);//0不填色,1填色
cs.SetColor(250,250,0,0);
ss="体力  >";
cs.DrawText (ss,200,510);
  cs.SetColor(180,0,90,0);
ss="情绪  >";
cs.DrawText (ss,200,540);
  cs.SetColor(180,0,0,180);
ss="智力  >";
cs.DrawText (ss,200,570);

//draw table========
 cs.SetFillMode (1);
cs.SetStrokeWidth(2);
 cs.SetColor(100,250,250,0); //high low 区块
cs.DrawRect(50,150,670,450);
cs.SetColor (100,255,120,255);
cs.DrawRect (50,150,670,235); 
cs.SetColor(100,130,255,255);
cs.DrawRect(50,365,670,450);
cs.SetColor (255,0,120,128);        //X Line标尺
 cs.DrawRect(20,296,710,304);  
cs.SetColor(180,250,0,0);
cs.DrawRect (50,500,180,506);  //s1
cs.SetColor(180,0,200,0);
cs.DrawRect (50,530,180,536);  //s2
cs.SetColor(180,0,0,192);
cs.DrawRect (50,560,180,566);  //s3

cs.SetColor (255,0,0,0);
cs.SetTextSize (20);
cs.DrawText("0",44,340);
cs.DrawText("5",143,340);
cs.DrawText("10",238,340);
cs.DrawText("15",338,340);
cs.DrawText("20",438,340);
cs.DrawText("25",538,340);
cs.DrawText("30",638,340);

cs.SetFillMode (0);
cs.SetColor (255,250,250,0);
cs.DrawRect(23,300,715,300);//X Line  标尺
 cs.SetColor (255,0,0,128);
 for (i=0;i<34;i++){   //画标尺点位
    bx=50+i*20;
    cs.DrawLine (bx,280,bx,320);      }
    cs.SetColor (255,255,0,0);
  for (i=0;i<7;i++){    //画标尺 5 天标线
     bx=50+i*100;
     cs.DrawCircle (bx,300,2);
     cs.DrawLine (bx,150,bx,320);
     cs.DrawLine (bx,350,bx,450);      }

//绘制人体生物节律曲线
// Physical Sensitive  Intellectual
//draw curve : x1 +50 标尺x轴 0 位,  s1*20 步长
//x0 曲线幅宽,  + -130 y轴峰谷弧高,  y+300 x轴y定位
//x0 : >  230 = 23d, 280 = 28d, 330 = 33d
//Draw out graph here ===========
//get birthdate & calculate thisday-birthdate
   cs.SetStrokeWidth(2);
       ns=td-alln;     //这算法很奇特,研究一下
//s1=23d,  draw graph  体力
   s1=ns-ns/23*23;    //mod (ns,23)
  cs.SetColor (255,255,0,0);
  for (i=-140;i<280;i++){
         a=pi/360*i*6;    //360 曲线点密度
         x0=230;   
         x1=(float)((x0/pi*a+50)+s1*20);
         y1=(float)(-130*sin(a)+300);
         cs.DrawCircle(x1,y1,3);   }
print " s1= ",s1;

//s2=28d,  draw graph  情绪
   s2=ns-ns/28*28;      //mod(ns,28)
   cs.SetColor (255,0,220,0);
  for (i=-140;i<280;i++){
         a=pi/390*i*6;   //390 曲线点密度
         x0=280;
         x1=(float)((x0/pi*a+50)+s2*20);
         y1=(float)(-130*sin(a)+300);
         cs.DrawCircle(x1,y1,3);   }
print " s2= ",s2;

//s3=33d,  draw graph  智力 
  s3=ns-ns/33*33;         //mod (ns,33)
  cs.SetColor (205,0,0,192);
  for (i=-140;i<280;i++){
         a=pi/420*i*6;  //420 曲线点密度
         x0=330;
         x1=(float)((x0/pi*a+50)+s3*20);
         y1=(float)(-130*sin(a)+300);
         cs.DrawCircle(x1,y1,3);        }  
Print " s3= ",s3;

    cs.SetStrokeWidth(0);   //绘出当日标尺
    cs.SetColor (255,60,60,60);
    x1=(float)(td*20+47);  //draw current day当日标
    cs.DrawRect (x1,146,x1+5,454);

     cs.SetFillMode (1);    //曲线两边遮罩
     cs.SetStrokeWidth(2);
     cs.SetColor (255,255,255,255);
     cs.DrawRect (0,150,11,450);
     cs.DrawRect (709,150,720,450);
     cs.SetColor (255,164,164,164);
     cs.DrawRect (710,15,717,606);
     cs.DrawRect (15,600,716,606);
     cs.SetFillMode (0);
     cs.SetColor(255,50,0,128);
     cs.DrawRect(10,10,710,600);
//== draw data ======
cs.SetTextSize (32);
     cs.SetFillMode (1);
cs.SetStrokeWidth(2);
cs.SetColor (255,0,0,200);
if (len(gs2)==1)gs2="0"+gs2;
if (len(gs3)==1)gs3="0"+gs3;
if (len(gs5)==1)gs5="0"+gs5;
if (len(gs6)==1)gs6="0"+gs6;
ss1="出生日期 :  "+gs1+" 年 "+gs2+" 月 "+gs3+" 日 ";
cs.DrawText(ss1,30,680);
ss2="当前日期 :  "+gs4+" 年 "+gs5+" 月 "+gs6+" 日 ";
cs.DrawText (ss2,30,730);
  s=intToString (alln);
//print " all days = ",alln;  //test
ss3="你已在这美好的世界上生活了"+s+"天。";
  if (alln<1)ss3="Welcome to using our program .  ";
  cs.DrawText(ss3,30,780);
  ss="制作人: 张纯叔 ( [email protected] )  ";
     cs.SetColor (255,150,180,250);
     cs.DrawRect (5,1078,715,1080);
   cs.DrawText (ss,20,1110);


//draw status 状态 ***********
    cs.SetFillMode(1);//0不填色,1填色
//**** s1n  s 23
         s1n=alln-alln/23*23 ;
          cs.SetColor (255,250,220,0) ; //临界
          cs.DrawRect (300,490,400,510);   
    if (s1n>2&&s1n<10){    //高   3 - 9
          cs.SetColor(255,250,120,180); 
          cs.DrawRect (300,490,400,510);       }
   if (s1n>13&&s1n<22){     //低 14~21
          cs.SetColor (255,130,250,150) ;
          cs.DrawRect (300,490,400,510);       }
 //**** s2n  s 28
         s2n=alln-alln/28*28 ;
          cs.SetColor (255,250,220,0) ; //临界
          cs.DrawRect (300,520,400,540);  
    if (s2n>2&&s2n<12){    //高   3 - 11
          cs.SetColor(255,250,120,180); 
          cs.DrawRect (300,520,400,540);       }
   if (s2n>16&&s2n<26){     //低 17 - 25
          cs.SetColor (255,130,250,150) ;
          cs.DrawRect (300,520,400,540);       }
 //**** s3n  s 33
          s3n=alln-alln/33*33 ;
          cs.SetColor (255,250,220,0) ; //临界
          cs.DrawRect (300,550,400,570);  
    if (s3n>2&&s3n<14){    //高   3 - 13
          cs.SetColor(255,250,120,180); 
          cs.DrawRect (300,550,400,570);       }
   if (s3n>19&&s3n<31){     //低 20 - 30
          cs.SetColor (255,130,250,150) ;
          cs.DrawRect (300,550,400,570);       }
  drawbutton ();     //绘制按钮
  cs.Update();        //show out  table 
 }//drawtable ()


//**** End ******

你可能感兴趣的:(经验分享,青少年编程,c语言)