當前位置:首頁 » 操作系統 » itoa源碼

itoa源碼

發布時間: 2023-05-30 22:13:11

⑴ 高分徵求有詳細註解的俄羅斯方塊c語言源代碼。

#include <stdio.h>
#include <銀擾dos.h>
#include <conio.h>擾滑
#include <graphics.h>
#include <stdlib.h>

#ifdef __cplusplus
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
#define MINBOXSIZE 15 /* 最小方塊的尺寸 */
#define BGCOLOR 7 /* 背景著色 */
#define GX 200
#define GY 10
#define SJNUM 10000 /* 每當玩家打到一萬分等級加一級*/

/* 按鍵碼*/
#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define VK_DOWN 0x5000
#define VK_UP 0x4800
#define VK_HOME 0x4700
#define VK_END 0x4f00
#define VK_SPACE 0x3920
#define VK_ESC 0x011b
#define VK_ENTER 0x1c0d

/* 定義俄羅斯方塊的方向(我定義他為4種)*/
#define F_DONG 0
#define F_NAN 1
#define F_XI 2
#define F_BEI 3

#define NEXTCOL 20 /* 要出的下一個方塊的縱坐標*/
#define NEXTROW 12 /* 要出的下一個方塊的橫從標*/
#define MAXROW 14 /* 游戲屏幕大小*/
#define MAXCOL 20
#define SCCOL 100 /*游戲屏幕大顯示器上的相對位置*/
#define SCROW 60

int gril[22][16]; /* 游戲屏幕坐標*/
int col=1,row=7; /* 當前方塊的橫縱坐標*/
int boxfx=0,boxgs=0; /* 當前寺塊的形壯和方向*/
int nextboxfx=0,nextboxgs=0,maxcol=22;/*下一個方塊的形壯和方向*/
int minboxcolor=6,nextminboxcolor=6;
int num=0; /*游戲分*/
int dj=0,gamedj[10]={18,16,14,12,10,8,6,4,2,1};/* 游戲等級*/
/* 以下我用了一個3維數組來紀錄方塊的最初形狀和緩搏臘方向*/
int boxstr[7][4][16]={{
{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},
{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0},
{1,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0},
{0,1,0,0,1,1,0,0,1,0,0,0,0,0,0,0}},
{
{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0},
{0,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,1,1,0,0,0,1,0,0,0,0,0,0}},
{
{1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0},
{1,1,1,0,1,0,0,0,0,0,0,0,0,0,0,0},
{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0},
{0,0,1,0,1,1,1,0,0,0,0,0,0,0,0,0}},
{
{1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0},
{1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,0,0,1,1,0,0,0,0,0,0},
{1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0}},
{
{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},
{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0},
{0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0},
{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}},
{
{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},
{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},
{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0},
{1,1,0,0,1,1,0,0,0,0,0,0.0,0,0,0}},
{
{0,0,0,0,1,1,1,0,0,1,0,0,0,0,0,0},
{1,0,0,0,1,1,0,0,1,0,0,0,0,0,0,0},
{0,1,0,0,1,1,1,0,0,0,0,0.0,0,0,0},
{0,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0}}

};

/* 隨機得到當前方塊和下一個方塊的形狀和方向*/
void boxrad(){
minboxcolor=nextminboxcolor;
boxgs=nextboxgs;
boxfx=nextboxfx;
nextminboxcolor=random(14)+1;
if(nextminboxcolor==4||nextminboxcolor==7||nextminboxcolor==8)
nextminboxcolor=9;
nextboxfx=F_DONG;
nextboxgs=random(7);
}
/*初始化圖形模試*/
void init(int gdrive,int gmode){
int errorcode;
initgraph(&gdrive,&gmode,"D:\\tc\\");
errorcode=graphresult();
if(errorcode!=grOk){
printf("error of: %s",grapherrormsg(errorcode));
exit(1);
}
}

/* 在圖形模式下的清屏 */
void cls()
{
setfillstyle(SOLID_FILL,0);
setcolor(0);
bar(0,0,640,480);
}
/*在圖形模式下的高級清屏*/
void clscr(int a,int b,int c,int d,int color){
setfillstyle(SOLID_FILL,color);
setcolor(color);
bar(a,b,c,d);
}
/*最小方塊的繪制*/
void minbox(int asc,int bsc,int color,int bdcolor){
int a=0,b=0;
a=SCCOL+asc;
b=SCROW+bsc;
clscr(a+1,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE,color);
if(color!=BGCOLOR){
setcolor(bdcolor);
line(a+1,b+1,a-1+MINBOXSIZE,b+1);
line(a+1,b+1,a+1,b-1+MINBOXSIZE);
line(a-1+MINBOXSIZE,b+1,a-1+MINBOXSIZE,b-1+MINBOXSIZE);
line(a+1,b-1+MINBOXSIZE,a-1+MINBOXSIZE,b-1+MINBOXSIZE);
}
}

/*游戲中出現的文字*/
void txt(int a,int b,char *txt,int font,int color){
setcolor(color);
settextstyle(0,0,font);
outtextxy(a,b,txt);
}
/*windows 繪制*/
void win(int a,int b,int c,int d,int bgcolor,int bordercolor){
clscr(a,b,c,d,bgcolor);
setcolor(bordercolor);
line(a,b,c,b);
line(a,b,a,d);
line(a,d,c,d);
line(c,b,c,d);

}

/* 當前方塊的繪制*/
void funbox(int a,int b,int color,int bdcolor){
int i,j;
int boxz[4][4];
for(i=0;i<16;i++)
boxz[i/4][i%4]=boxstr[boxgs][boxfx][i];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(boxz[i][j]==1)
minbox((j+row+a)*MINBOXSIZE,(i+col+b)*MINBOXSIZE,color,bdcolor);
}
/*下一個方塊的繪制*/
void nextfunbox(int a,int b,int color,int bdcolor){
int i,j;
int boxz[4][4];
for(i=0;i<16;i++)
boxz[i/4][i%4]=boxstr[nextboxgs][nextboxfx][i];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(boxz[i][j]==1)
minbox((j+a)*MINBOXSIZE,(i+b)*MINBOXSIZE,color,bdcolor);
}
/*時間中斷定義*/
#define TIMER 0x1c
int TimerCounter=0;
void interrupt ( *oldhandler)(__CPPARGS);
void interrupt newhandler(__CPPARGS){
TimerCounter++;
oldhandler();
}
void SetTimer(void interrupt (*IntProc)(__CPPARGS)){
oldhandler=getvect(TIMER);
disable();
setvect(TIMER,IntProc);
enable();
}
/*由於游戲的規則,消掉都有最小方塊的一行*/
void delcol(int a){
int i,j;
for(i=a;i>1;i--)
for(j=1;j<15;j++){
minbox(j*MINBOXSIZE,i*MINBOXSIZE,BGCOLOR,BGCOLOR);
gril[i][j]=gril[i-1][j];
if(gril[i][j]==1)
minbox(j*MINBOXSIZE,i*MINBOXSIZE,minboxcolor,0);
}
}

