#5:C语言复习:数组和字符串;

一.    一维数组的定义    

                            类型标识符  数组名[整型常量表达式]

                    1.类型标识符可以是:int 、float、char、指针等各种
                
                    2.数组名遵循命名规则(第一个为字母),在一个函数内,数组、变量名不能重名
                
                    3.整型常量表达式说明数组元素个数,不能包含变量或者函数
            
                    4.数组和变量可同时定义
                
                    5.数组序号从零开始!!!!!!!!!!!

例一:

一维数组的引用:输出全部元素

void main()
{
	int s[10];
	int i;
	for(i=0;	i<=9;	i++)
		s[i]=i*i;
	for(i=0;	i<=9;	i++)
		printf("%d\n",s[i]);
}

例二:

一组数组的初始化方法:

                //    1.    for(i=0 ;i<=x;    i++)        scanf("%d",a[i]);        //    for循环赋值,手动输入

                //    2.    int a[8]={0,1,2,3,4,5,6,7};                                //    所有元素赋值

                //    3.    int a[8]={0,1,2,3,4};                                        //    部分元素赋值,后面的元素自动附为零

                //    4.    int a[]={1,2,3,4,5};                                         //    通过赋值来确定数组大小

例三:

一维数组程序设计举例:冒泡排序法( 从小到大 )

void main()
{
	int a[50],i,j,t,n;					//	i:第i个数据	j:第j趟比较	t:经典交换中的交换变量		n:数据个数

	printf("输入数据个数:\n");				//	经典的循环输入数组数据
	scanf("%d",&n);
	printf("请输入原始数据:\n");
	for(i=0;	i<n;	i++)				
		scanf("%d",&a[i]);
	for(j=1;	j<=n-1;	j++)				//	进行n-1次循环;

		for(i=0;	i<=n-j-1;	i++)		//	每次循环比较前n-j个数,共n-j-1次;
			if(a[i]>a[i+1])

			{
				t=a[i];				//	经典的交换数据
				a[i]=a[i+1];
				a[i+1]=t;
			}

	printf("\n");
	for(i=0;	i<n;	i++)				//	经典的循环输出
		printf("%d\n",a[i]);
}


二、二维数组和多维数组


                            定义形式:    类型标识符 数组名[exp1](行)[exp2](列);

                            储存形式:    按行存储,第一行存完再继续存储第二行


1.    二维数组元素的引用:经典

void main()
{
	int i,j,a[3][2];

	printf("请按行输入原始数据:\n");					//	经典的二维数组输入
	for(i=0;	i<3;	i++)
		for(j=0;	j<2;	j++)
			scanf("%d",&a[i][j]);


	for(i=0;	i<3;	i++)						//	经典的二位数组输出
		for(j=0;	j<2;	j++)
			printf("\na[%d][%d]=%d\n",i,j,a[i][j]);
}

2.    二维数组的初始化


                    //    1.    int a[3][4]={    {1,2,3,4},    {5,6,7,8},    {9,10,11,12}    };            //    分行给二维数组赋初值

                    //    2.    int a[3][4]={    1,2,3,4,5,6,7,8,9,10,11,12};                               //    不够的元素赋值为0

                    //    3.    int a[3][4]={    {1},    {2},    {3}    };                                
                    //                   ={    {1,0,0,0},{2,0,0,0},{3,0,0,0}    };等

                    //    4.    int a[][4]={    1,2,3,4,5,6,7,8,9    };                                           //    可省略行数,系统自动计算行数
 
                    //    5.    int a[3][]={    {0,0,3},    {0},    {0,10}    };                                   //    省略列数,但应分行赋值;
 

3.    二维数组程序设计举例:   

求转置矩阵

void main()
{
	int a[2][3],b[3][2],i,j;
	printf("按行输入原始数据:\n");
	for(i=0;	i<=1;	i++)
		for(j=0;	j<=2;	j++)
			scanf("%d",&a[i][j]);
	for(i=0;	i<=1;	i++)
		for(j=0;	j<=2;	j++)
			b[j][i]=a[i][j];				//	转置矩阵的算法灵魂!!!!!
	for(i=0;	i<=2;	i++)
	{
		for(j=0;	j<=1;	j++)				//	先排列输出一行	再换行输出第二行。矩阵的经典输出!!!
			printf("%4d",b[i][j]);
		printf("\n");
	}
}

三、字符数组与字符串

