计算机程序运行原理

计算机程序运行原理,第1张

计算机程序运行原理:计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑 *** 作等加工,然后再按地咐银尘址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成衡禅规定 *** 作。

依此进行下去。直至遇到停止指令。程序与数据一样存取,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的 *** 作是计算机最基本的工作原理,这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.诺依曼原理。

扩展资料:

计算机程序运行:为了一个程序运行,计算机加载程序代码,可能还要加载数据,从而初始化成一个开始状态,然后调用某种启动机制。在最低层上,这些是由一个引导序列开始的。

在大多数计算机中, *** 作系统例如Windows等,加载并且执行很多程序。在这种情况下,一个计算机程序是指一个单独的可执行的映射,而不是当前在这个计算机上运行的全部程序。

参考资料来源:搏顷百度百科-计算机程序

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

#define MENU_NUM 7

#define N 3

typedef struct s1

{

char no[11]/*学号由10个字符组成*/

char name[15]/*学生姓名*/

float score[N]/*各门课成绩*/

float sum/*总分*/

float average/*平均分*/

int order/*名次*/

struct s1 *next/*指向后继结点的指答困针*/

}STUDENT/*定义结构体类型*/

STUDENT * head=NULL

void InputData( STUDENT * ptr )

void PrintMenu( )

int Menu_Select( )

void Init( )

void create( )

void print( )

void Delete( )

void append()

void computer()

main()

{

int key

while(1) {

key=Menu_Select()

switch(key)

{

case 0: Init()

//初试化链表。也就是若链表不为空则释放链表中乎握所有数据,将head置为空(NULL)

break

case 1: create()

//创建链表,输入数据

break

case 2: Delete()

//删除一个指定学号的记录数据

break

case 3: print()

//打印链表中所有数据

break

case 4: computer()

//计算链表中所有人的总分和平清顷念均分

break

case 5: append()

//追加一个数据到链表的尾部

break

case 6: Init()

//释放链表

exit(0)

}

}

}

void PrintMenu( )

{

int i

char * menu[]={

"0. Init list",

"1. Enter list",

"2. Delete a record from list",

"3. Print list",

"4. Compute the score",

"5. Insert record to list",

"6. Quit"

}

printf("\n\n")

for (i=0i<MENU_NUMi++)

printf("%s\n",menu[i])

printf("\nEnter your choice(0-6):")

}

int Menu_Select( )

{

int key

PrintMenu( )

scanf("%d",&key)

return key

}

void Init( )//初始化单链表。也就是释放链表中的所有数据

{

STUDENT *p,*ptr//定义两个临时指针变量p,ptr

p=headptr=head//将两个临时变量指向头指针head ;

while(ptr!=NULL)

{

ptr=ptr->next//ptr指向下一个结构数据

free(p)//释放p所指向的结构数据的内存

p=ptr//将p指向ptr所指向的数据

}

head=NULL//将head指向NULL

}

void create( )//创建单链表

{

STUDENT *pt, *pth=NULL//定义两个指针变量:pt指向即将申请新的数据内存,pth指向当前数据

while(1)

{

pt=(STUDENT *)malloc(sizeof(STUDENT))//让pt指向新申请的内存空间

InputData(pt)//输入数据,存放到pt所指向的结构数据。注意让pt的next指向NULL

if (strcmp(pt->no,"@")==0)

{

free(pt)//释放pt所指向的内存空间

break//退出循环

}

else if (head==NULL)

{

pth=pt

head=pt//将头指针head和pth指向pt

}

else

{

pth->next=pt//将pth的next指向pt

pth=pt//将pth指向pt

}

}

}

void print( ) //打印单链表中所有数据

{ int i=0

STUDENT *p//第一个指针p

p=head//将p指向head

printf("\n")

printf("******************************STUDENT******************************\n")

printf("|rec|no| name | sc1| sc2| sc3| sum | ave |order|\n")

printf("|---|----------|----------------|----|----|----|------|-----|-----|\n")

//打印表头

while (p!=NULL)

{

printf("|%3d|%10s|%-16s|%4.1f|%4.1f|%4.1f|%6.2f|%5.1f|%5d|\n",

++i,p->no,p->name,p->score[0],p->score[1],p->score[2],

p->sum,p->average,p->order)//打印p所指向的结构中的所有数据。注意打印数据间的分隔线

p=p->next//将p指向p的下一个结构数据

}

printf("********************************END********************************\n")//打印表尾

}

void Delete( ) //删除一个记录

