姓名:龚政
实验地点:家
实验时间: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是编译之后后缀
之后会学习指针,进入一个比较复杂的内容,预习了,发现和大多数人一样,都有点绕,但是没有什么东西是学不会的,只要你肯努力!