【C语言程序设计】实验五 数组和字符串

实验二 数据类型运算符与表达式

实验三 选择结构程序设计

实验四 循环结构序设计

实验五 数组和字符串

实验六 函数

实验七 指针

实验八 结构体与文件读写

结课实验 俄罗斯方块小游戏

目录

前言

知识纲要

实验内容

实验结果

第一个小实验

第二个小实验

第三个小实验

结语


前言

这一系列文章所记录的是大一上学期学的一门名为《C语言程序设计》的实验内容,一共包括了八个实验,由于实验一是安装VC以及打印“hello,world”的基本操作,故没有放在这个系列里面,这些实验的代码部分参考与网上,仅供学习和参考~ 


知识纲要

数组:

        1.数组的作用是用一个名称来存储和处理多个同类型的数据,通过下标来区分同一数组中的不同元素,注意下标编号是从0开始,最后一个元素的下标是数组的长度减1,程序中应防止下标出界;

        2.一维数组的定义的一般形式是:数据类型  数组名[元素个数]; 其中“元素个数”只能是常量表达式,其中不能包含变量。

        3.在定义数组时对各元素指定初始值,称为数组的初始化。初始化的形式如下例所示:int a[5] = {1,3,5,7,9};用花括弧把要赋给各元素的初始值括起来,数据间用逗号分隔。对数组中全体元素都赋以初值的情况下也可以不必指明数组中元素的个数。例如:int a[ ]={1,3,5,7,9};编译系统会认定a数组只有5个元素在定义数组时可以只对前面一部分元素赋初值,但不能前面不给后边给例如:int a[5]={1,3,5};可以int a[5]={1, ,5};不可以局部静态或外部数组若不赋初值,其初值是为0(或空字符);自动数组若不赋初值,其初值是不确定的。部分赋初值时其余皆为0(或空字符)

        4.数组在定义后即可引用。其元素的引用形式为:数组名[下标] 下标可以用整常数或整型表达式:例如:a[1]、a[i]、a[i+j]、a[b[1]] 等

        5.二维数组的定义的一般形式:数据类型  数组名 [常量表达式] [常量表达式];多维数组的定义方法与二维数组相仿。可以在一行中定义同一类型的变量,一维、二维和多维数组。例如:int  i, a[3], b[3][4], c[2][4][8];

        6.二维和多维数组的初始化:

        所有元素都有初值:

        方法1:int  m[2][3]={1,2,3,4,5,6};

        方法2:int  m[2][3]={{1,2,3},{4,5,6}};

        部分元素有初值:

        int  m[2][3]={1,2,3,4};

        int  m[2][3]= {{1,2 },{3,4}};

        int  a[3][5] ={{1,2}, { },{2,3,1}};

        只可以缺省第一维下标,不可以缺省其它维大小,如:

        int b[ ] [3] ={1,2,3,4,5,6};   b为2行3列

        int b[2] [ ] ={1,2,3,4,5,6}; 不允许

        7.引用二维数组元素的一般形式为:

        数组名[下标][下标]

        通常称第一个下标为行下标,第二个为列下标如:a[0][2]、b[2][1][3]    二维数组可以只用一个下标引用,但与引用一维数组元素的概念完全不同。如:定义int a[3][5]; 引用 a[1]代表第2行第1个元素的地址,而并非把该二维数组当作一维数组时的第2个元素。多维数组类似。数组元素a[i][j]不可以用a[i,j]的形式引用。

     

字符串:

        1.C语言中只有字符串常量(用双撇号括起来的0个或多个字符)但没有字符串变量。一个字符串由一个字符指针(指向字符串的起始地址)和一个结束标记'\0'来确定。字符串的存储可以用字符串常量也可以用字符数组,两者之间的关系是:字符数组是给存储字符串分配的存储空间,字符串是存储在字符数组中的数据。

        2.字符串的输入可以用scanf函数的”%s”格式,也可以用gets函数,两者的区别是:用scanf函数的”%s”格式输入的字符串中不能有空格和跳格字符,但一次可以输入多个字符串;用gets函数一次只能输入一个字符串,输入的字符串可以包含空格和跳格,回车是字符串输入结束的标记

        3.字符串的输出可以用printf函数的”%s”格式,也可以用puts函数,两者的区别是:用多个”%s”格式可以在一次printf函数调用中输出多格字符串,而用puts函数一次只能输出一个字符串,且输出字符串后会自动加上“回车\换行”,puts(a);与printf("%s\n",a);等价。

        4.用二维字符数组和一维指针数组都可以处理多格字符串,需要修改字符串内容时一般用二维字符数组,处理多个不等长的字符串时一般用一维指针数组。用二维字符数组时会给数组分配存储空间用于存放字符串,用一维指针数组时,不会在指针数组中分配存储字符串的空间,字符串要通过其他途径分配存储空间来存储(如:字符串常量或别的字符数组)。

        5.常用的字符串处理函数有(在指针部分介绍):strcpy、strcat、strcmp、strlen、strchr、strupr、strlwr等,这些函数的声明在“string.h”头文件中,使用前要在程序开头加入“#include <string.h>”。需特别注意的是,由于C语言没有字符串类型的变量,字符串的复制、比较、连接等操作必须用相应的函数(strcpy、strcmp、strcat),而不能象简单变量一样用运算符(赋值、==、+)。


实验内容