/*消掉所有都有最小方塊的行*/
void delete(){
int i,j,zero,delgx=0;
char *nm="00000";
for(i=1;i<21;i++){
zero=0;
for(j=1;j<15;j++)
if(gril[i][j]==0)
zero=1;
if(zero==0){
delcol(i);
delgx++;
}
}
num=num+delgx*delgx*10;
dj=num/10000;

sprintf(nm,"%d",num);
clscr(456,173,500,200,4);
txt(456,173,"Number:",1,15);
txt(456,193,nm,1,15);
}
/*時間中斷結束*/
void KillTimer(){
disable();
setvect(TIMER,oldhandler);
enable();
}
/* 測試當前方塊是否可以向下落*/
int downok(){
int i,j,k=1,a[4][4];
for(i=0;i<16;i++)
a[i/4][i%4]=boxstr[boxgs][boxfx][i];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j] && gril[col+i+1][row+j])
k=0;
return(k);
}
/* 測試當前方塊是否可以向左行*/
int leftok(){
int i,j,k=1,a[4][4];
for(i=0;i<16;i++)
a[i/4][i%4]=boxstr[boxgs][boxfx][i];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j] && gril[col+i][row+j-1])
k=0;
return(k);
}
/* 測試當前方塊是否可以向右行*/
int rightok(){
int i,j,k=1,a[4][4];
for(i=0;i<16;i++)
a[i/4][i%4]=boxstr[boxgs][boxfx][i];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j] && gril[col+i][row+j+1])
k=0;
return(k);
}
/* 測試當前方塊是否可以變形*/
int upok(){
int i,j,k=1,a[4][4];
for(i=0;i<4;i++)
for(i=0;i<16;i++)
a[i/4][i%4]=boxstr[boxgs][boxfx+1][i];
for(i=3;i>=0;i--)
for(j=3;j>=0;j--)
if(a[i][j] && gril[col+i][row+j])
k=0;
return(k);
}
/*當前方塊落下之後,給屏幕坐標作標記*/
void setgril(){
int i,j,a[4][4];
funbox(0,0,minboxcolor,0);
for(i=0;i<16;i++)
a[i/4][i%4]=boxstr[boxgs][boxfx][i];
for(i=0;i<4;i++)
for(j=0;j<4;j++)
if(a[i][j])
gril[col+i][row+j]=1;
col=1;row=7;
}
/*游戲結束*/
void gameover(){
int i,j;

for(i=20;i>0;i--)
for(j=1;j<15;j++)
minbox(j*MINBOXSIZE,i*MINBOXSIZE,2,0);
txt(103,203,"Game Over",3,10);
}
/*按鍵的設置*/
void call_key(int keyx){
switch(keyx){
case VK_DOWN: { /*下方向鍵,橫坐標加一。*/
if(downok()){
col++;
funbox(0,0,minboxcolor,0);}
else{
funbox(0,0,minboxcolor,0);
setgril();
nextfunbox(NEXTCOL,NEXTROW,4,4);
boxrad();
nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);
delete();
}
break;
}
case VK_UP: { /*上方向鍵,方向形狀旋轉90度*/
if(upok())
boxfx++;
if(boxfx>3)
boxfx=0;
funbox(0,0,minboxcolor,0);
break;
}
case VK_LEFT:{ /*左方向鍵,縱坐標減一*/
if(leftok())
row--;
funbox(0,0,minboxcolor,0);
break;
}
case VK_RIGHT:{ /*右方向鍵,縱坐標加一*/
if(rightok())
row++;
funbox(0,0,minboxcolor,0);
break;
}
case VK_SPACE: /*空格鍵,直接落到最後可以落到的們置*/
while(downok())
col++;
funbox(0,0,minboxcolor,0);
setgril();
nextfunbox(NEXTCOL,NEXTROW,4,4);
boxrad();
nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);
delete();
break;
default:
{
txt(423,53,"worng key!",1,4);
txt(428,80,"Plese Enter Anly Key AG!",1,4);
getch();
clscr(420,50,622,97,BGCOLOR);
}
}
}

/*時間中斷開始*/
void timezd(void){
int key;
SetTimer(newhandler);
boxrad();
nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);
for(;;){
if(bioskey(1)){
key=bioskey(0);
funbox(0,0,BGCOLOR,BGCOLOR);
if(key==VK_ESC)
break;
call_key(key);
}
if(TimerCounter>gamedj[dj]){
TimerCounter=0;
if(downok()){
funbox(0,0,BGCOLOR,BGCOLOR);
col++;
funbox(0,0,minboxcolor,0);
}
else {
if(col==1){
gameover();
getch();
break;
}
setgril();
delete();
funbox(0,0,minboxcolor,0);
col=1;row=7;
funbox(0,0,BGCOLOR,BGCOLOR);
nextfunbox(NEXTCOL,NEXTROW,4,4);
boxrad();
nextfunbox(NEXTCOL,NEXTROW,nextminboxcolor,0);
}
}
}
}

/*主程序開始*/
void main(void){
int i,j;
char *nm="00000";
init(VGA,VGAHI);
cls();
/*屏幕坐標初始化*/
for(i=0;i<=MAXCOL+1;i++)
for(j=0;j<=MAXROW+1;j++)
gril[i][j]=0;
for(i=0;i<=MAXCOL+1;i++) {
gril[i][0]=1;
gril[i][15]=1;
}
for(j=1;j<=MAXROW;j++){
gril[0][j]=1;
gril[21][j]=1;
}
clscr(0,0,640,480,15);
win(1,1,639,479,4,15);
win(SCCOL+MINBOXSIZE-2,SCROW+MINBOXSIZE-2,SCCOL+15*MINBOXSIZE+2,SCROW+21*MINBOXSIZE+2,BGCOLOR,0);
nextboxgs=random(8);
nextboxfx=random(4);
sprintf(nm,"%d",num);
txt(456,173,"Number:",1,15);
txt(456,193,nm,1,15);
txt(456,243,"Next Box:",1,15);
timezd();
KillTimer();
closegraph();
}

⑵ c語言中,函數itoa有什麼功能,怎麼用