{

STUDENT *p,*pth//定义两个指针p,pth

char no[11]//定义一个整数no(用来存储输入的学号)

printf("intput delete no\n")

scanf("%s",no)//用输入语句输入一个学号存储到no中

p=headpth=head//将p和pth都指向头指针

if (strcmp(p->no,no)==0) //也就是若头指针指向的数据需要删除

{

head=head->next//将head指针指向head的下一个数据;

free(p)//释放p所指向的数据

}

else

{

p=p->next//将p指向p的下一个数据

while ( p!=NULL)

{

if (strcmp(p->no,no)==0) //找到了要删除的数据

{

pth->next=p->next//将pth的next指向p的next

free(p)//释放p

break//退出循环

}

else

{

pth=pth->next//将pth指向pth的next 或 将pth指向p

p=p->next//将p指向p的next

}

}

}

}

void append()

{

STUDENT *p,*pth//定义两个指针变量p,pth

pth=head//将pth指向head

while ( pth->next!=NULL)

{

pth=pth->next//ptr指向ptr的next

}

p=(STUDENT *)malloc(sizeof(STUDENT))//将p指向新申请的内存空间

InputData(p)p->next=NULL//数据数据存储到p所指向的内存空间,注意将p的next置为NULL

pth->next=p//将ptr的next指向p

}

void InputData( STUDENT *ptr )

{ int i

printf("enter no:")

scanf("%s",ptr->no)

if (strcmp(ptr->no,"@")==0 ) return

printf("enter name:")

scanf("%s",ptr->name)

for(i=0i<3i++)

{

printf("shuru chengji\n")

scanf("%f",&ptr->score[i])

}

ptr->sum=0

ptr->average=0

ptr->order=0

ptr->next=NULL

}

void computer()

{

STUDENT *p

p=head

for(pp=p->next)

{

p->sum=p->score[0]+p->score[1]+p->score[2]

p->average=(p->score[0]+p->score[1]+p->score[2])/3

}

}

是不是C课程设计的题目啊? 呵呵 我这有个希望你能用到。已经证实可以执行。

#include <time.h>

#include <stdio.h> /* 调用库函数 */

#include <stdlib.h> /* 调用库函数 */

int le1 /* 变量 表示第一个运算数 */

int le2 /* 第二个运算数 */

int Tresult /* 正确答型橘案 */

int Qcount /* 题目的个数 */

int Upnum /* 升级的分数 */

int Tscore /* 当前得分 */

char op /* 运算符号 */

void TestTen()

void TestHun()

void TestTen() /* 出第一个级别题的函数*/

{

int Userda /* 用户给出的答案 */

int temp /* 临时变量,用于交换两个变量得值 */

int i=0

srand( (unsigned)time( NULL ) )

op=rand()%3+1 /* 产生一个1-4之间的随机数,用于表示+ ,- , * , / */

switch(op) /* 判断运算符是什么 */

{

case 1:/* 加 的情况 */

{

le1=rand()%9+1/* 产生一个0-9之间的随机数 放在第一个运算数 Tha中 */

le2=rand()%9+1 /* 产生一个0-9之间的随机数 放在第二个运算数 Thb中 */

Tresult=le1+le2/* 计算出正确答案 放在 Tresult中*/

break

}

case 2:/* 减 的情况 */

{

le1=rand()%9+1

le2=rand()%9+1

if(le1<le2) /* 减不能的负 所以第一个运算数要比第二个大,如果小,则交换两变量的值 */

{

temp=le1

le1=le2

le2=temp

}/* 交换 */

Tresult=le1-le2 /* 计算出正确答案 放在 Tresult中毁备*/纤租毁

break

}

case 3: /* 乘 的情况 */

{

le1=rand()%9+1

le2=rand()%9+1

Tresult=le1*le2

break

}

case 4:/* 除 的情况*/

{

do /* 循环 保证可以除尽 */

{

do/* 循环保证 除数不为 0 */

{

le1=rand()%9+1

le2=rand()%9+1

if(le1<le2)

{

temp=le1

le1=le2

le2=temp

}

}

while(le2==0) /* 当除数0 的时候继续产生新的随机数 */

}

while((le1%le2)!=0)/* 当不能整除的时候继续产生新的随机数 */

Tresult=le1/le2

break

}

}

switch(op)/* 根据 op的值决定输出 问题*/

{

case 1: {printf("\n%d + %d = ",le1,le2)break}

case 2: {printf("\n%d - %d = ",le1,le2)break}

case 3: {printf("\n%d X %d = ",le1,le2)break}

case 4: {printf("\n%d / %d = ",le1,le2)}

}

scanf("%d",&Userda)/* 用户输入答案 */

while(Userda!=Tresult)/*判断答案是否正确 */

{ i=i+1

printf("\n错误,你的得分为: %d",Tscore) /* 输出错误信息和 当前分数*/

printf("\n 请重新输入: ")/*提示重新输入 */

scanf("%d",&Userda) /* 用户输入答案 */

}

if(i==0)

Tscore=Tscore+10/* 首次答对了 加分 */

printf("\n正确,你的得分为: %d",Tscore) /* */

}

void TestHun() /*出第二个级别题的函数*/

