谢谢实验楼~
一、一维数组
例子1
定义一个含有 10 个元素的数组,依次赋值为 1,2,3,4,5,6,7,8,9,10,然后按逆序输出。
#include<stdio.h>
int main()
{
int i,a[10];
for(i=0;i<10;i++)
a[i] = i + 1;
for(i=9;i>=0;i--)
printf("%d\t",a[i]);
return 0;
}
例子2冒泡排序
现在输入 10 个用户的有效学习时间,要求对它们按由小到大的顺序排序。
冒泡排序:
其思路为:每次将相邻两个数比较,将小的调到前面,如果有 6 个数:8,7,5,4,2,0。第一次先将最前面的两个数 8 和 7 对调。第二次将第二个数和第三个数(8 和 5)对调…如此总计进行了 5 次,得到 7-5-4-2-0-8 的顺序,可以看到:最大的数 8 已经沉底,成为最下面的一个数,而小的数上升。经过第一轮(5 次比较)后,得到了最大的数 8。
如果有数组里有n个数字,则需要循环(n-1)次,第1次排序(n-1)次,最后一次排序1次。
#include<stdio.h>
int main()
{
int i,j,t,LearnTime[10];
printf("please enter 10 number:\n");
for(i=0;i<10;i++)
scanf("%d",&LearnTime[i]);
for(j=0;j<9;j++) //9次外循环,9次比较
for(i=0;i<9-j;i++) //9-j次内循环
if(LearnTime[i]>LearnTime[i+1]) //交换值
{
t=LearnTime[i];
LearnTime[i] = LearnTime[i+1];
LearnTime[i+1] = t;
}
printf("the sorted number:\n");
for(i=0;i<10;i++)
printf("%d\t",LearnTime[i]);
return 0;
}
二、二维数组
二位数组的表示方法:
int a[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
或者int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
第一个[ ]是行 第二个[ ]是列
可以对部分赋值:
int a[3][4]={{1},{3},{5}};
结果是:
1 0 0 0
3 0 0 0
5 0 0 0
例子2
有一个 3*4 的矩阵,求出其中的最大值并输出最大值和其所在的行号和列号。
解题思路:先思考一下在打擂台的时候怎样确定最后的优胜者。先找出任一个人站在台上,第 2 个人上去与之比武,胜者留在台上。再上去第 3 个人,与台上的人比武,胜者留在台上,败者下台。以后每一个人都和当时留在台上的人比武。直到所有人都上台比过为止,最后留在台上的就是冠军,这中方法就是打擂台法。 我们本题目也采用打擂台算法。先让 a[0][0] 做“擂主”,把它的值赋给变量 max,max 用来存放当前已知的最大值,在开始时还未进行比较,把最前面的元素认为是当前最大值,然后让下一个元素 a[0][1] 和 max 比较,如果 a[0][1]>max,则把 a[0][1] 赋值给 max,取代 max 的原值。以后以此处理,直到全部比完之后,max 就是最大值。
#include<stdio.h>
int main()
{
int i,j,row = 0,colum = 0,max;
int a[3][4] = {{3,4,16,2},{7,5,1,9},{11,23,3,8}};
max = a[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(a[i][j]>max)
{
max = a[i][j];
row = i;
colum = j;
}
printf("max=%d\nrow=%d\ncolum=%d\n",max,row,colum);
return 0;
}
三、字符数组
1.字符数组的表示方法:
char c[10]={'I',' ','a','m',' ','h','a','p','p','y'};
char c[]={'I',' ','a','m',' ','h','a','p','p','y'};
char[] = {"I love shiyanlou"};
char[] = "I love shiyanlou";
- 数组 c[] 的长度自动定为 10。这种方式不用人工去数字符的个数,尤其在赋初值字符个数不较多的情况下,比较方便。
- 注意:上面例子中花括号提供的初值个数(即字符个数)等于数组长度,倘若花括号中的提供初值个数大于数组长度,则会出现语法错误。倘若初值个数小于数组长度,则只将这些字符赋给数组中前面那些元素,其余元素自动定为空字符(即’’\0’).
例子3:
输出一个正方形。
解题思路:先画出一个平面正方形图案,每行包含 5 个字符,其中有的是空白字符,有的是’*'字符,定义一个字符型的二维数组并初始化,用 for 循环嵌套输出。
#include<stdio.h>
int main()
{
char c[ ][9]={
{'*',' ','*',' ','*',' ','*',' ','*'},
{'*',' ',' ',' ',' ',' ',' ',' ','*'},
{'*',' ',' ',' ',' ',' ',' ',' ','*'},
{'*',' ',' ',' ',' ',' ',' ',' ','*'},
{'*',' ','*',' ','*',' ','*',' ','*'},
};
int i,j;
for(i=0;i<5;i++)
{
for(j=0;j<9;j++)
printf("%c",c[i][j]);
printf("\n");
}
return 0;
}
2.为了简洁,代替了printf和scanf,出现了puts和gets:
puts(字符数组)
其作用是讲一个字符串输出到终端,因此该函数用的不是很多,我们可以编写小程序来体验。
gets(字符数组)
其作用是从终端输入一个字符串到字符数组,并且得到一个函数值。
例子4
#include<stdio.h>
#include<string.h> //在使用字符串处理函数时,在程序文件的开头用#include<string.h>
int main()
{
char str[] = "China\nChengdu";
puts(str);
printf("Enter a new string:");
gets(str); //有的编译器会报 warning,提示 gets() 函数不安全;
//这里说明一下,这个warning是编译器针对这个函数的,不影响实验。感兴趣的同学可以作为课后自学。
puts(str);
return 0;
}
3.strcat
strcat(字符数组1,字符数组2)
把2接到1后面去
#include<stdio.h>
#include<string.h> //在使用字符串处理函数时,在程序文件的开头用#include<string.h>
int main()
{
char str1[30] = "People's Republic of'";
char str2[] = "China";
printf("%s",strcat(str1,str2));
return 0;
}
4.strlen 函数-测字符串长度的函数
char str[] = "China";
printf("%d",strlen(str));
- strlen() 返回的值比实际占用的长度要小,因为不包含 ‘\0’。
5.strcpy ——字符串复制函数
strcpy(字符串 1,字符串 2)
作用是将字符串 2 复制到字符串 1 中。
char str1[10],str2[] = "China";
strcpy(str1,str2);
6.strcmp——字符串比较函数
strcmp(字符串1,字符串2)
strcmp(str1,str2);
strcmp("Chengdu","Beijing");
将两个字符串自左向右逐个字符比较(按照 ASCII 码值大小比较),直到出现不同的字符或者遇到 '\0 '为止。
- 如果全部字符相同,则认为两个字符串相同。
- 若出现不同的字符,则以第1对不相同的字符的比较结果为准。例如:“A”<“D”,“e”>“E”,“these”>“that”,“computer”>“compare”。
- 比较结果由函数值带回。
字符串1=字符串2,则函数值为0
字符串1>字符串2,则函数值为一个正整数
字符串1<字符串2,则函数值为一个负整数
例子5
任意键入 3 个字符串,编程找出最小的一个。
#include<stdio.h>
#include<string.h>
int main()
{
char string[30];
char ch[3][30];
int i;
for(i=0;i<3;i++)
gets(ch[i]);
strcpy(string,ch[0]);
for(i=1;i<3;i++)
if(strcmp(ch[i],string)<0)
strcpy(string,ch[i]);
printf("The result is :\n%s",string);
return 0;
}
练习1
输入 20 个实数存放在一维数组中,输出它们的平均值以及高于平均的数的个数。
#include<stdio.h>
int main()
{
int num[20];
int ave,sum;
int flag = 0; //大于平均数的个数
//输入
for(int i=0;i<20;i++)
scanf("%d",&num[i]);
//求和
for(int i=0;i<20;i++)
sum += num[i];
ave = sum / 20;
for(int i=0;i<20;i++)
if(num[i]>ave)
flag++;
printf("ave=%d,num bigger than ave is %d",ave,flag);
return 0;
}
练习2
围绕着山顶有 10 个洞,一只兔子和一只狐狸住在各自的洞里,狐狸总想吃掉兔子,一天兔子对狐狸说,你想吃我有一个条件,你先把洞编号 1 到 10,你从第 10 洞出发,先到第 1 号洞找我,第二次隔一个洞找我,第三次隔两个洞找我,以后依次类推,次数不限,若能找到我你就可以饱餐一顿,在没找到我之前不能停止,狐狸一想只有 10 个洞,寻找的次数又不限,哪有找不到的道理,就答应了条件,结果狐狸跑得昏了过去也没找到兔子,请问兔子躲在哪个洞里。程序中可假定狐狸找了 1000 次。
#include<stdio.h>
int main()
{
int hole[10],i,n = 0;
for(i=0;i<10;i++)
hole[i] = 0; //为每个洞赋值为0,代表狐狸未找过该洞
for(i=0;i<1000;i++) //用循环实现狐狸找1000次洞
{
n = n % 10; //n为狐狸当前寻找的洞的编号(实际编号应为n+1)
hole[n] = 1; //为找过的洞赋值为1,代表狐狸已经找过该洞
n += i + 2; //设置下一次寻找的编号
}
printf("The hole's numbers are:");
for(i=0;i<10;i++) //逐个输出洞的编号(实际编号)
{
if(hole[i]==0)
{
printf("%d ",i + 1);
}
}
return 0;
}