*\
76%

C语言设计实验报告(第六次)


姓名:龚政

实验地点:家

实验时间:2020.5.7

实验项目:7.3.1-1两两比较排序;7.3.1-2找最小排序;7.3.2打印杨辉三角形;7.3.2-2计算总天数;7.3.3判断回文数


实验目的与要求

本实验旨在巩固学生对一-维数组这种数据结构的理解,增强其程序设计能力。

本实验旨在巩固学生对二维数组这种数据结构的理解

实验内容

实验练习:7.3.1-1两两比较排序

问题的简单描述:编写程序,利用随机函数产生10 个整数,并按升序排列输出

实验代码:

流程图

#include<stdio.h> 
#include<stdlib.h>
#include<time.h>
void sort1(int s[],int n)
{
	int i,j;
	int temp;
	for(i=0;i<10;i++){//外循环控制判断组,每一组都会两两比较 
		for(j=9;j>=i+1;j--){//这里的循环控制两两比较 --- 因为最大的已经在后面了,所以不用参与比较就出现了j>=i+1 
			if(s[j]<s[j-1]){//两两比较,把大的放到后面 
				temp=s[j];
				s[j]=s[j-1];
				s[j-1]=temp;
			}
		}
	}
}
int main()
{
	int i,a[10];
	srand(time(NULL));//产生真随机数 
	printf("随机产生10个整数:\n");
	for(i=0;i<10;i++){//初始化数组 
		a[i]=rand()%100;
	}
	for(i=0;i<10;i++){//输出十个整数 
		printf("%d\t",a[i]);
	}
	printf("\n");
	sort1(a,10);//调用函数进行排序 
	printf("排序后的结果:\n");
	for(i=0;i<10;i++){//输出排序后的结果 
		printf("%d\t",a[i]);
	}
}

问题分析:书上的for(j=9;j>=i+1;j--)设计还是比较巧妙的,这里考虑到了最大的已经放好了位置,不用再参与比较,可以提高代码运行速度

实验练习:7.3.1-2找最小排序

问题的简单描述:写一个函数,对随机产生的10个整数按照从小到大的顺序排序(升序,用选择排序实现)

实验代码:

流程图

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void sort2(int s[],int n)
{
	int i,j,k;
	int temp;
	for(i=0;i<n-1;i++){
		k=i;//暂存i下标 
		for(j=i+1;j<=n-1;j++){//找到最小数组的下标 ,由k储存 
			if(s[j]<s[k]){
				k=j;
			}
		}
		if(k!=i){//s[k]存储最小下标 
			temp=s[k];
			s[k]=s[i];
			s[i]=temp;
		}
	}
}
int main()
{
	int i,a[10];
	srand(time(NULL));
	printf("随机产生10个整数:\n");
	for(i=0;i<10;i++){
		a[i]=rand()%100;
	}
	for(i=0;i<10;i++){
		printf("%d\t",a[i]);
	}
	printf("\n");
	sort2(a,10);
	printf("排序后的结果:\n");
	for(i=0;i<10;i++){
		printf("%d\t",a[i]);
	}

}

问题分析:报错一次undefined reference to winmain,找了一段时间代码在哪里出错,结果是main写成了maim,果然还是要先看懂英文,再去找错误比较快速!

实验练习:7.3.2打印杨辉三角形

问题的简单描述:编写程序,从键盘输人行数,输出指定行数的杨辉三角形。

实验代码:

流程图

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	int a[50][50],i,j,n;
	printf("请输入杨慧三角形的行数:");
	scanf("%d",&n);
	for(i=1;i<=n;i++){//初始化所有的1 
		a[i][i]=1;
		a[i][1]=1;
	} 
	for(i=3;i<=n;i++){//初始化数组:对于除1外的数据进行初始化 
		for(j=2;j<=i-1;j++){
			a[i][j]=a[i-1][j-1]+a[i-1][j];
		} 
	} 
	for(i=1;i<=n;i++){//打印杨辉三角,外循环控制多少行输出 
		for(j=0;j<=n-i;j++){//控制每一行的空格输出 
			printf("    ");
		}
		for(j=1;j<=i;j++){//控制每一行的数据输出 
			printf("%-6d  ",a[i][j]);
		}
		printf("\n");
	}

}

问题分析:在打印的时候出现了不美观的情况,仔细看你会发现每一行输出的两个循环里面有几个细节:一是%-6d这里是控制长度为6,不足在末尾补0,如果是%6d,那就是在开头补0;二是调整美观时候不是一定要按照这个格式,两个循环输出的内容都是我一个个试出来的最佳方案

实验练习:7.3.2-2计算总天数

问题的简单描述:编写程序,从键盘分别输入年,月,日,计算出该天是这年中的第几天。

实验代码:

流程图

#include<stdio.h> 
int day_tab[2][13]={//第一行不是闰年的每个月份代表的天数,第二行是闰年 
{0,31,28,31,30,31,30,31,31,30,31,30,31},
{0,31,29,31,30,31,30,31,31,30,31,30,31}
};
int day_year(int y,int m,int d) 
{
	int i=0,j,s=0;
	if(y%4==0&&y%100!=0||y%400==0){//判断闰年 
		i=1;
	}
	for(j=1;j<m;j++){//累加到上个月的总天数 
		s=s+day_tab[i][j];
	}
	s+=d;//加上这个月天数 
	return s;//返回总天数 
}
int main()
{
	int y,m,d;
	printf("Input year_month_day:");
	scanf("%d%d%d",&y,&m,&d);
	printf("是这年的第%d天\n",day_year(y,m,d));//调用函数放在printf函数里面 
	return 0;
}

问题分析:无

实验练习:7.3.3 判断回文数

问题的简单描述:编写程序,从键盘输入一个字符串,判断其是否是回文数

实验代码:

流程图

#include<stdio.h>
#include<string.h>
#define N 40
int main()
{
	char s[N],ch='Y';
	int i;
	int len;
	printf("Input a string:");
	scanf("%s",s);
	len=strlen(s);//用到字符串函数strlen求字符的长度包括\0 
	for(i=0;i<len/2;i++){
		if(s[i]!=s[len-1-i]){//首尾比较是否相等 
			ch='N';//不相等ch=N,在下面判断起作用 
		}
	}
	if(ch=='Y'){
		printf("%s是一个回文数\n",s);
	}else{
		printf("%s不是一个回文数\n",s);
	}
	
	
	return 0;
}

问题分析:无

实验小结(剖析个人得失)

这次的实验内容比较少,更多在课堂练习,课堂练习是一个查缺补漏的绝佳地方,很多典型的题目可以戳中你的痛点,必须float输出默认是八位也就是6.000000,又比如说一些陌生的知识:obj是编译之后后缀

之后会学习指针,进入一个比较复杂的内容,预习了,发现和大多数人一样,都有点绕,但是没有什么东西是学不会的,只要你肯努力!

posted @ 2020-05-07 20:12  洋葱gz  阅读(433)  评论(0编辑  收藏  举报