如何在c语言字符界面中,直接把输入的语句变成命令来执行

Python016

如何在c语言字符界面中,直接把输入的语句变成命令来执行,第1张

1、可以自己搜索下载个C语言解释器,C语言本身是一种编译语言,需要编译器、链接器共同工作,换句话说,实际上C语言就是C语言编译器的功能,如果用户开发一种解释器能实现C语言的自身的功能,也可以将C语言当成一种解释语言。

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)

}