023 数组的应用

/****************************023 数组的应用*****************
 * 一个简易的学生成绩查询系统 
 * C语言精彩编程百例 23 */

#include<stdio.h>
#include<stdlib.h>
void main ()
{
	int select;
	int i,j;
	int score[5][7]={};

	int average =0;
	int sum=0;

	do
	{
		printf("本程序有4项功能: \n");
		printf("1.根据学号查询学生成绩\n");
		printf("2.根据考试号统计成绩\n");
		printf("3.根据考试号和学号查询成绩\n");
		printf("4.成绩录入\n");
		printf("0.退出\n");
		printf("请输入选择(0-4):");
		scanf("%d",&select);
		switch(select)
		{
			case 0:
				printf("ok\n");
				exit(0);
				break;
			case 1:
				printf("输入学号:");
				scanf("%d\n",&i);
				for(j=1;j<7;j++)
				{
					printf("第%d科成绩是%d\n",j,score[i][j]);
					sum+=score[i][j];
				}
				average=sum/6;
				printf("学生的平均成绩是%d\n",average);
				break;
			case 2:
				printf("输入考试号:");
				scanf("%d\n",&j);
				for(i=1;i<5;i++)
				{
					printf("第%d号学生本科成绩是%d\n",i,score[i][j]);
					sum+=score[i][j];
				}
				average=sum/4;
				printf("本科平均成绩是%d\n",average);
				break;
			case 3:
				printf("输入学号和考试号:");
				scanf("%d %d\n",&i,&j);
				printf("第%d号学生的第%d科考试成绩是%d\n",i,j,score[i][j]);
				break;
			case 4:
				printf("请输入成绩\n");	
				for(i=1;i<5;i++)
					for(j=1;j<7;j++)
						scanf("%d\n",&score[i][j]);
				break;
			default :
				break;
		}
	}while(1);
}	

 

	.file	"023.c"
	.def	___main;	.scl	2;	.type	32;	.endef
	.text
LC0:
	.ascii "\261\276\263\314\320\362\323\320"
	.ascii "4\317\356\271\246\304\334\243\272 \12\0"
LC1:
	.ascii "1.\270\371\276\335\321\247\272\305\262\351\321\257\321\247\311\372\263\311\274\250\12\0"
LC2:
	.ascii "2.\270\371\276\335\277\274\312\324\272\305\315\263\274\306\263\311\274\250\12\0"
LC3:
	.ascii "3.\270\371\276\335\277\274\312\324\272\305\272\315\321\247\272\305\262\351\321\257\263\311\274\250\12\0"
LC4:
	.ascii "4.\263\311\274\250\302\274\310\353\12\0"
LC5:
	.ascii "0.\315\313\263\366\12\0"
LC6:
	.ascii "\307\353\312\344\310\353\321\241\324\361\243\250"
	.ascii "0-4\243\251\243\272\0"
LC7:
	.ascii "%d\0"
LC8:
	.ascii "ok\12\0"
LC9:
	.ascii "\312\344\310\353\321\247\272\305\243\272\0"
LC10:
	.ascii "%d\0"
LC11:
	.ascii "\265\332%d\277\306\263\311\274\250\312\307%d\12\0"
LC12:
	.ascii "\321\247\311\372\265\304\306\275\276\371\263\311\274\250\312\307%d\12\0"
LC13:
	.ascii "\312\344\310\353\277\274\312\324\272\305\243\272\0"
LC14:
	.ascii "\265\332%d\272\305\321\247\311\372\261\276\277\306\263\311\274\250\312\307%d\12\0"
LC15:
	.ascii "\261\276\277\306\306\275\276\371\263\311\274\250\312\307%d\12\0"
LC16:
	.ascii "\312\344\310\353\321\247\272\305\272\315\277\274\312\324\272\305\243\272\0"
LC17:
	.ascii "%d %d\12\0"
	.align 32
LC18:
	.ascii "\265\332%d\272\305\321\247\311\372\265\304\265\332%d\277\306\277\274\312\324\263\311\274\250\312\307%d\12\0"
LC19:
	.ascii "\307\353\312\344\310\353\263\311\274\250\12\0"
	.align 2
.globl _main
	.def	_main;	.scl	2;	.type	32;	.endef
_main:
	pushl	%ebp
	movl	%esp, %ebp
	pushl	%edi
	subl	$180, %esp
	andl	$-16, %esp
	movl	$0, %eax
	movl	%eax, -180(%ebp)
	movl	-180(%ebp), %eax
	call	__alloca
	call	___main
	leal	-168(%ebp), %edi	# edi=score
	cld				# 设标志位
	movl	$0, %edx		# edx =0
	movl	$35, %eax		# 
	movl	%eax, %ecx		# ecx =35 Rep次数
	movl	%edx, %eax		# eax =0
	rep
	stosl
	movl	$0, -172(%ebp)		# average = 0
	movl	$0, -176(%ebp)		# sum =0
L15:
	subl	$12, %esp
	pushl	$LC0
	call	_printf
	addl	$16, %esp
	subl	$12, %esp
	pushl	$LC1
	call	_printf
	addl	$16, %esp
	subl	$12, %esp
	pushl	$LC2
	call	_printf
	addl	$16, %esp
	subl	$12, %esp
	pushl	$LC3
	call	_printf
	addl	$16, %esp
	subl	$12, %esp
	pushl	$LC4
	call	_printf
	addl	$16, %esp
	subl	$12, %esp
	pushl	$LC5
	call	_printf
	addl	$16, %esp
	subl	$12, %esp
	pushl	$LC6
	call	_printf
	addl	$16, %esp
	subl	$8, %esp
	leal	-12(%ebp), %eax	# select
	pushl	%eax
	pushl	$LC7
	call	_scanf
	addl	$16, %esp
	cmpl	$4, -12(%ebp)	# if select>4 ? 这是default? 
	ja	L15		# break  
	movl	-12(%ebp), %eax # eax = select
	sall	$2, %eax        # eax=select*4
	movl	L42(%eax), %eax # eax=L42+select*4
	jmp	*%eax		# 
	.p2align 2
	.align 4
L42:
	.long	L19
	.long	L20
	.long	L25
	.long	L31
	.long	L32
L19:				#case 0
	subl	$12, %esp	# printf("ok\n");
	pushl	$LC8
	call	_printf
	addl	$16, %esp
	subl	$12, %esp       #exit(0); 后面的 break被优化掉了,没必要存在
	pushl	$0
	call	_exit
L20:				#case 1
	subl	$12, %esp	#printf("输入学号:");
	pushl	$LC9
	call	_printf
	addl	$16, %esp
	subl	$8, %esp	#scanf("%d\n",&i);
	leal	-16(%ebp), %eax	# eax =&i
	pushl	%eax		# &i
	pushl	$LC10		# "%d\0"   参数是从后往前装的,使用估计是按参数表顺序使用? 
	call	_scanf
	addl	$16, %esp
	movl	$1, -20(%ebp)	# j=1
L21:				
	cmpl	$6, -20(%ebp)   # j<=6
	jle	L24
	jmp	L22
L24:
	subl	$4, %esp	# 函数调用前,栈空间调整
	movl	-16(%ebp), %edx	# edx = i
	movl	%edx, %eax	# eax = i
	sall	$3, %eax	# eax =i*8
	subl	%edx, %eax	# eax=i*7
	addl	-20(%ebp), %eax # eax=i*7+j
	pushl	-168(%ebp,%eax,4) #  -168(%ebp,%eax,4)=score+(i*7+j)*4=score[i][j]
	pushl	-20(%ebp)	# j
	pushl	$LC11		# "第%d科成绩是%d\n"
	call	_printf
	addl	$16, %esp	# 平衡堆栈
	movl	-16(%ebp), %edx # i
	movl	%edx, %eax	# eax=i
	sall	$3, %eax	# eax =i*8
	subl	%edx, %eax	# eax=i*7
	addl	-20(%ebp), %eax # eax=i*7+j
	movl	-168(%ebp,%eax,4), %edx #  edx=score[i][j]
	leal	-176(%ebp), %eax# eax=&sum
	addl	%edx, (%eax)	# &sum+=edx
	leal	-20(%ebp), %eax # eax= &j
	incl	(%eax)		# j++
	jmp	L21
L22:
	movl	$715827883, %eax # eax = 幻数715827883
	imull	-176(%ebp)	 # edx:eax = 715827883*sum
	movl	%edx, %ecx	 # ecx=715827883*sum/(2^32)=sum/5.99999999720603
	movl	-176(%ebp), %eax # eax=sum 
	sarl	$31, %eax        # eax=sum的符号
	subl	%eax, %ecx	 # ecx=sum/6-(sum的符号) 趋零取整 
	movl	%ecx, %eax	 # 
	movl	%eax, -172(%ebp) # average=sum/6
	subl	$8, %esp
	pushl	-172(%ebp)
	pushl	$LC12		 # printf("学生的平均成绩是%d\n",average);
	call	_printf
	addl	$16, %esp
	jmp	L15
L25:				# case 2
	subl	$12, %esp	# printf("输入考试号:"); 
	pushl	$LC13		
	call	_printf
	addl	$16, %esp       
	subl	$8, %esp	# scanf("%d\n",&i);
	leal	-20(%ebp), %eax # &j
	pushl	%eax
	pushl	$LC10
	call	_scanf
	addl	$16, %esp
	movl	$1, -16(%ebp)	#i=1
L26:
	cmpl	$4, -16(%ebp) 	#i<5 
	jle	L29
	jmp	L27
L29:
	subl	$4, %esp
	movl	-16(%ebp), %edx	# edx=i
	movl	%edx, %eax	# eax=i
	sall	$3, %eax	# eax=i*8
	subl	%edx, %eax	# eax=i*7
	addl	-20(%ebp), %eax	# eax=i*7+j
	pushl	-168(%ebp,%eax,4) # score[i][j]
	pushl	-16(%ebp)	# i
	pushl	$LC14		# "第%d号学生本科成绩是%d\n"
	call	_printf
	addl	$16, %esp
	movl	-16(%ebp), %edx
	movl	%edx, %eax
	sall	$3, %eax
	subl	%edx, %eax
	addl	-20(%ebp), %eax
	movl	-168(%ebp,%eax,4), %edx # edx=score[i][j]
	leal	-176(%ebp), %eax      	# eax=&sum
	addl	%edx, (%eax)		# sum+= score[i][j]
	leal	-16(%ebp), %eax		# &i
	incl	(%eax)			# i++
	jmp	L26
L27:
	movl	-176(%ebp), %eax	# eax=sum
	movl	%eax, -184(%ebp)	# ??=sum //从哪来了一个临时变量? 
	cmpl	$0, -184(%ebp)		# if average>=0
	jns	L30                     # jmp
	addl	$3, -184(%ebp)          # ?? += 3
L30:
	movl	-184(%ebp), %eax        # eax=??
	sarl	$2, %eax		# eax=eax/4
	movl	%eax, -172(%ebp)	# average=eax
	subl	$8, %esp		# 为printf("本科平均成绩是%d\n",average)调整堆栈
	pushl	-172(%ebp)		# average
	pushl	$LC15                   # "本科平均成绩是%d\n",
	call	_printf
	addl	$16, %esp		# 平衡堆栈
	jmp	L15
L31:				# case 3
	subl	$12, %esp		# printf("输入学号和考试号:");
	pushl	$LC16
	call	_printf
	addl	$16, %esp
	subl	$4, %esp		# scanf("%d %d\n",&i,&j);
	leal	-20(%ebp), %eax
	pushl	%eax
	leal	-16(%ebp), %eax
	pushl	%eax
	pushl	$LC17
	call	_scanf
	addl	$16, %esp
	movl	-16(%ebp), %edx		# edx=i
	movl	%edx, %eax
	sall	$3, %eax
	subl	%edx, %eax		# eax = i*7
	addl	-20(%ebp), %eax 	# eax = i*7+j
	pushl	-168(%ebp,%eax,4)	# score[i][j]
	pushl	-20(%ebp)		# j
	pushl	-16(%ebp)		# i
	pushl	$LC18
	call	_printf
	addl	$16, %esp
	jmp	L15			# break
L32:				# case 4
	subl	$12, %esp       # printf("请输入成绩\n");
	pushl	$LC19
	call	_printf
	addl	$16, %esp
	movl	$1, -16(%ebp)   # i=1
L33:
	cmpl	$4, -16(%ebp)	# i<5
	jle	L36
	jmp	L15
L36:
	movl	$1, -20(%ebp)   # j<15
L37:
	cmpl	$6, -20(%ebp)	# j<7
	jle	L40
	jmp	L35
L40:
	subl	$8, %esp	# scanf("%d\n",&score[i][j]);
	movl	-16(%ebp), %edx # edx=i
	movl	%edx, %eax
	sall	$3, %eax
	subl	%edx, %eax
	addl	-20(%ebp), %eax  # eax=i*7+j
	leal	0(,%eax,4), %edx # edx=(i*7+j)*4
	leal	-168(%ebp), %eax # eax=score 
	leal	(%eax,%edx), %eax # eax=score+(i*7+j)*4
	pushl	%eax
	pushl	$LC10
	call	_scanf
	addl	$16, %esp
	leal	-20(%ebp), %eax # eax=&j
	incl	(%eax)		# j++
	jmp	L37		
L35:
	leal	-16(%ebp), %eax # eax =& i
	incl	(%eax)		# i++
	jmp	L33
	.def	_exit;	.scl	2;	.type	32;	.endef
	.def	_scanf;	.scl	2;	.type	32;	.endef
	.def	_printf;	.scl	2;	.type	32;	.endef



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值