一、知识点总结
一维数组
1、数组定义:
类型标识符 数组名[常量表达式]
一组具有相同类型的变量的集合。
一个数组在内存中占一片连续的存储单元。
直接对a的访问,就是访问此数组的首地址。
注意:在定义数组长度所用的常量时注意要比所用长度大一点以防止溢出
2、数组大小必须是值为正的常量,不能为变量。
3、数组下标从0开始。
4、一维数组初始化:
数组定义在主函数之外,起初始值为0;定义在主函数之内,起初始值是随机的。
#给数组赋初值的方法:
(1)、直接初始化:int arr[3]={1,2,3};
(2)、遍历访问初始化:
for(i = 0;i< 3;i++)
arr[i]=i;
(3)、内存操作函数。
memset(arr,3,abs);//abs为另一个已知的数组。
(4)、字符串赋值函数,仅限于char型数组。
strcpy(arr,abs) ;abs为一字符串或者char型数组。
5、使两个数组值相等的方法:
①列举赋值:b[0]==a[0] b[1]==a[1]...②循环赋值
③数组a复制k个元素到数组b:mencpy(b,a,sizeof(int)*k)
数组a全部复制到数组b:mencpy(b,a,sizeof(a))
使用mencpy函数要包含头文件cstring。
6、容错处理:保证输入在合法范围之间
7、sort函数
头文件为#include <algorithm>(其中,compare为排序规则)
默认的sort函数是按升序排。
sort(a,a+n); 两个参数分别为待排序数组的首地址和尾地址
8、数组的排序:
①选择排序:
for(j=0;j<n-1;j++)
{
l=j;
for(i=1;i<n;i++)
if(a[l]<a[i])
l=I;
if(l!=j) i=a[l],a[l]=a[j],a[j]=i;
}
②插入排序:
l= i-1;temp=a[i];
while(l>=0&&a[l]>temp)
{
a[l+1]=a[l];
l--;
}
a[l+1]=temp;
③冒泡排序:
for (int j=1; j<=n-1; ++j) //冒泡法排序
for (int i=1; i<=n-j; ++i) //两两相比较
if (a[i]<a[i+1]) //比较与交换
{t=a[i]; a[i]=a[i+1]; a[i+1]=t;}
9、折半查找用于有序序列中查找指定元素。
二维数组
数据类型 数组名[常量表达式1] [常量表达式2] ;
字符数组和字符串数组
1、 [存储类型] char 数组名[常量表达式1]…
2.字符数组的赋值
①用字符初始化数组
例如:char chr1[5]={‘a’,‘b’,‘c’,‘d’,‘e’};
字符数组中也可以存放若干个字符,也可以来存放字符串。
两者的区别是字符串有一结束符(‘\0’)。
字符串是一维数组,但是一维字符数组不等于字符串。
②用字符串初始化数组
用一个字符串初始化一个一维字符数组,可以写成char chr[5]=“abcd”;
③数组元素赋值
3、字符常量和字符串常量的区别
①两者的定界符不同,字符常量由单引号括起来,字符串常量由双引号括起来。
②字符常量只能是单个字符,字符串常量则可以是多个字符。
③可以把一个字符常量赋给一个字符变量,但不能把一个字符串常量赋给一个字符变量。
④字符常量占一个字节,而字符串常量占用字节数等于字符串的字节数加1。增加的一个字节中存放字符串结束标志‘\0’。例如:字符常量‘a’占一个字节,字符串常量“a”占二个字节。
4、字符串的输入
(1)scanf语句
格式:scanf(“%s”,字符数组名);
说明:①系统会自动在输入的字符串常量后添加‘\0’标志,因此输入时,仅输入字符串的内容即可。
②输入多个字符串时,以空格分隔。
(2)gets语句
格式:gets(字符数组名);
说明:使用gets只能输入一个字符串。读入的是一整行,包括空格。
5、字符串的输出
(1)printf语句
格式:printf(“%s”,字符数组名);
(2) puts语句
格式:puts(字符串名称);
说明:puts语句输出一个字符串和一个换行符。对于已经声明过的字符串a,printf(“%s\n”,a)和 puts(a)是等价的。
6、字符串处理函数
strlen(字符串名) 计算字符串的长度,终止符’\0’不算在长度之内
strlwr(字符串名) 将字符串中大写字母换成小写字母
二、问题解决
1、约瑟夫问题
2、矩阵相关问题
三、总结
数组的输入与输出结合循环语句的运用让常常我感觉思路混乱,也许第一组数组还未处理输出,就被第二组数覆盖了。在做题过程中经常出现运行结果错误,这时就需要从头模拟运行,来找到出错的地方。有些算法的思路根本想不到,只能从网上查找,学习理解别人的思路,然后再进行编写。虽然现在我依然在算法的思维逻辑方面有欠缺,但是我相信经过反复练习做题,一定可以熟练掌握基础知识,并能灵活运用,一定能形成C语言逻辑思维。