{

int Userda

int temp

op=rand()%3+1

switch (op)

{

case 1:

{

le1=rand()%99+1 /* 产生 10-99 之间的随机数,即两位数 */

le2=rand()%99+1

Tresult=le1+le2

break

}

case 2:

{

le1=rand()%99+1

le2=rand()%99+1

if(le1<le2)

{temp=le1le1=le2le2=temp}

Tresult=le1-le2

break

}

case 3:

{

le1=rand()%99+1

le2=rand()%99+1

Tresult=le1*le2

break

}

case 4:

{

do

{

do

{

le1=rand()%99+1

le2=rand()%99+1

if(le1<le2)

{temp=le1le1=le2le2=temp}

}

while (le2==0)

}

while ((le1%le2)!=0)

Tresult=le1/le2

break

}

}

switch(op)

{

case 1: {printf("\n%d + %d = ",le1,le2)break}

case 2: {printf("\n%d - %d = ",le1,le2)break}

case 3: {printf("\n%d X %d = ",le1,le2)break}

case 4: {printf("\n%d / %d = ",le1,le2)}

}

scanf("%d",&Userda)

while(Userda!=Tresult)

{

if(Tscore>=10)

Tscore=Tscore-10

printf("\n错误,你的得分为: %d",Tscore)

if(Tscore<Upnum) /* 如果分数小于设定的分数则直接推出函数 */

return

printf("\n请重新输入: ")

scanf("%d",&Userda)

}

Tscore=Tscore+10

printf("\n正确,你的得分为: %d",Tscore)

}

void main()

{

int Leiji=0 /* 变量 , 存储 累计答题数目 */

rand()

system("cls") /* 清屏 : 清除屏幕上上次运行的内容,重新开始运行程序*/

system("cls")

printf("\n ------------------欢迎来到小学算术测试系统----------------")

printf("\nTEST START(测试开始):-------------------------------------")

printf("\n 请输入问题个数: ")/* 提示信息 :输入问题个数*/

scanf("%d",&Qcount)/* 用户输入问题个数 */

do

{

printf("\n 请输入升级所需分数(每小题十分) : ")

/* 提示信息 :输入升级分数(10的倍数 ) */

/* 用户输入升级分数*/

scanf("%d",&Upnum)

if(Upnum>=10*Qcount)

printf("\n 请重新输入:")

else

if(Upnum<6*Qcount) /* 如果用户输入的升级分数<10 */

printf("\n 请重新输入:")

else

if(Upnum%10!=0) /* 如果用户输入的升级分数不是10的倍数 :即 整除10 不等于0 */

printf("\n 必须输入十的倍数!")/* */

else

break

}

while(1) /* 不满足条件永远循环 */

printf("\n--------------------------------------------------------")

printf("\n--------------------------------------------------------")

printf("\nTest Start(测试开始):") printf("(注:每小题十分)")

printf("\n--------------------------------------------------------")

printf("\n----------------------------------")

printf("\n Lever 1 Start :")

Begin1:

printf("\n----------------------")

printf("\n Question: %d",Leiji+1) /* 输出 题号*/

TestTen()

Leiji++

if(Leiji==Qcount) /* 如果做题个数 和 事先设定好的问题个数相同 则结束答题! */

{ printf("\n--------------------------------------------------------")

printf("\n--------------------------------------------------------\n")

printf("\n Test Over!!!\n")

printf("\n--------------------------------------------------------")

printf("\n Your Final Score: %d",Tscore)

if(Tscore>=Upnum)

printf("\n Your Final Level: LEVEL 2")

else

{printf("\n Your Final Level: LEVEL 1")

Leiji=0Tscore=0goto Begin1}

goto LastLine

}

if(Tscore<Upnum) /* 分数 小于 升级分数 */

goto Begin1/* 转向到 Begin1 继续作题 */

printf("\n Up To Advance Level!\n Lever2 Start :---------")/* 达到升级分数 升级到 Level2 */

Leiji=0

Begin2:

printf("\n----------------------")

printf("\n Question: %d",Leiji+1)

TestHun()

Leiji++

if(Leiji==Qcount)

{

printf("\n--------------------------------------------------------")

printf("\n--------------------------------------------------------\n")

printf("\n Test Over!!!\n")

printf("\n--------------------------------------------------------")

printf("\n Your Final Score: %d",Tscore)

if(Tscore>=Upnum)

printf("\n Your Final Level: LEVEL 2")

else

printf("\n Your Final Level: LEVEL 1")

goto LastLine

}

if(Tscore<Upnum)

{

printf("\nDown To Normal Level! Lever1 : -------")/* 从Level2答题过程中分数小于升级分数 降级到Level 1 继续答题 */

Leiji=0

goto Begin1}

else

goto Begin2

LastLine:

printf("\n------------------------------------------------")

getchar()getchar() /* 等待用户输入回车结束程序运行 */

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8198867.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存