数组实验报告

数组实验

姓名:樊铮雄    实验地点:一教524   实验时间:2021.6.9

一、实验目的与要求

1、掌握一维数组和多维数组的定义和数组元素的引用方法。
2、了解一维数组和多维数组的初始化方法。
3、学习一维数组和多维数组的基本算法。
4、掌握字符数组的定义、初始化方法及其元素的引用方法。
5、掌握C语言提供的对字符串进行处理的基本库函数。

二、实验内容

1、实验7.3.1(1)

问题描述:写一个函数,对用随机函数产生的10个整数按从小到大的顺序排列(用冒泡排序法实现)。
实验代码:

#include "stdio.h"
#include "stdlib.h"
#include "time.h"
void sort(int s[], int n)
{
	int i,j;
	int temp; 
	for(i=0;i<n-1;i++)
	{
		for(j=9;j>=i+1;j--)
		{
			if(s[j]<s[j-1])
	        {
		        temp=s[j];
	            s[j]=s[j-1];
		        s[j-1]=temp;
	        }
		}
	}
}
main()
{
	int i,a[10];
	srand(time(NULL));
	printf("随机产生10个整数: \n");
	for(i=0;i<10;i++)
	{
		a[i]=rand()%100;
		printf("%d",a[i]);
		printf(" ");
	}
	sort(a,10);
	printf("\n排序后的结果: \n");
	for(i=0;i<10;i++)
	{
		printf("%d",a[i]);
		printf(" ");
	} 
}  

代码运行:

问题分析:
1.第一次遇见srand time(NULL)不知道什么意思,有点不理解。rand()%100的意思产生的都是是一百以内的数。
2.这个题目主要是拿第一个数跟其他数比较然后排序,然后拿第二个数依次类推,理解冒泡排序的原理。
3.冒泡排序法:比较相邻的元素,如果第一个比第二个大,就交换他们两个,对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

2、实验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;
		for(j=i+1;j<=n-1;j++)
		{
			if(s[k]>s[j])
	        {
		        k=j;
	        }
		}
		if(k!=i)
		{
			temp=s[k];
			s[k]=s[i];
			s[i]=temp;
		}
	}
}
main()
{
	int i,a[10];
	srand(time(NULL));
	printf("随机产生10个整数: \n");
	for(i=0;i<10;i++)
	{
		a[i]=rand()%100;
		printf("%d",a[i]);
		printf(" ");
	}
	sort2(a,10);
	printf("\n排序后的结果: \n");
	for(i=0;i<10;i++)
	{
		printf("%d",a[i]);
		printf(" ");
	} 
}  

代码运行:

问题分析:
1.在实验一的基础上有些变化,主要是用到选择排序法。
2.选择排序法:选择排序算法的基本思路是为每一个位置选择当前最小的元素。选择排序的基本思想是,基于直接选择排序和堆排序这两种基本的简单排序方法。首先从第1个位置开始对全部元素进行选择,选出全部元素中最小的给该位置,再对第2个位置进行选择,在剩余元素中选择最小的给该位置即可;以此类推,重复进行“最小元素”的选择,直至完成第(n-1)个位置的元素选择,则第n个位置就只剩唯一的最大元素,此时不需再进行选择。使用这种排序时,要注意其中一个不同于冒泡法的细节。举例说明:序列58539.我们知道第一遍选择第1个元素“5”会和元素“3”交换,那么原序列中的两个相同元素“5”之间的前后相对顺序就发生了改变。因此,我们说选择排序不是稳定的排序算法,它在计算过程中会破坏稳定性。

3、实验7.3.2(1)

问题描述:编写程序,从键盘输入行数,输出指定行数的杨辉三角形。
实验代码:

#include <stdio.h>
main()
{
	int a[50][50],i,j,n;
	printf("请输入杨辉三角形的行数:");
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
	    a[i][i]=1;
	    a[i][1]=1;
	}
	for(i=3;i<=n;i++)
	{
		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=1;j<=i;j++)
		{
			printf("%5d",a[i][j]);
		}
		printf("\n");
	}
}

代码运行:

思考题实验代码:

#include<stdio.h>
main()
{
    int a[50][50],i,j,n;
    printf("请输入杨辉三角的行数:");
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        a[i][i]=1;
        a[i][1]=1;
    }
    for(i=3;i<=n;i++)
    {
        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=1;j<=n-i;j++) 
            printf("  ");
        for(j=1;j<=i;j++)
        { 
            printf("%5d",a[i][j]);
        } 
        printf("\n");     
    }
}

思考题代码运行:

问题分析:
1.首先是a[i][1]确定第一列都是1,然后从第三排开始就是开始相加,确定for循环的结构,最后那个for是输出数组。
2.第二个等腰的就是在第一个的基础上,在最后一个for里面加空格就行了。

4、实验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,j,s=0;
	if(y%4==0&&y%100!=0||y%400==0)
	i=1; else 
	i=0;
	if(j<m)
	{
		for(j=1;j<m;j++)
	       {
	       s=s+day_tab[i][j];
           }
	}
	s=s+d;
	return s;
}
main()
{
	int y,m,d;
	printf("请输入年、月、日;\n"); 
	scanf("%d%d%d",&y,&m,&d);
	printf("是这年的第%d天\n",day_year(y,m,d));
}

代码运行:

问题分析:
1.先判定是否是闰年,闰年和非闰年天数不同。
2.利用循环语句将所输日期的前几个月天数累加起来。

5、实验7.3.3

问题描述:编写程序,判断某一字符串是不是"回文数"。(“回文数”是从左至右和从右至左读起来都是一样的字符串)
实验代码:

#include "stdio.h"
#include "string.h"
#define N 40
main()
{
	char str[N],ch='Y';
	int i;
	int len;
	printf("Input a string: ");
	scanf("%s",&str);
	len=strlen(str);
	for(i=0;i<=len/2;i++)
	if(str[i]!=str[len-1-i])
	{
		ch='N';
		break;
	}
	if(ch=='Y')
	printf("%s是一个回文数;\n",&str);
	else
	printf("%s不是一个回文数;\n",&str);	
} 

代码运行:

问题分析:
1.回文数判断其实就是比较第一位和最后一位是否相同,第二与倒数第二等比较而已;比较完之后ch就被赋值为‘N’然后用if判断即
2.只要进行字符串一半(len/2)的循环就可以了。

三、实验小结:

本次实验题量不多,但是越是学到后面,每道题也更复杂,运用了更多编写方式,代码也更长,流程图也很复杂,自己之前学的也不是很扎实,加上学数组后就一直没听懂,很多题目其实只要静下来想一想就可以出来,但我就有点钻牛角尖,看得这么复杂就不想想了。以后做题要耐心,不能浮躁,还有定期的去复习前面的知识,别让自己模棱两可

posted @ 2021-06-16 22:14  难寻丫  阅读(1207)  评论(0编辑  收藏  举报