itoa是廣泛應用的非標准C語言擴展函數。由於它不是標准C語言函數,所以不能在所有的編譯器中使 用。但是,大多數的編譯器(如Windows上的)通常在<stdlib.h>頭文件中包含這個函數。在<stdlib.h>中與之有相反功能的函數是atoi。功能:把一整數轉換為字元串。
用法
char *itoa(int value, char *string, int radix);
頭文件: <stdlib.h>
程序例:
#include <stdlib.h>
#include <stdio.h>
int main()
{
int number = 123456;
char string[25];
itoa(number, string, 10);
printf("integer = %d string = %s\n", number, string);
return 0;
}
/* 實現itoa函數的源代碼 */
char *myitoa(int num,char *str,int radix)
{
/* 索引表 */
char index[]="";
unsigned unum; /* 中間變數 *
int i=0,j,k;
/* 確定unum的值 */
if(radix==10&&num<0) /* 十進制負數 */
{
unum=(unsigned)-num;
str[i++]='-';
}
else unum=(unsigned)num; /* 其他情況 */
/* 逆序 */
do {
str[i++]=index[unum%(unsigned)radix];
unum/=radix;
}while(unum);
str[i]='\0';
/* 轉換 */
if(str[0]=='-') k=1; /* 十進制負數 */
else k=0;
/* 將原來的「/2」改為「/2.0」,保證當num在16~255之間,radix等於16時,也能得到正確結果 */
for(j=k;j<=(i-1)/2.0+k;j++)
{
num=str[j];
str[j]=str[i-j-1+k];
str[i-j-1+k]=num;
}
return str;
}
itoa的第三個參數用於將數字轉換成不同的進制。舉個例子:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int number = 12345;
char string[25];
itoa(number, string, 10); //按十進制轉換
printf("integer = %d string = %s\n", number, string);
itoa(number, string, 16); //按16進制轉換
printf("integer = %d string = %s\n", number, string);
return 0;
}
輸出結果:
integer = 12345 string = 12345 --說明12345的十進製表示就是12345
integer = 12345 string = 3039 ——說明12345的十六進製表示是0x3039
但是要注意,itoa並不是一個標準的C函數,它是Windows特有的,如果要寫跨平台的程序,請用sprintf。
用幾進製表示吧:)
MSDN的例子
Example
/* ITOA.C: This program converts integers of various
* sizes to strings in various radixes.
*/
#include <stdlib.h>
#include <stdio.h>
void main( void )
{
char buffer[20];
int i = 3445;
long l = -344115L;
unsigned long ul = 1234567890UL;
_itoa( i, buffer, 10 );
printf( "String of integer %d (radix 10): %s\n", i, buffer );
_itoa( i, buffer, 16 );
printf( "String of integer %d (radix 16): 0x%s\n", i, buffer );
_itoa( i, buffer, 2 );
printf( "String of integer %d (radix 2): %s\n", i, buffer );
_ltoa( l, buffer, 16 );
printf( "String of long int %ld (radix 16): 0x%s\n", l, buffer );
_ultoa( ul, buffer, 16 );
printf( "String of unsigned long %lu (radix 16): 0x%s\n", ul, buffer );
}
Output
String of integer 3445 (radix 10): 3445
String of integer 3445 (radix 16): 0xd75
String of integer 3445 (radix 2): 110101110101
String of long int -344115 (radix 16): 0xfffabfcd
String of unsigned long 1234567890 (radix 16): 0x499602d2
指定要轉換的進制的基數,其值好象在1--36之間都可以
這個不是C標准庫中的函數,而是Windows平台下擴展的,標准庫中有sprintf,功能比這個更強,用法跟printf類似:
char str[255];
sprintf(str, "%x", 100); //將100轉為16進製表示的字元串。

⑶ 求:等值線填充源代碼(C,C++ )小女子在此謝過

#define MAXX 50
#define MAXY 50
#include <stdio.h>
#include <stdlib.h>
#include <alloc.h>
#include <conio.h>
#include <graphics.h>
#include <string.h>

/*==================用趨勢面加權最小二乘法計算網點高程制===================================*/宏兄悉
#include <conio.h>
#include <stdio.h>
#include <math.h>
int CN1,CN2,NP1; /*-----CN1,CN2為網點間距,NP1為測量點個數------*/
int X0,Y0; /*-----X0,Y0為網格起點坐標------*/

