C语言数组专题知识点总结

           C语言数组专题知识点易错点总结及做题感悟

一.知识点总结
1.一维数组的定义和初始化.
注: ① C语言数组的下标都是从0开始的;
②在定义数组时不能使用变量定义数组的大小,如果前面没有对n进行宏定义 #define n 5
则a[n]则不对,因为n不是一个确定的数;
③在对数组定义时,不要让数组下标越界访问
2.二维数组的定义和初始化
注:①定义: 类型 数组名[第一维度][第二维度]
②初始化: 例 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}
3.排序和查找
例如:按交换法将数组a的元素值按从高到低排序(冒泡排序)
for(int i=1;i<=n-1;i++)
{
for(int j=1;j<=n-i;j++)
{
swap(a[j],a[j+1])
}
}
例如:按折半查找法查找值为x的数组元素,若找到则返回x在数组中的下标位置,否则返回-1(二分查找)
int binsearch (long num[],long x,int n) (binsearch()为函数定义)
{
int low=0;high=n-1;mid;
while(low<=high)
{
mid=(high+low)/2;
if(x>num[mid])
low=mid+1;
else if(x<num[mid])
high=mid-1;
else return mid;
}
return -1;
}
二.数组方面题型总结及做题感悟
1.一维数组
①例如:与指定数字m相同的数的个数,一共有n个数
for(int i=1;i<=n;++i)
scanf(“%d”,&a[i]); //数组的输入格式
scanf(“%d”,&m);
for(int i=1;i<=n;++i)
if(a[i]m) ++k;
printf(“%d”,k);
②利用标记法解决问题 例如:校门外的树对需要移走的树进行标记; 开关灯中对每次处理的灯进行标记; 查找特定的值并输出第一次出现的位置
开关灯问题:有n盏灯,有m个人,第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将3的倍数的灯做相反处理(将打开的灯关闭,将关闭的灯打开)。以后的人和3号一样,将凡是自己编号倍数的灯做相反处理。问当第m个人操作之后,哪几盏灯是关闭的,按从小到大输出编号,其间用逗号间隔
int main()
{
int n,m,z=1;
cin>>n>>m;
memset(a,0,sizeof(a)); //初始化全部关闭
for(int i=1;i<=m;++i)
for(j=1;j<=n;++j)
if(j%i
0) a[j]=!a[j]; //编号是i的倍数的灯做相反处理
for(int i=1;i<=n;++i)
{
if(a[i]) //是关闭的灯a[i]==1
{
if(z) z=0;
else printf(","); //第一次不用先输出逗号
printf("%d",i); //顺次输出关闭的灯的编号
}
}
2.二维数组
①有些问题需要找出规律再用代码表现出来,例如:矩阵转置,图像旋转,图像模糊处理
3.字符类型和字符数组
①统计数字字符个数
char ch[256];
gets(ch); //用gets()读入字符数组
l=strlen(ch); //计算字符串的长度,需调用cstring库
4.字符串与string类
①输入字符串 getline(cin,字符串变量) getline函数默认是碰到换行符才结束,可以读进空格
②判断一个字母为大写(或小写)字母,可用逻辑表达式"s[i]>='A&&s[i]<=‘Z’" (像单词替换的问题)
③string类型的其他常用操作
s.insert(pos,s2) 在s下标为pos的元素前插入string类型s2
s.substr(pos,n) 返回从s下标pos起的n个字符,类型为string
s.erase(pos,n) 删除s下标pos起的n个字符
s.replace(pos,n,s2) 将s下标pos起的n个字符替换为s2的字符
s.find(s2,pos) 在s下标pos起查找s2第一次出现的位置
④sscanf和sprintf语句(将字符串与数字巧妙转换)
sscanf(s,"%d",&N); 将字符串s转换成数字N
sprintf(s,"%d",N); 将整数N转换成字符串s
例如:char s1[10]=“1,2,3”,s2=“4,5,6”;
int a,b;
sscanf(s1,"%d",&a);
sscanf(s2,"%d",&b);
cout<<a+b<<endl;
return 0;
⑤string 中的字典序(应用于按字典序输出的问题)
比较运算符 if s1>s2 cout<<s1;
compare()函数 if(a.compare(b)<0) 即s1<s2
if(a.compare(b)>0) 即s1>s2
if(a.compare(b)=0) 即s1=s2
sort函数从小到大排序
#include
for(int i=0;i<n;++i)
cin>>a[i];
sort a[a,a+n];
总结:数组这一章的知识可以说为我们提供了一种解决问题的新思路,尤其是字符数组和对字符串的操作更要认真把握,为后面的函数及其他算法打下基础。

猜你喜欢

转载自blog.csdn.net/wcxyky/article/details/85211769