您的位置:首页 > 编程语言 > C语言/C++

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

2017-12-27 13:26 225 查看
一.    一维数组的定义    

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

                    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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: