成都信息工程大学807程序综合设计答案解析

本人水平有限,代码中难免存在疏漏、欠妥甚至有误之处,恳求读者批评指正,在此表示感谢,祝考研顺利!

2015年807程序综合设计答案解析

待更新…

2016年807程序综合设计答案解析

待更新…

2017年807程序综合设计答案解析

待更新…

2018年807程序综合设计答案解析

一、选择题
1 - 5 BCADA
6 -10 DBCCB

第1题: ||为逻辑或,只要有一个操作数为真则表达式的值为真;在C语言中非0值即为真。所以结果为1
第2题: 指针存的就是地址
第3题:obj是源程序经过编译程序编译而生成的文件即目标文件,exe文件是obj文件进过连接程序连接后生成的可执行文件。cpp文件是C++的源程序文件
第4题: 有没有赋值过可以理解为有没有执行过 a=b这种语句过,x*=y就是x = x*y,x++在这就可以理解为 x+=1,x+y并没有执行a=b所以并不具备赋值功能
第5题: 在C语言中要调用的函数必须先声明再使用,所以并非必须在main中定义也可在main前面声明,在main后定义;或者在main前定义声明
第6题:三个表达式都可以省略,不过省略之后的表达式相当于while(1){}
第7题:s1==s2比较的是两字符串首地址,strlen是计算字符串长度的函数,strcmp是比较字符传大小的函数,strcat是连接两个字符串的函数。
二、判断题
11-15 FTTFT
16-20 FFFFF
第11题: C语言中一条完整的语句是以分号结尾的所以说分号也是语句的一部分。
第14题: 正确的语法: char a[10];
第16题: p=a
第17题:返回值为void的函数不需要return语句
第18题: 待考证,笔者认为是先执行外层循环,再执行内层循环
第19题:一个指针变量只能指向声明时指定的类型
第20题:if(E) 与 if( E !=0 )等价
三、编程题
第24题:
在这里插入图片描述

#include<stdio.h>
#define SIZE 9

void Display()
{
	int i,j;
	for (i = 1; i <= SIZE; i++)
	{
		for(j = 1; j <= i; j++)
			printf("%d*%d=%d \t",i,j,i*j);
		printf("\n");
	}
}

int main()
{
	Display();
	return 0;
}

第25题

从键盘输入100个人的姓名、性别和年龄,分别统计0-29岁、30-59岁、60以上的男、女人数。

#include<stdio.h>
#include<string.h>
#define NUM 100
struct people {
	char name[16];
	char gender[8];
	int age;
}peoples[NUM];
struct list{
	int m_29;
	int w_29;
	
	int m_59;
	int w_59;
	
	int m_infinity;
	int w_infinity;
	
}count;
void Input()
{
	printf("输入100个人的信息,格式为:Lasting M 18\n");
	
	for (int i = 0; i < NUM; i++) 
	{
		printf("请输入第%d个人的信息:",i+1);
		scanf("%s %s %d", &(peoples[i].name), &(peoples[i].gender), &(peoples[i].age));
	} 
}

void Count()
{
	for (int i = 0; i < NUM; i++) {
		if (peoples[i].age>=0 && peoples[i].age<=29) {
			if (!strcmp(peoples[i].gender,"W")) {
				count.w_29++;
			}
			else
				count.m_29++;
		}
		if (peoples[i].age >= 30 && peoples[i].age <= 59) {
			if (!strcmp(peoples[i].gender, "W")) {
				count.w_59++;
			}
			else
				count.m_59++;
		}
		if (peoples[i].age >= 60) {
			if (!strcmp(peoples[i].gender, "W")) {
				count.w_infinity++;
			}
			else
				count.m_infinity++;
		}
	}
}
void Display()
{
	printf("0-29岁:\n\t女人有:%d位\t男人 %d\n", count.w_29, count.m_29);
	printf("30-59岁:\n\t女人有:%d位\t男人 %d\n", count.w_59, count.m_59);
	printf("60岁以上:\n\t女人有:%d位\t男人 %d\n", count.w_infinity, count.m_infinity);
}
int main() {
	Input();
	Count();
	Display();
}

第26题

从键盘上输入字符串1,将字符串1中除去数字字符’0’ - ‘9’ 之后的其它字符保留在字符串2中,并输出字符串2。

#include<stdio.h>
void Display(char *str)
{
	printf("字符串str2为:\n");
	puts(str);
	printf("\n"); 
}
void Dislodge(char *str1,char *str2)
{
	char* p;
	int length = 0;
	for(p=str1;*p!='\0';p++)
	{
		if(*p>='0' && *p<='9')
		continue;
		str2[length++]=*p;
	}
}
void Input(char *str)
{
	printf("请输入字符串:\n"); 
	scanf("%s",str);
}
int main() {
	char str1[32];
	char str2[32];
	Input(str1);
	Dislodge(str1,str2);
	Display(str2);
}

2019年807程序综合设计答案解析

一、选择题
1 - 5 CDACB
6 -10 CADAB

第6题:A语法错误,首先scanf需要的是地址,而BD传的参数都是具体数值所以选C,再者指针运算符的优先级比算数运算符优先级高,所以a+2后先和指针运算符*结合得到a[2][0]的地址再和+结合加1。

第7题:优先级问题,[]和()的优先级最高,而指针运算符的优先级次之优先级为2,
A为指向含4个元素的bai一维整形数组的指针变量(是指针)
B为定义指针数组p,它由4个指向整型数据的指针元素组成(是数组)
C为B类型的指针
D为整型数组

二、判断题
11-15 TFFTF
16-20 FTFFF

第20题:定义了结构体只是说在计算机中有这种组织形式,但是并没有创建变量,因此并不会分配存储空间

三、编程题

成都信息工程大学2019年807程序综合设计

第24题:

请编写函数fun,函数的功能是求出二维数组 a周边元素之和,作为函数值返回。例如:若二维数组如下;
1 3 5 7 9
2 9 9 9 4
6 9 9 9 8
1 3 5 7 0
则函数返回值为61。在主函数中赋予二维数组(大小为M*N,M、N由符号常量确定)值,调用fun函数进行计算,并输出计算结果。要求自行设计 fun 函数,在主函数中,输入、输出时,应显示适当提示信息。

程序实现

  1. 先引入头文件

    #include<stdio.h>
    
  2. 再定义符号常量

    符号常量的定义方式:

    #define 符号常量 值

    示例: #define sum 10

    #define M 4
    #define N 5
    
  3. 声明fun函数

    如果要先实现main函数就必须先声明fun函数的原型,这里我们先实现main函数,所以需要先声明fun函数的原型

    一个函数如果要在main函数中使用必须在此之前被声明过或者定义过

    int fun(int arr[][N]);
    
  4. 实现main函数

    int main(){
    	int arr[M][N];
        int i,j;
        //先实现对二维数组的赋值
        for(i = 0; i<M; i++)
            for(j = 0; j<N; j++){
                printf("请输入arr[%d][%d]:",i,j);
                scanf("%d",&arr[i][j]);
            }
        //再调用fun函数输出数组arr周边之和
        printf("该数组周边之和为:%d",fun(&arr[0][0]));
        return 0;
    }
    
  5. 实现fun函数

    int fun(int arr[][N]){
    	int i,j; 
    	int sum = 0;
        for(i = 0; i<M; i++){
        	if(i==0||i==M-1){
        		for(j=0;j<N;j++){
        			sum+=arr[i][j];
    			}
    		}else{
    			sum = sum + arr[i][0] + arr[i][N-1];
    		}
    	}
    	return sum;
    }
    

程序思想

首先在主函数中定义一个二位数组通过双重循环的方式对其赋值,赋值之后通过调用fun函数计算二维数组的值。

在fun函数中定义一个sum变量用以存储数组周边之和,也是通过双重循环遍历数组,在第一重循环中,遍历每一个一维数组,如果是第一行和最后一行便将该数组所有的数加到sum变量中否则只加该数组的第一个和最后一个。

程序流程图

在这里插入图片描述

25题:

学生的记录由学号、数学和C语言成绩(用整数表示)组成,输入N名学生的数据(N值由符号常量确定),统计C语言分数最高的学生的人数(注意:分数最高的学生可能不只一个),并输出C语言分数最高的学生人数及其各项数据。要求输入、输出时,应显示适当的提示信息。

程序设计思想:

遍历每个人的C语言成绩,如果大于当前记录的最高分(maxScore),则将最高分记录为当前同学的分数,把该同学的学号记录到最高分数编号数组(maxArr)中,最后将最高分人数(count)记录为1;如果等于当前记录的最高分(maxScore),则将最高分人数自增1;如果小于则不作处理。

#include<stdio.h>
#define N 5
int maxArr[N] = {-1};
struct student{
	int id;
	int math;
	int C;

}students[N];
void Input()
{
	int i;
	printf("请输入学生信息,例如:1 89 98。\n");
	for(i = 0; i<N; i++)
	{
		printf("第%d个学生的信息:",i+1);
		scanf("%d%d%d",&students[i].id,&students[i].math,&students[i].C);
	}
}

void Display(student stu)
{
	printf("学号:%d,数学:%d, C语言:%d \n",stu.id,stu.math,stu.C);
}
int FindMax()
{
	int count = 0;
	int i;
	int j;
	int maxScore = -1;
	for(i = 0; i < N; i++)
	{
		if(students[i].C>maxScore)
		{
			maxScore = students[i].C;
			j = 0;
			maxArr[j++] = i;
			count=1; 
			continue;
		}
		if(students[i].C == maxScore)
		{
			maxArr[j++]=i;
			count++;
		}
	}
	return count;
}
int main()
{
	int count;
	int i;
	Input();
	count = FindMax();
	printf("最高分有%d人,他们的信息为:\n",count);
	for(i = 0; i<count ;i++)
	{
		Display(students[maxArr[i]]);
	}
	return 0;
}

26题:

在主程序中输入10个字符串,调用sort函数进行冒泡排序,然后在主函数中输出排序结果,其中字符串长度不超过20,字符串排序方式(按字母序递增用1表示,按字母序递减用0表示)和待排序的字符串由参数传递给sort函数。要求自行设计sort函数,在主函数中,输入、输出应有相应提示。

程序设计思想:
输入10个字符串,利用strcmp函数比较相邻的两个字符串的大小,并且判断排序方法,为降序(DESC)则当strcmp函数返回负数时利用strcpy函数交换相邻的两个字符串,为升序(ASC)则当strcmp函数返回正数时利用strcpy函数交换相邻的两个字符串,最终输出个字符串

#include<stdio.h>
#include<string.h>
#define DESC 0
#define ASC 1
#define MAX 10
#define LINELEN 20
typedef int order;
char strs[MAX][LINELEN];

void Sort(order method)
{
	int i,j;
	char p[LINELEN];
	for(i=0; i<MAX;i++)
	{
		for(j=0 ;j<MAX-i-1;j++)
		{
			if(method == ASC)
			{
				if(strcmp(strs[j],strs[j+1])>0)
				{
					strcpy(p,strs[j]);
					strcpy(strs[j],strs[j+1]);
					strcpy(strs[j+1],p);
				}
			}
			else if(method == DESC)
			{
				if(strcmp(strs[j],strs[j+1])<0)
				{	
					strcpy(p,strs[j+1]);
					strcpy(strs[j+1],strs[j]);
					strcpy(strs[j],p);
				}
			}
		}
	}
}
void Display()
{
	int i;
	
	printf("当前字符串顺序:\n");
	for(i=0;i<MAX ;i++)
	{
		printf("\t第%d个字符串", i+1);
		printf("%s\n",strs[i]);
	}
	printf("\n");
}
void Input()
{
	int i ;
	for(i = 0 ; i < MAX; i++)
	{
		printf("输入第%d个字符串:",i+1);
		gets(strs[i]);
	}
}
int main()
{
	Input();
	Display();
	printf("DESC:\n");
	Sort(DESC);
	Display();
	
	printf("ASC:\n");
	Sort(ASC);
	Display();
	return 0;
}

这道题用到了string.h头文件中的strcpystrcmp两个函数
strcpy函数:
原型声明:char *strcpy(char* dest, const char *src);
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间 。

strcmp函数:
原型声明:int strcmp(const char *str1,const char *str2);
功能:比较两个字符串大小

  • 如果返回值小于 0,则表示 str1 小于 str2。
  • 如果返回值大于 0,则表示 str1 大于 str2。
  • 如果返回值等于 0,则表示 str1 等于 str2。

再次感谢各位读者,对题目有不同看法,或者不同解法的可以评论在下方。也可以直接联系我邮箱guoheng85@163.com

  • 21
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值