1.字符数组的初始化:

                    //    1.    char c[10]={    'p','r','o'    };                       

                    //    2.    char str[]={    's','t','r','i'    };                   

                    //    3.    char ca[][5]={    {'a'},    {'b','b'},{'c','c','c'}};

                    //    4.    char c[12]="computer & C";                  

                               错误,字符十二个,但是要给“\0”预留空间,所以数组大小为13;

                    //    5.    char ca[3][5]={{"a"},{"bb"},{"ccc"}};            //    

2.    字符串的输入输出:

void main()
{
	char str[20];
	int i;

	printf("请输入字符串\n");					//	经典的字符串输入
	for(i=0;	i<=12;	i++)
		scanf("%c",&str[i]);

	for(i=0;	i<=12;	i++)					//	经典的字符串输出
		printf("%c",str[i]);
	printf("\n");

	printf("请输入字符串\n");					//	特殊的字符串输出(无空格)
	scanf("%s",str);
	printf("%s\n",str);						//	scanf在输出时碰到空格等便停止输出,最终输出computer.
}

3.    puts(str)和gets(str);

void main()
{
	char str[13];
	printf("请输入一个字符串\n");
	gets(str);
	puts(str);
}

4.    字符串处理函数:

1.strcat(字符数组名1,字符串2)       

                       连接两个字符串;  字符数组1足够长;

void main()
{
	char st1[30]="My name is ",st2[]="John";
	strcat(st1,st2);
	puts(st1);
}

2.strcyp(字符数组名1,字符串2)       

                       字符串2的内容全部复制给字符串1;    字符数组1的长度不小于字符数组二的长度;

void main()
{
	char st1[15],st2[]="C Language";
	strcpy(st1,st2);
	puts(st1);
}

3.strcmp(字符串1,字符串2)       

                        比较两个字符串的大小;   
                        从左到右比较两个字符串的大小,若相等继续比较,直到不同字符或遇到"\0"为止

           以第一个不同字符的比较为准
                                        exp1=exp2 返回值为0;
                                        exp1>exp2 返回正值;
                                        exp1<exp2 返回负值;

void main()
{
	int k;
	char st1[15],st2[]="C Language";
	printf("请输入一个字符串:\n");
	gets(st1);
	k=strcmp(st1,st2);			//	C语言不允许关系运算符比较两个数组的大小,
						//	if(st1>=st2)是错误的;
	if(k==0) printf("st1=st2\n");
	if(k>0) printf("st1>st2\n");
	if(k<0) printf("st1<st2\n");

}

4.strlen(字符串)       

                      计算字符串的实际长度(不含字符结束的"\0"),并作为返回值:

void main()
{
	int k;
	char st[80];
	printf("请输入一个字符串:\n");
	gets(st);
	k=strlen(st);
	printf("字符串的长度为:%d\n",k);
}

四、字符数组程序设计举例:
1. 从键盘输入若干字符串,存入二维数组,然后从小到大排序:

void main()
{
	char a[3][80],b[80];
	int i,j;

	printf("请输入三个数组:\n");				//	gets的经典算法
	for	(i=0;	i<3;	i++)
		gets(a[i]);


	for(i=0;	i<3;	i++)					//	类似冒泡排序法的算法
		for (j=2;	j>i;	j--)


			if (strcmp(a[j],a[j-1])<0)			//	经典的两个字符比大小并交换的算法;类似于max;
			{
				strcpy(b,a[j]);
				strcpy(a[j],a[j-1]);
				strcpy(a[j-1],b);
			}


	for(i=0;	i<3;	i++)
		puts(a[i]);
}

2.    一个字符串的逆置:

void main()
{
	char s[60],ch;
	int m,j;
	printf("请输入一个字符串:\n");
	gets(s);

	m=strlen(s)-1;						//	在计算循环次数的时候经常使用!!!!!

	for	(j=0;	j<m;	j++,m--)			//	交换对应项;
	{
		ch=s[j];
		s[j]=s[m];
		s[m]=ch;
	}
	printf("逆置的字符串为:%s\n",s);
}	 

3.    将一个数字字符串转换为一个整数:

void main()
{
	char str[80];
	long x=0;
	int i=0,n;
	printf("请输入一个数字字符串\n");
	gets(str);
	n=strlen(str);

	if (str[0]=='-') i++;							//	若第一个字符为符号,进行下一个数字计算;

	for	(;	i<n;	i++)							//	一个数字字符减去0的ASCII码等于这个数字!!
		x=x*10+str[i]-'0';

	if (str[0]=='-')	x=-x;						//	如为负值,加上负号;
	printf("%d\n",x);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值