2、可以自行开发C语言解释器,但是这不是一件轻松的事情,拿来练练手,熟悉一下编译原理和数据结构的基础知识还可以。真开发这样高效的解释器是一件并不轻松的事情。
代码
#include <windows.h>
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) //声明用来处理消息的函数
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow )
{
static TCHAR szAppName[] = TEXT("MyWindow")
HWND hwnd
MSG msg
WNDCLASS wndclass //声明一个窗口类对象
//以下为窗口类对象wndclass的属性
wndclass.style = CS_HREDRAW | CS_VREDRAW //窗口样式
wndclass.lpszClassName = szAppName //窗口类名
wndclass.lpszMenuName = NULL //窗口菜单:无
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH) //窗口背景颜色
wndclass.lpfnWndProc = WndProc //窗口处理函数
wndclass.cbWndExtra = 0 //窗口实例扩展:无
wndclass.cbClsExtra = 0 //窗口类扩展:无
wndclass.hInstance = hInstance //窗口实例句柄
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION ) //窗口最小化图标:使用缺省图标
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW ) //窗口采用箭头光标
if( !RegisterClass( &wndclass ) )
{ //注册窗口类, 如果注册失败弹出错误提示
MessageBox( NULL, TEXT("窗口注册失败!"), TEXT("错误"), MB_OK | MB_ICONERROR )
return 0
}
hwnd = CreateWindow( //创建窗口
szAppName, //窗口类名
TEXT("我的窗口"), //窗口标题
WS_OVERLAPPEDWINDOW, //窗口的风格
CW_USEDEFAULT, //窗口初始显示位置x:使用缺省值
CW_USEDEFAULT, //窗口初始显示位置y:使用缺省值
CW_USEDEFAULT, //窗口的宽度:使用缺省值
CW_USEDEFAULT, //窗口的高度:使用缺省值
NULL, //父窗口:无
NULL, //子菜单:无
hInstance, //该窗口应用程序的实例句柄
NULL //
)
ShowWindow( hwnd, iCmdShow ) //显示窗口
UpdateWindow( hwnd ) //更新窗口
while( GetMessage( &msg, NULL, 0, 0 ) ) //从消息队列中获取消息
{
TranslateMessage( &msg ) //将虚拟键消息转换为字符消息
DispatchMessage( &msg ) //分发到回调函数(过程函数)
}
return msg.wParam
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
HDC hdc //设备环境句柄
PAINTSTRUCT ps //绘制结构
RECT rect //矩形结构
switch( message ) //处理得到的消息
{
case WM_CREATE: //窗口创建完成时发来的消息
MessageBox( hwnd, TEXT("窗口已创建完成!"), TEXT("我的窗口"), MB_OK | MB_ICONINFORMATION )
return 0
case WM_PAINT: //处理窗口区域无效时发来的消息
hdc = BeginPaint( hwnd, &ps )
GetClientRect( hwnd, &rect )
DrawText( hdc, TEXT( "Hello, 卫班科技!" ), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER )
EndPaint( hwnd, &ps )
return 0
case WM_LBUTTONDOWN: //处理鼠标左键被按下的消息
MessageBox( hwnd, TEXT("鼠标左键被按下。"), TEXT("单击"), MB_OK | MB_ICONINFORMATION )
return 0
case WM_DESTROY: //处理窗口关闭时的消息
MessageBox( hwnd, TEXT("关闭程序!"), TEXT("结束"), MB_OK | MB_ICONINFORMATION )
PostQuitMessage( 0 )
return 0
}
return DefWindowProc( hwnd, message, wParam, lParam ) //DefWindowProc处理我们自定义的消息处理函数没有处理到的消息
}
哈哈,这是我们课程设计的题,刚做不久,直接导入TC即可运行。只是恐怕不能显示中文,我们做时要下个CCDOS,并再安全模式下运行才能显示中文。#include "stdlib.h"
#include "string.h"
#include "stdio.h"
#define NULL 0
#define Q 10
#define LEN sizeof(struct student)
struct student
{char name[Q]
char sex[Q]
long id
int score[4]
int total
int m_c
struct student *next
}
int n
char ch[Q]
struct student *creat()
{int i
struct student *head,*p1,*p2
p1=p2=(struct student *)malloc(LEN)
n=0
printf("请输入学生考试信息!\n")
printf("请在姓名处键以\"!\"结束输入。\n")
printf("姓名:")
scanf("%s",ch)
head=NULL
while (strcmp(ch,"!")!=0)
{p1=(struct student *)malloc(LEN)
strcpy(p1->name,ch)
printf("性别:")
scanf("%s",p1->sex)
printf("准考证号(8位):")
scanf("%ld",&p1->id)
printf("数学成绩:")
scanf("%d",&p1->score[0])
printf("物理成绩:")
scanf("%d",&p1->score[1])
printf("英语成绩:")
scanf("%d",&p1->score[2])
printf("C语言成绩:")
scanf("%d",&p1->score[3])
p1->total=p1->score[0]+p1->score[1]+p1->score[2]+p1->score[3]
if(n==0)head=p1
else p2->next=p1
p2=p1
n++
printf("姓名:")
scanf("%s",ch)
}
p2->next=NULL
return (head)
}
void output(struct student *head)
{struct student *p
printf("-----------------------------------------------------------------------\n")
printf(" *学生考试成绩信息表*\n")
printf("-----------------------------------------------------------------------\n")
printf("准考证号 姓 名 性别 数学 物理 英语 C语言 平均分 总分\n")
printf("-----------------------------------------------------------------------\n")
p=head
if(head!=NULL)
do{printf("%8ld %6s %4s %2d %2d %2d %2d %-.2f %3d\n",p->id,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->score[3],p->total/4.0,p->total)
printf("-----------------------------------------------------------------------\n")
p=p->next
}while(p!=NULL)
}
count(struct student *head)
{if(head==NULL)return(0)
else return(1+count(head->next))
}
struct student *insert(struct student*head)
{struct student *p1,*p2,*p3
printf("请输入修改信息!\n")
p1=(struct student *)malloc(LEN)
printf("准考证号(8位):")
scanf("%ld",&p1->id)
printf("姓名:")
scanf("%s",p1->name)
printf("性别:")
scanf("%s",p1->sex)
printf("数学成绩:")
scanf("%d",&p1->score[0])
printf("物理成绩:")
scanf("%d",&p1->score[1])
printf("英语成绩:")
scanf("%d",&p1->score[2])
printf("C语言成绩:")
scanf("%d",&p1->score[3])
p1->total=p1->score[0]+p1->score[1]+p1->score[2]+p1->score[3]/*计算总分 */
p2=head
if(head==NULL)
{head=p1p1->next=NULL}
else {while((p1->id>p2->id)&&(p2->next!=NULL))
{p3=p2
p2=p2->next}
if(p1->id<=p2->id)
{if(head==p2){p1->next=headhead=p1}
else {p3->next=p1p1->next=p2}
}
else{p2->next=p1p1->next=NULL}
}
n++
return(head)
}
struct student *delete (struct student *head,long int num)
{struct student *p1,*p2
printf("要删除的学生准考证号为:%ld\n",num)
if(head==NULL)
{printf("这是一个空表,没有可删除的学生准考证号!\n")return(head)}
else{p1=head
while(num!=p1->id&&p1->next!=NULL)
{p2=p1p1=p1->next}
if(num==p1->id)
{if(p1==head) head=p1->next
else p2->next=p1->next
printf("删除准考证号为%ld的学生\n",num)
n--}
else printf("没找到准考证号为%ld的学生!\n",num)
return(head)
}
}
struct student *find(struct student *head,long int num)
{struct student *p1
printf("要查找的学生准考证号为:%ld\n",num)
if(head==NULL)
{printf("这是一个空表,没有要查找的学生准考证号!\n")return(head)}
else{p1=head
while(num!=p1->id&&p1->next!=NULL)
{p1=p1->next}
if(num==p1->id)
{ printf("------------------------------------------------------------------------------\n")
printf("准考证号 姓 名 性别 数学 物理 英语 C语言 平均分 总分 名次\n")
printf("------------------------------------------------------------------------------\n")
printf("%8ld %6s %4s %2d %2d %2d %2d %-.2f %3d %-2d\n",p1->id,p1->name,p1->sex,p1->score[0],p1->score[1],p1->score[2],p1->score[3],p1->total/4.0,p1->total,p1->m_c)
printf("------------------------------------------------------------------------------\n")
}
else printf("没找到准考证号为%ld的学生!\n",num)
return(head)
}
}
paixu(struct student *head)
{int i,k,m,j
struct student *p1,*p2,*p[Q]
m=count(head)
if(head==NULL)
{printf("这是一个空表,请先输入考生成绩!\n")}
else {printf("------------------------------------------------------------------------------\n")
printf(" *学 生 考 试 成 绩 统 计 表*\n")
printf("------------------------------------------------------------------------------\n")
printf("准考证号 姓 名 性别 数学 物理 英语 C语言 平均分 总分 名次\n")
printf("------------------------------------------------------------------------------\n")
p1=head
for(k=0k<mk++)
{p[k]=p1p1=p1->next}
for(k=0k<m-1k++)
for(j=k+1j<mj++)
if(p[k]->total<p[j]->total)
{p2=p[k]p[k]=p[j]p[j]=p2}
}
for(i=0i<mi++)
{printf("%8ld %6s %4s %2d %2d %2d %2d %-.2f %3d %-2d\n",p[i]->id,p[i]->name,p[i]->sex,p[i]->score[0],p[i]->score[1],p[i]->score[2],p[i]->score[3],p[i]->total/4.0,p[i]->total,i+1)
printf("------------------------------------------------------------------------------\n")/*78个“-”*/
p[i]->m_c=i+1
}
}
dkarg(struct student *head)
{struct student *p1
int k,m
float arg1=0,arg2=0,arg3=0,arg4=0
m=count(head)
p1=head
for(k=0k<mk++)
{arg1+=p1->score[0]
arg2+=p1->score[1]
arg3+=p1->score[2]
arg4+=p1->score[3]
p1=p1->next}
arg1/=marg2/=marg3/=marg4/=m
printf(" *全班单科成绩平均分*\n")
printf("------------------------------------------------------------------------------\n")
printf("数学平均分:%.2f 物理平均分:%.2f 英语平均分:%.2f C语言平均分:%.2f \n",arg1,arg2,arg3,arg4)
printf("------------------------------------------------------------------------------\n")
}
void main()
{int k
struct student *head
long i
printf("<><><><><><><><><><><><><><>\n")
printf("|学 生 成 绩 系 统 主 菜 单 界 面|\n")
printf("| 1.输入学生成绩 |\n")
printf("| 2.显示学生成绩 |\n")
printf("| 3.修改学生成绩 |\n")
printf("| 4.删除学生成绩 |\n")
printf("| 5.排序学生成绩 |\n")
printf("| 6.查找学生成绩 |\n")
printf("| 7.安全退出系统 |\n")
printf("| ->学生成绩管理程序 设计者:陆晓成<- |\n")
printf("<><><><><><><><><><><><><><>\n")
head=creat()
do{printf("<><><><><><><><><><><><><><>\n")
printf("|学 生 成 绩 系 统 主 菜 单 界 面|\n")
printf("| 1.输入学生成绩 |\n")
printf("| 2.显示学生成绩 |\n")
printf("| 3.修改学生成绩 |\n")
printf("| 4.删除学生成绩 |\n")
printf("| 5.排序学生成绩 |\n")
printf("| 6.查找学生成绩 |\n")
printf("| 7.安全退出系统 |\n")
printf("| ->学生成绩管理程序 设计者:陆晓成<- |\n")
printf("<><><><><><><><><><><><><><>\n")
printf("请输入选择号(1--7):")
scanf("%d",&k)
switch(k)
{ case 1:head=creat()break
case 2:output(head)printf("参加考试的学生人数为:%d人\n",count(head))printf("请按任意键显示主菜单!\n")getch()break
case 3:head=insert(head)output(head)printf("请按任意键显示主菜单!\n")getch()break
case 4:printf("请输入要删除的准考证号(8位):")scanf("%ld",&i)head=delete(head,i)output(head)printf("请按任意键显示主菜单!\n")getch()break
case 5:paixu(head)dkarg(head)printf("参加考试的学生人数为:%d人\n",count(head))printf("请按任意键显示主菜单!\n")getch()break
case 6:printf("请输入要查找的准考证号(8位):")scanf("%ld",&i)head=find(head,i)printf("请按任意键显示主菜单!\n")getch()break
default:break
}
}while(k!=7)
}