void wzjs(int n,int m,float *x,float *y,float *z,float **bb)
{
int i,j,k,k0,k1,n0,hh=0;
double cnum,x1,x2,y1,y2,xt,yt,xxt,yyt,xyt,zt,A,B,c;
double e[10][10]={0,u[10]={0;

for(i=0;i<=n;i++) /*-----列網(X向)------*/
{
A=X0+i*CN1;
for(j=0;j<塵遲=m;j++) /*------橫蔽乎網(y向)------*/
{
B=Y0+j*CN2;
for(k=0;k<10;k++)
{
u[k]=0;
for(k0=0;k0<10;k0++) e[k][k0]=0;

for(k=0;k<NP1;k++) /*-----高斯法計算曲面方程值並計算網格點值-------*/
{
hh=0;
if(A==*(x+k)&&B==*(y+k))
{
*(*(bb+i)+j)=*(z+k);
hh=1; break;

x1=*(x+k); y1=*(y+k);
x2=x1*x1; y2=y1*y1;
cnum=(x1-A)*(x1-A)+(y1-B)*(y1-B);
cnum=1/cnum;
xt=cnum*x1; yt=cnum*y1;
xxt=x2*cnum; yyt=y2*cnum; xyt=x1*yt;
e[1][1]=e[1][1]+cnum; e[1][2]=e[1][2]+xt;
e[1][3]=e[1][3]+yt; e[1][4]=e[1][4]+xyt;
e[1][5]=e[1][5]+xxt; e[1][6]=e[1][6]+yyt;
e[2][4]=e[2][4]+x2*yt; e[2][5]=e[2][5]+x2*xt;
e[2][6]=e[2][6]+y2*xt; e[3][6]=e[3][6]+y2*yt;
e[4][4]=e[4][4]+x2*yyt; e[4][5]=e[4][5]+x2*xyt;
e[4][6]=e[4][6]+y2*xyt; e[5][5]=e[5][5]+x2*xxt;
e[6][6]=e[6][6]+y2*yyt;
zt=*(z+k)*cnum;
u[1]=u[1]+zt; u[2]=u[2]+x1*zt;
u[3]=u[3]+y1*zt; u[4]=u[4]+x1*y1*zt;
u[5]=u[5]+x2*zt; u[6]=u[6]+y2*zt;

if(hh==1) continue;
e[2][2]=e[1][5]; e[2][3]=e[1][4]; e[3][3]=e[1][6];
e[3][4]=e[2][6]; e[3][5]=e[2][4]; e[5][6]=e[4][4];
for(k=1;k<6;k++)
for(k0=k+1;k0<7;k0++)
e[k0][k]=e[k][k0];
for(k=1;k<7;k++) e[k][7]=u[k];
n0=6;
for(k=1;k<n0;k++)
for(k0=k+1;k0<n0+1;k0++)
for(k1=k+1;k1<n0+2;k1++)
e[k0][k1]=e[k0][k1]-e[k0][k]*e[k][k1]/e[k][k];
u[n0]=e[n0][n0+1]/e[n0][n0];
for(k=n0-1;k>0;k--)
{
c=0;
for(k0=k+1;k0<n0+1;k0++)
c=c+e[k][k0]*u[k0];
u[k]=(e[k][n0+1]-c)/e[k][k];

*(*(bb+i)+j)=u[1]+A*(u[2]+B*u[4]+A*u[5])+B*(u[3]+B*u[6]);

/*=============================================*/
/* 繪制等值線 /
/*=============================================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
int i1,i2,j1,j2;
int zdzz(float *a1,float *b1,float *a2,float *b2);
void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item)
{
float a1,b1,a2,b2,sin,xa[1000]={0,yb[1000]={0;
int k=1;
a2=a0; b2=b0; a1=a0+5; b1=b0+5;
xa[0]=a0; yb[0]=b0;
do{ /*-------畫線-------*/
if(zdzz(&a1,&b1,&a2,&b2)==1)
{
line(a2/ratox,getmaxy()-b2/ratoy,a0/ratox,getmaxy()-b0/ratoy);
break;

line(a1/ratox,getmaxy()-b1/ratoy,a2/ratox,getmaxy()-b2/ratoy);
xa[k]=a2/ratox; yb[k]=getmaxy()-b2/ratoy;
k++;
while(a2>0&&b2>0&&i2<n&&j2<m);
k=k/2;
if((xa[k+1]-xa[k-1])<0.3) sin=VERT_DIR; /*-----書寫等值數字------*/
else if((yb[k+1]-yb[k-1])<0.3) sin=VERT_DIR;
else sin=(yb[k+1]-yb[k-1])/(xa[k+1]-xa[k-1]);

settextstyle(TRIPLEX_FONT,sin,3);
setcolor(WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy(xa[k],yb[k],item);
setcolor(GREEN);

#include "hmain.h"
/*讀入數據*/
void rcvda(char *flname,float *x,float *y,float *z,int *n0);
/*劃分網格並計算網點*/
void wzjs(int n,int m,float *x,float *y,float *z,float **bb);
/*計算等值點*/
void bzdzd(int w,int *n,int *m,float **bb);
/*繪制等值線*/
void xcln(int n,int m,float ratox,float ratoy,char *item);

/*-----------全局變數-------------------*/
int CN1,CN2,NP1;
int X0,Y0,kk,kk1;
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];

/*void mapmode();---------圖形模式---------*/
/*==============================設置圖形模式=======================================*/
void mapmode()
{
int gdriver=DETECT,gmode,errorcode; /*----自動探測------*/
errorcode=registerbgidriver(EGAVGA_driver);
if(errorcode<0)
{
printf("Graphics error:n%s",grapherrormsg(errorcode)); /*----報告注冊錯誤-----*/
printf("nPress any key to halt:");
getch();
exit(1);

initgraph(&gdriver,&gmode,""); /*----初始化圖形模式----*/
errorcode=graphresult();
if(errorcode!=grOK)
{
printf("Graphics error:n%s",grapherrormsg(errorcode));
printf("nPress any key to halt:");
getch();
exit(1);

/*=======================================主函數=========================================*/
main()
{
int i,j,n,m,w,pn1,pn2,pn3,n0=0,ccc;
float x[MAXX],x0[MAXX],y[MAXY],y0[MAXY],z[MAXX],ratox,ratoy;
float mx,my,mz,nx,ny,nz;
char flname[12],item[10],ch;
float bb1[MAXX][MAXY]={0;
float *bb[MAXX];
for(i=0;i<MAXX;i++)
{
bb[i]=&bb1[i][0]; /*---------將數組清零----------*/

clrscr();
mapmode(); /*---------設置圖形模式-------*/
printf("請輸入數據文件名:");
scanf("%s",flname);
rcvda(flname,x,y,z,&n0); /*--------從文件讀入數據--------*/
mx=nx=x[0];
my=ny=y[0];
mz=nz=z[0];
for(i=0;i<n0;i++) /*--------確定數據范圍-----*/

{
if(x[i]>mx) mx=x[i];
else if(x[i]<nx) nx=x[i];
if(y[i]>my) my=x[i];
else if(y[i]<ny) ny=y[i];
if(z[i]>mz) mz=z[i];
else if(z[i]<nz) nz=z[i];

NP1=n0;
printf("nmaxx=%.lf minx=%.lfn",mx,nx);
printf("nmaxy=%.lf miny=%.lfn",my,ny);
printf("nmaxz=%.lf minz=%.lfn",mz,nz);
printf("n請輸入網格間距:");
scanf("%d",&CN1);
CN2=CN1;
n=(int)(mx-nx)/CN1; /*------計算網格數-------*/
m=(int)(my-ny)/CN2;
X0=(int)(nx/CN1); X0=X0*CN1; /*------計算起始點的坐標-----*/
Y0=(int)(ny/CN2); Y0=Y0*CN2;
ratox=n*CN1/640.0; ratoy=m*CN2/480.0; /*-------x,y方向系數------*/
wzjs(n,m,x,y,z,bb); /*-----計算等值點-------*/
printf("n請輸入最小等值線值:");
scanf("%d",&pn1);
printf("n請輸入最大等值線值:");
scanf("%d",&pn2);
printf("n請輸入等值線間距:");
scanf("%d",&pn3);
cleardevice();
for(i=0;i<n0;i++)
{
x0[i]=(x[i]-X0)/ratox; /*------計算各點的屏幕坐標-----*/
y0[i]=(y[i]-Y0)/ratoy;
setcolor(RED);
circle(x0[i],getmaxy()-y0[i],3); /*------畫一圓示型值點--------*/

for(w=pn1;w<=pn2;w+=pn3) /*-------逐條等值線形成--------*/
{
bzdzd(w,&n,&m,bb); /*--------計算等值點--------*/

itoa(w,item,10); /*-------將整數W轉換成字元用於標注----*/

xcln(n,m,ratox,ratoy,item); /*-------繪制等值線----*/

getch();
closegraph();

/*==================從文件讀入數據======================================*/
#include "hmain.h』
void rcvda(char *flname,float *x,float *y,float *z,int *n0)
{
FILE *stream;
if((stream=fopen(flname,"rt"))==NULL) /*------打開文件-------*/
{
printf("nCan』t open %s:",flname);
getch();
exit(0);

while(!feof(stream)) /*------讀文件直到結束-------*/
{
fscanf(stream,"%f,",(x+*n0));
fscanf(stream,"%f,",(y+*n0));
fscanf(stream,"%f,",(z+*n0));
*n0=*n0+1; /*-----指定區域變動--------*/

fclose(stream);

/*==================用趨勢面加權最小二乘法計算網點高程制===================================*/
#include <conio.h>
#include <stdio.h>
#include <math.h>
int CN1,CN2,NP1; /*-----CN1,CN2為網點間距,NP1為測量點個數------*/
int X0,Y0; /*-----X0,Y0為網格起點坐標------*/

void wzjs(int n,int m,float *x,float *y,float *z,float **bb)
{
int i,j,k,k0,k1,n0,hh=0;
double cnum,x1,x2,y1,y2,xt,yt,xxt,yyt,xyt,zt,A,B,c;
double e[10][10]={0,u[10]={0;

for(i=0;i<=n;i++) /*-----列網(X向)------*/
{
A=X0+i*CN1;
for(j=0;j<=m;j++) /*------橫網(y向)------*/
{
B=Y0+j*CN2;
for(k=0;k<10;k++)
{
u[k]=0;
for(k0=0;k0<10;k0++) e[k][k0]=0;

for(k=0;k<NP1;k++) /*-----高斯法計算曲面方程值並計算網格點值-------*/
{
hh=0;
if(A==*(x+k)&&B==*(y+k))
{
*(*(bb+i)+j)=*(z+k);
hh=1; break;

x1=*(x+k); y1=*(y+k);
x2=x1*x1; y2=y1*y1;
cnum=(x1-A)*(x1-A)+(y1-B)*(y1-B);
cnum=1/cnum;
xt=cnum*x1; yt=cnum*y1;
xxt=x2*cnum; yyt=y2*cnum; xyt=x1*yt;
e[1][1]=e[1][1]+cnum; e[1][2]=e[1][2]+xt;
e[1][3]=e[1][3]+yt; e[1][4]=e[1][4]+xyt;
e[1][5]=e[1][5]+xxt; e[1][6]=e[1][6]+yyt;
e[2][4]=e[2][4]+x2*yt; e[2][5]=e[2][5]+x2*xt;
e[2][6]=e[2][6]+y2*xt; e[3][6]=e[3][6]+y2*yt;
e[4][4]=e[4][4]+x2*yyt; e[4][5]=e[4][5]+x2*xyt;
e[4][6]=e[4][6]+y2*xyt; e[5][5]=e[5][5]+x2*xxt;
e[6][6]=e[6][6]+y2*yyt;
zt=*(z+k)*cnum;
u[1]=u[1]+zt; u[2]=u[2]+x1*zt;
u[3]=u[3]+y1*zt; u[4]=u[4]+x1*y1*zt;
u[5]=u[5]+x2*zt; u[6]=u[6]+y2*zt;

if(hh==1) continue;
e[2][2]=e[1][5]; e[2][3]=e[1][4]; e[3][3]=e[1][6];
e[3][4]=e[2][6]; e[3][5]=e[2][4]; e[5][6]=e[4][4];
for(k=1;k<6;k++)
for(k0=k+1;k0<7;k0++)
e[k0][k]=e[k][k0];
for(k=1;k<7;k++) e[k][7]=u[k];
n0=6;
for(k=1;k<n0;k++)
for(k0=k+1;k0<n0+1;k0++)
for(k1=k+1;k1<n0+2;k1++)
e[k0][k1]=e[k0][k1]-e[k0][k]*e[k][k1]/e[k][k];
u[n0]=e[n0][n0+1]/e[n0][n0];
for(k=n0-1;k>0;k--)
{
c=0;
for(k0=k+1;k0<n0+1;k0++)
c=c+e[k][k0]*u[k0];
u[k]=(e[k][n0+1]-c)/e[k][k];

*(*(bb+i)+j)=u[1]+A*(u[2]+B*u[4]+A*u[5])+B*(u[3]+B*u[6]);

/*=======================標記出網格每邊上是否有一高程的等值點===============================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];/*------等值點標志-----*/
void bzdzd(int w,int *n,int *m,float **bb)
{
int i,j;
float m1,m2;
for(i=0;i<*n+1;i++) /*-----列網(X向)------*/
for(j=0;j<*m;j++)
{
m1=w-*(*(bb+i)+j); if(m1==0) m1=-0.01;
m2=w-*(*(bb+i)+j+1); if(m2==0) m2=-0.01;
if(m1*m2<0) flagy[i][j]=m1/(m1-m2);
else flagy[i][j]=-2;

for(i=0;i<*n;i++) /*------橫網(y向)------*/
for(j=0;j<*m+1;j++)
{
m1=w-*(*(bb+i)+j); if(m1==0) m1=-0.01;
m2=w-*(*(bb+i+1)+j); if(m2==0) m2=-0.01;
if(m1*m2<0) flagx[i][j]=m1/(m1-m2);
else flagx[i][j]=-2;

/*===============等值線追蹤=================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
int CN1,CN2,i1,i2,j1,j2;
int zdzz(float *a1,float *b1,float *a2,float *b2)
{
int flag,i0,j0,s1;

if(j2>j1) flag=1;
else
if(i2>i1) flag=2;
else
if(*b2==j2*CN2) flag=3;
else
flag=4;
switch(flag)
{
case 1:
if(flagy[i2][j2]>0) /*----判斷向左走----*/
{
i0=i2; j0=j2; s1=0;

else if(flagy[i2+1][j2]>0)
{
i0=i2+1; j0=j2; s1=0;

else if(flagx[i2][j2+1]>0)
{
i0=i2; j0=j2+1; s1=1;

else return 1;
break;
case 2:
if(flagx[i2][j2]>0) /*----判斷向上走------*/
{
i0=i2; j0=j2; s1=1;

else if(flagx[i2][j2+1]>0)
{
i0=i2; j0=j2+1; s1=1;

else if(flagy[i2+1][j2]>0)
{
i0=i2+1; j0=j2; s1=0;

else return 1;
break;
case 3:
if(flagy[i2][j2-1]>0) /*----判斷向右走----*/
{
i0=i2; j0=j2-1; s1=0;

else if(flagy[i2+1][j2-1]>0)
{
i0=i2+1; j0=j2-1; s1=0;

else if(flagx[i2][j2-1]>0)
{
i0=i2; j0=j2-1; s1=1;

else return 1;
break;
case 4:
if(flagx[i2-1][j2]>0) /*------判斷向下走-----*/
{
i0=i2-1; j0=j2; s1=1;

else if(flagx[i2-1][j2+1]>0)
{
i0=i2-1; j0=j2+1; s1=1;

else if(flagy[i2-1][j2]>0)
{
i0=i2-1; j0=j2; s1=0;

else return 1;
break;

i1=i2; j1=j2; i2=i0; j2=j0;
*a1=*a2; *b1=*b2;
*a2=(i2+s1*flagx[i2][j2])*CN1;
*b2=(j2+(1-s1)*flagy[i2][j2])*CN2;
if(s1==0) flagy[i2][j2]=-2; /*----用過標志----*/
else flagx[i2][j2]=-2;
return 0;

/*=============================================*/
/* 繪制等值線 /
/*=============================================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
int i1,i2,j1,j2;
int zdzz(float *a1,float *b1,float *a2,float *b2);
void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item)
{
float a1,b1,a2,b2,sin,xa[1000]={0,yb[1000]={0;
int k=1;
a2=a0; b2=b0; a1=a0+5; b1=b0+5;
xa[0]=a0; yb[0]=b0;
do{ /*-------畫線-------*/
if(zdzz(&a1,&b1,&a2,&b2)==1)
{
line(a2/ratox,getmaxy()-b2/ratoy,a0/ratox,getmaxy()-b0/ratoy);
break;

line(a1/ratox,getmaxy()-b1/ratoy,a2/ratox,getmaxy()-b2/ratoy);
xa[k]=a2/ratox; yb[k]=getmaxy()-b2/ratoy;
k++;
while(a2>0&&b2>0&&i2<n&&j2<m);
k=k/2;
if((xa[k+1]-xa[k-1])<0.3) sin=VERT_DIR; /*-----書寫等值數字------*/
else if((yb[k+1]-yb[k-1])<0.3) sin=VERT_DIR;
else sin=(yb[k+1]-yb[k-1])/(xa[k+1]-xa[k-1]);

settextstyle(TRIPLEX_FONT,sin,3);
setcolor(WHITE);
settextjustify(CENTER_TEXT,CENTER_TEXT);
outtextxy(xa[k],yb[k],item);
setcolor(GREEN);

/*=============================================*/
/* 尋找線頭,繪制等值線 /
/*=============================================*/
#include "hmain.h"
int CN1,CN2;
void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item);
int i1,i2,j1,j2;
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
void xcln(int n,int m,float ratox,float ratoy,char *item)
{
int w,w1;
float a0,b0;
for(w=0;w<n;w++) /*-------從下找起始點-------*/
if(flagx[w][0]>0)
{
i1=w; i2=w; j1=-1; j2=0;
a0=(i2+flagx[w][0])*CN1;
flagx[w][0]=-2; b0=0;
drawln(a0,b0,n,m,ratox,ratoy,item);

for(w=0;w<m;w++) /*---------從左找起始點---------*/
if(flagy[0][w]>0)
{
i1=-1; i2=0; j1=w; j2=w;
b0=(j2+flagy[0][w])*CN2;
flagy[0][w]=-2; a0=0;
drawln(a0,b0,n,m,ratox,ratoy,item);

for(w=0;w<n;w++) /*---------從上找起始點---------*/
if(flagx[w][m]>0)
{
i1=w; i2=w; j1=m; j2=m;
a0=(i2+flagx[i2][j2])*CN1;
b0=m*CN2; flagx[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);

for(w=0;w<m;w++) /*---------從右找起始點---------*/
if(flagy[n][w]>0)
{
i1=n; i2=n; j1=w; j2=w;
b0=(j2+flagy[i2][j2])*CN2;
a0=n*CN1; flagy[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);

for(w=1;w<n;w++) /*---------從網格內找起始點---------*/
for(w1=0;w1<m;w1++)
if(flagy[w][w1]>0)
{
i1=-1; i2=w; j1=w1; j2=w1;
a0=i2*CN1;
b0=(j2+flagy[i2][j2])*CN2; flagy[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);

/*=======================標記出網格每邊上是否有一高程的等值點===============================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];/*------等值點標志-----*/
void bzdzd(int w,int *n,int *m,float **bb)
{
int i,j;
float m1,m2;
for(i=0;i<*n+1;i++) /*-----列網(X向)------*/
for(j=0;j<*m;j++)
{
m1=w-*(*(bb+i)+j); if(m1==0) m1=-0.01;
m2=w-*(*(bb+i)+j+1); if(m2==0) m2=-0.01;
if(m1*m2<0) flagy[i][j]=m1/(m1-m2);
else flagy[i][j]=-2;

for(i=0;i<*n;i++) /*------橫網(y向)------*/
for(j=0;j<*m+1;j++)
{
m1=w-*(*(bb+i)+j); if(m1==0) m1=-0.01;
m2=w-*(*(bb+i+1)+j); if(m2==0) m2=-0.01;
if(m1*m2<0) flagx[i][j]=m1/(m1-m2);
else flagx[i][j]=-2;

/*==================從文件讀入數據======================================*/
#include "hmain.h"
void rcvda(char *flname,float *x,float *y,float *z,int *n0)
{
FILE *stream;
if((stream=fopen(flname,"rt"))==NULL) /*------打開文件-------*/
{
printf("nCan』t open %s:",flname);
getch();
exit(0);

while(!feof(stream)) /*------讀文件直到結束-------*/
{
fscanf(stream,"%f,",(x+*n0));
fscanf(stream,"%f,",(y+*n0));
fscanf(stream,"%f,",(z+*n0));
*n0=*n0+1; /*-----指定區域變動--------*/

fclose(stream);

/*=============================================*/
/* 尋找線頭,繪制等值線 /
/*=============================================*/
#include "hmain.h"
int CN1,CN2;
void drawln(float a0,float b0,int n,int m,float ratox,float ratoy,char *item);
int i1,i2,j1,j2;
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
void xcln(int n,int m,float ratox,float ratoy,char *item)
{
int w,w1;
float a0,b0;
for(w=0;w<n;w++) /*-------從下找起始點-------*/
if(flagx[w][0]>0)
{
i1=w; i2=w; j1=-1; j2=0;
a0=(i2+flagx[w][0])*CN1;
flagx[w][0]=-2; b0=0;
drawln(a0,b0,n,m,ratox,ratoy,item);

for(w=0;w<m;w++) /*---------從左找起始點---------*/
if(flagy[0][w]>0)
{
i1=-1; i2=0; j1=w; j2=w;
b0=(j2+flagy[0][w])*CN2;
flagy[0][w]=-2; a0=0;
drawln(a0,b0,n,m,ratox,ratoy,item);

for(w=0;w<n;w++) /*---------從上找起始點---------*/
if(flagx[w][m]>0)
{
i1=w; i2=w; j1=m; j2=m;
a0=(i2+flagx[i2][j2])*CN1;
b0=m*CN2; flagx[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);

for(w=0;w<m;w++) /*---------從右找起始點---------*/
if(flagy[n][w]>0)
{
i1=n; i2=n; j1=w; j2=w;
b0=(j2+flagy[i2][j2])*CN2;
a0=n*CN1; flagy[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);

for(w=1;w<n;w++) /*---------從網格內找起始點---------*/
for(w1=0;w1<m;w1++)
if(flagy[w][w1]>0)
{
i1=-1; i2=w; j1=w1; j2=w1;
a0=i2*CN1;
b0=(j2+flagy[i2][j2])*CN2; flagy[i2][j2]=-2;
drawln(a0,b0,n,m,ratox,ratoy,item);

/*===============等值線追蹤=================*/
#include "hmain.h"
float flagx[MAXX][MAXY],flagy[MAXX][MAXY];
int CN1,CN2,i1,i2,j1,j2;
int zdzz(float *a1,float *b1,float *a2,float *b2)
{
int flag,i0,j0,s1;

if(j2>j1) flag=1;
else
if(i2>i1) flag=2;
else
if(*b2==j2*CN2) flag=3;
else
flag=4;
switch(flag)
{
case 1:
if(flagy[i2][j2]>0) /*----判斷向左走----*/
{
i0=i2; j0=j2; s1=0;

else if(flagy[i2+1][j2]>0)
{
i0=i2+1; j0=j2; s1=0;

else if(flagx[i2][j2+1]>0)
{
i0=i2; j0=j2+1; s1=1;

else return 1;
break;
case 2:
if(flagx[i2][j2]>0) /*----判斷向上走------*/
{
i0=i2; j0=j2; s1=1;

else if(flagx[i2][j2+1]>0)
{
i0=i2; j0=j2+1; s1=1;

else if(flagy[i2+1][j2]>0)
{
i0=i2+1; j0=j2; s1=0;

else return 1;
break;
case 3:
if(flagy[i2][j2-1]>0) /*----判斷向右走----*/
{
i0=i2; j0=j2-1; s1=0;

else if(flagy[i2+1][j2-1]>0)
{
i0=i2+1; j0=j2-1; s1=0;

else if(flagx[i2][j2-1]>0)
{
i0=i2; j0=j2-1; s1=1;

else return 1;
break;
case 4:
if(flagx[i2-1][j2]>0) /*------判斷向下走-----*/
{
i0=i2-1; j0=j2; s1=1;

else if(flagx[i2-1][j2+1]>0)
{
i0=i2-1; j0=j2+1; s1=1;

else if(flagy[i2-1][j2]>0)
{
i0=i2-1; j0=j2; s1=0;

else return 1;
break;

i1=i2; j1=j2; i2=i0; j2=j0;
*a1=*a2; *b1=*b2;
*a2=(i2+s1*flagx[i2][j2])*CN1;
*b2=(j2+(1-s1)*flagy[i2][j2])*CN2;
if(s1==0) flagy[i2][j2]=-2; /*----用過標志----*/
else flagx[i2][j2]=-2;
return 0;

⑷ 求C++ C語言大神幫忙弄一個串口通信的代碼

這是我以前寫的一個串口通訊文件,全部貼出來了,希望對你有幫助,包括設置,發送,接受數據,你可以好好看看,祝你成功
// 串口Dlg.cpp : 實現文件
//
#include "stdafx.h"
#include "串口.h"
#include "串口Dlg.h"
#include "afxdialogex.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// 用於應用程序「關於」菜單項的 CAboutDlg 對話框
class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();
// 對話框數據
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 實現
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()

// C串口Dlg 對話框

C串口Dlg::C串口Dlg(CWnd* pParent /*=NULL*/)
: CDialogEx(C串口Dlg::IDD, pParent)
, m_Selection(0)
, m_recv(_T(""))
, m_send(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void C串口Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_MSCOMM1, m_CMscomm);
DDX_Control(pDX, IDC_COMBO2, m_CComboBox);
DDX_Text(pDX, IDC_RECV, m_recv);
DDX_Text(pDX, IDC_SEND, m_send);
}
BEGIN_MESSAGE_MAP(C串口Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &C串口Dlg::OnBnClickedButton1)
ON_CBN_SELCHANGE(IDC_COMBO2, &C串口Dlg::OnSelchangeCombo2)
ON_WM_LBUTTONDBLCLK()
ON_BN_CLICKED(IDC_BUTTON2, &C串口Dlg::OnBnClickedButton2)
ON_WM_DRAWITEM()
END_MESSAGE_MAP()

// C串口Dlg 消息處理程序
BOOL C串口Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 將「關於...」菜單項添加到系統菜單中。
// IDM_ABOUTBOX 必須在系統命令范圍內。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
// TODO: 在此添加額外的初始化代碼
m_CMscomm.put_CommPort(2);
if(m_CMscomm.get_PortOpen())
m_CMscomm.put_PortOpen(0);//解除佔用
m_CMscomm.put_PortOpen(1);//打開串口
static CString str("9600,n,8,1");
m_CMscomm.get_Input();
m_CMscomm.put_RThreshold(1);
m_CMscomm.put_Settings(str);
static char ch[10];
CString str1("com");
for(int i=1;i<10;i++)
{
itoa(i,ch,10);
m_CComboBox.AddString(str1+ch);

}
m_CComboBox.SetCurSel(0);
return TRUE; // 除非將焦點設置到控制項,否則返回 TRUE
}
void C串口Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}
// 如果向對話框添加最小化按鈕,則需要下面的代碼
// 來繪制該圖標。對於使用文檔/視圖模型的 MFC 應用程序,
// 這將由框架自動完成。
void C串口Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用於繪制的設備上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使圖標在工作區矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 繪制圖標
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
CWindowDC dc(this);
CFont font; //設置字體
CBrush brush;
brush.CreateSolidBrush(255);
font.CreatePointFont(150,_T("華文行楷"));
dc.SelectObject(&font);
dc.SelectObject(&brush);
//dc.TextOut(250,300,_T("大族激光軟體中心"));
}
//當用戶拖動最小化窗口時系統調用此函數取得游標
//顯示。
HCURSOR C串口Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}

void C串口Dlg::OnBnClickedButton1()
{
static char ch1[10];
CString str("");
if(m_CMscomm.get_PortOpen())
m_CMscomm.put_PortOpen(false);
m_CMscomm.put_CommPort(m_Selection+1);
m_CMscomm.put_PortOpen(m_Selection+1);
str.Format("打開串口%d成功",m_Selection+1);
if(m_CMscomm.get_PortOpen())
{
MessageBox(str);
}
else
{

MessageBox("不能打串口");
}

//MessageBox(ch1);

// TODO: 在此添加控制項通知處理程序代碼
}

void C串口Dlg::OnSelchangeCombo2()
{
// TODO: 在此添加控制項通知處理程序代碼
//int m_Selection;
m_Selection=m_CComboBox.GetCurSel();

}

void C串口Dlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
/*short m_short=m_CMscomm.get_CommPort();
CString str;
str.Format(_T("當前打開埠:%d"),m_short+1);
MessageBox(str);
CDialogEx::OnLButtonDblClk(nFlags, point);*/
}

BEGIN_EVENTSINK_MAP(C串口Dlg, CDialogEx)
ON_EVENT(C串口Dlg, IDC_MSCOMM1, 1, C串口Dlg::OnCommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()

void C串口Dlg::OnCommMscomm1()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //設置BYTE數組 An 8-bit integerthat is not signed.
CString strtemp; if(m_CMscomm.get_CommEvent()==2) //事件值為2表示接收緩沖區內有字元
{ ////////以下你可以根據自己的通信協議加入處理代碼
variant_inp=m_CMscomm.get_Input(); //讀緩沖區
safearray_inp=variant_inp; //VARIANT型變數轉換為ColeSafeArray型變數
len=safearray_inp.GetOneDimSize(); //得到有效數據長度
for(k=0;k<len;k++) safearray_inp.GetElement(&k,rxdata+k);//轉換為BYTE型數組
for(k=0;k<len;k++) //將數組轉換為Cstring型變數
{ BYTE bt=*(char*)(rxdata+k); //字元型
strtemp.Format("%c",bt); //將字元送入臨時變數strtemp存放
m_send+=strtemp; //加入接收編輯框對應字元串
}
}
UpdateData(FALSE);
}

void C串口Dlg::OnBnClickedButton2()
{
UpdateData();
m_CMscomm.put_Output((COleVariant) m_send);
SetWindowLong(m_hWnd,GWL_EXSTYLE,GetWindowLong(m_hWnd,GWL_EXSTYLE) | WS_EX_ACCEPTFILES);
}

void C串口Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 在此添加消息處理程序代碼和/或調用默認值
MessageBox("sfsfe");
CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

⑸ 用C語言編譯一個簡單計算器的程序,要求其中有括弧和冪函數

既然大家都沒發程序,I am coming.
說明:由於冪的運算應該比括弧低比乘除要高,所以為避免混淆用冪運算時用括弧括起來,比如2+9/3^2-5表示2+(9/3)^2-5,要是想要9除以3^2,這樣輸入:2+9/(3^2)-5,以免引起歧義。
程序功能強大代碼簡練。可以對任意數值類型計算,這里全部按double型處理,程序還可以使用大括弧{}中括弧[]小括弧()三種括弧,當然優先順序是小括弧>中括弧>大括弧>運算符。
要是只想結果取整,將所有double類型改為int即可,不過不主張這樣做,既然是計算器,當然要精確計算。
一個完整的c程序如下,程序在win-tc和Dev-c++下都調試通過。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

char s[201];/*全局變數s[]與i分別表示算術表達式字元串以及其當前位置指針變數*/
int i=0;
double proc1(char ch);
void proc2(double *a,char *c);

void str_read(double *a,char *c) /*讀取下一個操作數*/
{ int j=0;
char s1[30];
while ((s[i]!='\0')&&(s[i]!='+')&&(s[i]!='-')&&(s[i]!='(')&&(s[i]!=')')
&&(s[i]!='=')&&(s[i]!='^')&&(s[i]!='*')&&(s[i]!='/')&&(s[i]!='[')&&(s[i]!=']')
&&(s[i]!='{')&&(s[i]!='}')) /*操作數結束標志*/
s1[j++]=s[i++];
s1[j]='\0';
*a=atof(s1);
*c=s[i++];
}

void input_str() /*表達式接收模塊*/
{ int j,k,t=0;
char c,s1[80];
printf("\n請輸入任一算術表達式:\n");
while (!t)
{ gets(s);
j=k=0; t=1;
while ((s[j]!='=')&&(s[j]!='\0')&&(t)) /*判斷括弧配對*/
{if ((s[j]=='(')||(s[j]=='[')||(s[j]=='{'))
switch(s[j])
{ case '(':s1[k++]=')';break;
case '[':s1[k++]=']';break;
case '{':s1[k++]='}';
}
else if ((s[j]==')')||(s[j]==']')||(s[j]=='}'))
if (s1[--k]!=s[j])
{ printf("輸入出錯!請重新輸入(直接回車退出):\n");
t=0;
}
j++;
}
if ((k!=0)&&(t))
{printf("輸入出錯!請重新輸入(直接回車退出):\n");
t=0;
}
}
}

void proc2(double *a,char *c)
/*算術運算符之後只有兩種情況:要麼是各種左括弧,要麼是操作數*/
{ char ch;
if ((s[i]=='(')||(s[i]=='[')||(s[i]=='{'))
{ switch(s[i])
{ case '(':ch=')';break;
case '[':ch=']';break;
case '{':ch='}';
}
++i;
*a=proc1(ch);
/*計算從當前左括弧開始到與其相對應的右括弧結束這段表達式的值*/
*c=s[i++]; /*跳過右括弧*/
}
else str_read(a,c); /*讀取一個操作數*/
}

double proc1(char ch)
/*該過程對算術表達式s從當前位置s[i]開始到表達式結束或s[i]==ch這部分進行求值*/
{ double a1=0,a2,a=0;
char c1='+',c='+',c2='+';
/*給表達式前面加上"0+"(第一操作數與第一操作符)*/
while((c!='=')&&(c!='\0')&&(c!=ch))
{ proc2(&a,&c); /*讀取第二操作數與第二操作符.*/
while (c=='^' || c=='*' || c=='/')
{ proc2(&a2,&c2); /*讀取第三操作數與第三操作符.*/
switch (c) /*對第二操作符進行運算*/
{ case '*':a=a*a2; break;
case '/':a=a/a2; break;
case '^':a=pow(a,a2);
}
c=c2; /*把第三操作符賦給第二操作符變數*/
}
switch (c1) /*對第一操作符進行運算*/
{ case '+':a1=a1+a;break;
case '-':a1=a1-a;
}
c1=c; /*把第二操作符賦給第一操作符變數*/
}
return(a1); /*返回這部分表達式的值*/
}

int main(void)
{ system("cls");
input_str();
if (s[0]=='\0') return 0;
printf("該表達式的值是: ");
printf("%-8f\n",proc1('\0'));
system("pause");
return 0;
}

熱點內容
scratch少兒編程課程 發布:2025-04-16 17:11:44 瀏覽:639
榮耀x10從哪裡設置密碼 發布:2025-04-16 17:11:43 瀏覽:368
java從入門到精通視頻 發布:2025-04-16 17:11:43 瀏覽:84
php微信介面教程 發布:2025-04-16 17:07:30 瀏覽:310
android實現陰影 發布:2025-04-16 16:50:08 瀏覽:793
粉筆直播課緩存 發布:2025-04-16 16:31:21 瀏覽:343
機頂盒都有什麼配置 發布:2025-04-16 16:24:37 瀏覽:212
編寫手游反編譯都需要學習什麼 發布:2025-04-16 16:19:36 瀏覽:812
proteus編譯文件位置 發布:2025-04-16 16:18:44 瀏覽:366
土壓縮的本質 發布:2025-04-16 16:13:21 瀏覽:592