我只讲语法,可能没那么原理。
数组
你之前开的变量都是代表一个数,一个字符(好像按顺序你还没接触)。
接下来重磅推出数组!你就可以一下开n个变量()。
声明
int a;//这是一个整型
int a[100];//这是100个整型
访问
int a[100];
a[1]=114514;//给数组第一位赋值为114514
a[0]=12345;//第0位赋值为12345
a[100]=123;//错误的,待会讲
printf("%d",a[1]);//输出114514;
在这里你只需要注意一件事:数组是从0开始索引的。
所以你开了长度为100的数组,实际上它的下标是从0,1,2....99的
这时候你去访问第100个,会导致数组越界,程序就RE了。
实际上在使用中,可以通过多开几位(比如长度100,你开到105)的方式避免数组越界。
循环读入100个数:
int a[105];
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
应该没了,我去看看你题里有什么要讲的。
感觉没啥好讲的,你有问题再问我吧。
讲一个最后一题排序。
头歌里我用的线性时间复杂度的桶排,可以自行了解,我这里给你一种直观好理解的排序叫选择排序(还是叫冒泡排序我忘了),说起来比较唐,就是每次扫一遍数组里的所有数,然后选一个最小的放最前面(从小到大排序),还有更多其他的排序算法可以自行理解。
int a[105];
scanf(n);//为了方便直接这么写了,你懂就行
for(int i=1;i<=n;i++){
scanf(a[i]);
}
for(int i=1;i<=n;i++){
//第二层循环意思是前i个数已经排好顺序了
//在第i个数后找一个最小的不断换上来
for(int j=i;j<=n;j++){
if(a[j]<a[i]){
//由于c里面没有swap所以开两个临时变量来实现交换
int x=a[i];
int y=a[j];
a[i]=y;
a[j]=x;
}
}
}
for(int i=1;i<=n;++){
printf(a[i]);
}
其他题有问题再问我。
二维数组
你现在会存一个数,或者一串数。
把几串数拼成一个nm的矩形,就是二维数组。
这个矩形上有nm个格子,格子用来存数。
声明:
int a[100][100];//一个100*100的数组
调用:
a[1][2]=114514;//给第一行第二列的数赋值为114514
a[100][2]=111;//数组越界RE
a[34][100]=123;//数组越界RE
a[100][100]=1;//RERERE
二维数组在下标上同样也有越界的问题,如果你喜欢从1开始索引,那就把数组开得比题意大点。
循环读入一个 20*20的矩形上的所有数:
int a[105][105];
for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){
scanf(a[i][j]);
}
}
好了看看有没有题要讲讲。
矩阵转置:要求行列互换实际上就是输出的时候把原来的 a[i][j] 换成 a[j][i] 即可,详细的去头歌看代码。
杨辉三角:
把第一列和右下对角线先赋值为1,剩下的点按杨辉三角递推即可,每个数等于其上面的数加左上角的数。
代码:
woc头歌不让我复制过来,你自己去头歌看吧,都怪头歌不让我给你放代码,你喷头歌吧
剩下的没啥可说的,要么读入再输出,要么加几个判断而已。
字符串和字符数组
之前你都一直对着整型数字导管,字符吃醋了,现在你要学习怎么对字符导管。
其实在代码实现这一块,字符是比较麻烦的,我认为你小测比较容易寄在字符串,我尽量把这里讲得细一点,你也着重看看这里。
声明:
字符串的声明叫char,就像整型数字叫int一样
char ch;//一个字符命名为c
scanf("%c",&ch)//读入一个字符ch,注意是“%c”
既然你已经知道数组的概念了,我们可以直接:
char str[100];长度为100的字符串
scanf("%s",str);//读入这个字符串str,注意是“%s”并且不用带“&”,这里不像数字需要循环读入,这样可以直接读一行连续的字符比如“aabbcc”
下标索引的问题同样存在,但我们发现不能循环读入的char数组好像无法控制从几开始索引???!!!!
无妨,教你一招
scanf("%s",(str+1));//表示从字符串数组的第一个位置开始存放字符
woc,我们这样就完成了从1索引字符数组的操作,是不是帅飞了!!!??!!!
然后我要回宿舍睡觉了,等我下次来机房再继续写叭,爱你辣椒么么么么。