实验项目:
1, 一维数组的运用
2, 二维数组的应用
3, 字符数组的应用
姓名: 陈福洲 实验地点: 教学楼 514 教室 实验时间: 2019.5.29
一, 实验目的与要求
1, 掌握一维和多维数组的定义和数组元素的引用方法.
2, 了解一维和多维数组初始化方法.
3, 学习一维和多维数组的基本算法.
4, 掌握数组的定义, 初始化方法及其元素的引用方法.
5, 掌握 c 语言提供的对字符串进行处理的基本函数库.
二, 实验内容
一维数组的应用 (7.3.1)
实验练习 1:(1) 问题的简单描述: 编写程序, 利用随机函数产生的 10 个数, 按升序排序输出.
算法流程如下图所示:
(2) 实验代码:
- #include <stdio.h>
- #include <stdlib.h>
- #include <time.h>
- void sort1(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;
- for(i=0;i<10;i++)
- {
- printf("%d",a[i]);
- printf(" ");
- }
- printf("\n");
- sort1(a ,10);
- printf("排序后的结果:\n");
- for(i=0;i<10;i++)
- {
- printf("%d",a[i]);
- printf(" ");
- }
- }
运行结果:
(3) 问题分析: 还是按流程图填空, 但第七章流程图看起来很难, 有一个 /* 给出随机种子 */ 要用到 srand(time (NULL)) 函数, 通过百度解决了. 还有在调用函数时, sort1(a[10],10) 一直显示出错, 数组函数的调用是直接调用数组名即 sort1(a,10).
实验练习 2:(1) 问题的简单描述: 对随机产生的 10 个随机整数从大到小的顺序排列
算法流程图如下:
(2) 实验代码:
- #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++)
- {
- for(j=i+1;j<=n-1;j++)
- {
- if(s[j]<s[i])
- {
- temp=s[i];
- s[i]=s[j];
- s[j]=temp;
- }
- }
- }
- }
- 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",a[i]);
- printf(" ");
- }
- printf("\n");
- sort2(a ,10);
- printf("排序后的结果:\n");
- for(i=0;i<10;i++)
- {
- printf("%d",a[i]);
- printf(" ");
- }
- }
运行结果:
(3) 问题分析: 无.
二维数组的运用 (7.3.2)
实验练习 1:(1) 问题的简单描述: 编写程序, 从键盘输入行数, 输出指定函数的杨辉三角形.
算法流程图如下:
(2) 实验代码:
- #include<stdio.h>
- main()
- {
- int a[50][50],i,j,n;
- printf("请输入杨辉三角的行数:");
- scanf("%d",&n);
- for(i=0;i<=n;i++)
- {
- a[i][i]=1;
- a[i][0]=1;
- }
- for(i=2;i<n;i++)
- {
- for(j=1;j<=i-1;j++)
- {
- a[i][j]=a[i-1][j-1]+a[i-1][j];
- }
- }
- for(i=0;i<=n;i++)
- {
- for(j=0;j<=i;j++)
- {
- printf(" ");
- printf("%d",a[i][j]);
- }
- printf("\n");
- }
- }
运行结果:
(3) 问题分析: 看了好多遍, 还有在同学的解说下, 理解得还是很吃力, 感觉里面的循环很绕, 运行结果有一点小问题.
实验练习 2:(1) 问题的简单描述: 编写程序, 从键盘分别输入年, 月, 日, 计算出该天是这年的第几天.
算法流程图如下:
(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 year,int month,int day)
- {
- int i,j,s=0;
- if((year%4==0&&year%100!=0)||year%400==0)
- i=1;
- else
- i=0;
- for(j=1;j<month;j++)
- s=s+day_tab[i][j];
- return s+day;
- }
- main()
- {
- int y,m,d;
- printf("Input year_month_day:\n");
- scanf("%d%d%d",&y,&m,&d);
- day_year(y,m,d);
- printf("是这年的第 %d 天 \ n",day_year(y,m,d));
- }
运行结果:
(3) 问题分析: 这题有一个重复的知识点: 判断闰年, 是闰年就取定义数组的第二行, 里面是闰年的月份天数, 在累加天数. 刚开始在闰年的判断条件里 year 写成了 i, 所以一直没有结果.
字符数组应用 (7.3.3)
(1) 问题的简单描述: 编写程序, 从键盘输入一个字符串, 判断其是否是回文数. 算法流程图如下:
(2) 实验代码:
- #include "stdio.h"
- #include "string.h"
- #define N 40
- main()
- {
- char str[N],ch='Y';
- int i;
- int len;
- printf("Please input a strings:");
- scanf("%s",&str);
- len=strlen(str);
- printf("\n");
- printf("字符串长度为 %d",len);
- printf("\n");
- 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("该字符串不是回文数");
- }
运行结果:
(3) 问题分析: 依次比较字符串的第一个字符与最后一个是否相等, 所以只要进行 len/2 次循环, 只要有某一个字符不相等, 就用 beak 语句退出循环.
三, 实验总结
学习和使用了数组, 明显地感觉到难度在增大, 第七章的实验程序里面有好多循环, 还有嵌套循环, 而且对数组的概念和基本算法不够了解, 理解起来有些吃力, 但老师在分析实验的时候, 都说不难, 这就尴尬了. 总之, 学习难度在增加, 继续努力!