1.随机数生成与“起泡”排序算法改进

        要求:设计一个程序,定义一个大小为N的一维数组:int a[N];在程序运行时通过rand()函数随机产生数组各元素值(取值范围在0到99之间),并按顺序显示排序前数组中各元素的值。改进课件示例中的“起泡”排序算法,使得在排序过程中能判断数组元素是否已提前排好序,已排好序时就提前结束循环,用改进后的算法对数组a的元素按从小到大的顺序排序,然后显示排序后的结果。

        提示:产生随机数需用到rand()函数(在stdlib.h中声明),它返回一个在0~32767之间的随机整数。如rand( )%100的结果是0~99的整数,要得到a到b之间的随机数可用公式:a + rand( )%(b-a+1)。虽然每次调用rand()函数会返回一个随机数,但每次运行程序这个序列是相同的,若要产生随机的序列需要用系统时钟作为参数调用srand函数产生随机种子,用法如下:srand( (unsigned)time( NULL ) );(time函数在 time.h中声明)该函数只需在程序开始调用一次,不要在每次调用rang函数前重复调用。

2.合并排序

        要求:在程序中定义两个符号常量M和N(M和N的值不相等)和三个一维数组:int a[M],b[N],c[M+N]; 数组a和b的值在初始化时给定,且各自按从小到大的顺序排好序。先各在一行显示数组a和b中的数据,然后实现将数组a和b合并排序后存入数组c中(注意是在合并的同时保证有序,不是合并后才排序),最后输出数组c中各元素的值。

3.字符统计

        要求:在程序运行时输入三行文字,每行最多40个字符,可以包含空格,将文字保存在一个二维字符数组中,然后统计文字中大写字母、小写字母、数字、空格、其他字符各有多少个,并输出统计结果。


实验结果

第一个小实验

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 10
int main()
{
	int ii,jj,t;
	int count=0;
	int a[N];
	srand((unsigned)time(NULL));
	for(ii=0;ii<N;ii++)
	{
		a[ii]=rand()%100;
		printf("%d",a[ii]);
	}
	for(ii=0;ii<N-1;ii++)//ii<9 ii++
	{
		for(jj=0;jj<N-1;jj++)//0<9, a[0]>a[1] t=a[0] a[0]=a[1] a[1]=a[0]
			if(a[jj]>a[jj+1])
			{
				t=a[jj];
				a[jj]=a[jj+1];
				a[jj+1]=t;
			}
			count++;
	}
	if(count=0)
	{
		printf("\n");
		printf("已排好序");
	}
	else
	{
		printf("\n进行排序:\n");
			for(ii=0;ii<N;ii++) printf("%d;",a[ii]);
	}
return 0;
}

第二个小实验

#include<stdio.h>
#define M 4
#define N 3
int main()
{
	int a[M]={12,9,3,6};
	int b[N]={4,1,8};
	int c[M+N];
	int ii=0,jj,t,m;
	int count=0;
for(ii=0;ii<M-1;ii++)
{
	for(jj=0;jj<M-1;jj++)
	if(a[jj]>a[jj+1])
	{t=a[jj];
	a[jj]=a[jj+1];
	a[jj+1]=t;}
}
for(ii=0;ii<M;ii++)
	printf("%d;",a[ii]);
    printf("\n");
for(ii=0;ii<N-1;ii++)
{
	for(jj=0;jj<N-1;jj++)
		if(b[jj]>b[jj+1])
		{t=b[jj];
		b[jj]=b[jj+1];
		b[jj+1]=t;}
for(ii=0;ii<N;ii++)
	printf("%d;",b[ii]);
}
printf("\n");
{
if(a[0]<b[0])//判断第一个数
c[0]=a[0];
else
c[0]=b[0];
}
printf("%d;",c[0]);
{
if(c[0]=1&&b[1]>a[0])//判断第二个数
c[1]=a[0];
if(c[0]=1&&b[1]<a[0])
c[1]=b[1];
}
printf("%d;",c[1]);
{
if(c[1]=a[0]&&b[1]<a[1])//判断第三个数
c[2]=b[1];
if(c[1]=a[0]&&b[1]>a[1])
c[2]=a[1];
}
printf("%d;",c[2]);
{
if(c[2]=b[1]&&a[1]<b[2])//判断第四个数
c[3]=a[1];
if(c[2]=b[1]&&a[1]>b[2])
c[3]=b[2];
}
printf("%d;",c[3]);
{
if(c[3]=a[1]&&b[2]<a[2])//判断第五个数
c[4]=b[2];
if(c[3]=a[1]&&b[2]>a[2])
c[4]=a[2];
}
printf("%d;",c[4]);
{
if(c[4]=8)//判断第五个和第六个数
c[5]=9;
if(c[5]=9)
c[6]=a[3];
}
printf("%d;",c[5]);
printf("%d;",c[6]);
printf("\n");
return 0;
}

第三个小实验

#include<stdio.h>
#include<string.h>
int main()
{
char g5[3][40];
int i,j;
int space = 0,num = 0,upcase = 0,lowcase = 0,others = 
	0;
char c;
for(i=0;i<3;i++)
	gets(g5[i]);
for(i=0;i<3;i++)
	for(j=0;j<20&&((c=g5[i][j])!='\0');j++)
	{
	c=g5[i][j];
	if(c>='A'&&c<='Z')upcase++;
	else if(c>='a'&&c<='z')lowcase++;
	else if(c>='0'&&c<='9')num++;
	else if(c==' ')space++;
	else others++;
	}
printf("\nupcase=%d,lowcase=%d,num=%d,space=%d,others=%d", upcase, lowcase, num, space, others);
return 0;
}

结语

如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hiddenSharp429

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值