知名的教材在编写中总是给出了很多伪代码,虽然说从意图上来说只要将代码的逻辑表达清楚就没什么问题,不过很多书中的伪码有些过于逆天,会误导许多基础不扎实的人;另一方面,毕竟每个人的编码习惯不同,可能有些高手喜欢写生僻的代码来让人云里雾里语法的规则。。。。博主总结了一些基础的小细节,见字如面:
目录
一.C语言
1.size必须声明
大一我们在学习的时候,老师说C语言的数组是定长的,如果不声明长度就无法通过编译,如下,第1、2行是正确的,而第三行会提示没有声明大小:
int arr1[3];
int arr2[]={1,2,3};
int arr3[];
2.malloc函数
malloc函数相信大家都不陌生,这是数据结构中常见的声明动态数组的方式,格式如下:
int* p=(int*)malloc((sizeof(int)*num)
上述语句的执行逻辑一定要理清楚:
- 首先是通过sizeof获取当前数据类型的大小
- 然后乘以需要的个数即可得出总大小
- 注意:malloc不会对数组进行初始化,返回的结果是一个指针,即指向所分配的动态数组的指针,这个指针是无类型的,因此一定要将数据类型强制转换为当前类型的指针,并赋值回去~
此外还需要注意的是,使用后要用free函数释放空间,并将指针变换为空指针~
接下来通过一段代码演示一下:
int main(int argc, char *argv[]) {
int* arr1;
arr1=(int*)malloc(10*sizeof(int));
int i=0,j=0;
for(;i<10;i++)
{
if(arr1!=NULL)
*(arr1+i)=2;
}
for(;j<10;j++)
printf("%d ",*(arr1+j));
}
运行结果没什么问题,10个2:
再升级一下:一方面长度可以用户自定义,另一方面数值也可以自定义;同时,还加入了使用后销毁的过程:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int* arr1; //指向数组的指针
int num=0,temp=0;
printf("请输入数组长度:\n");
scanf("%d",&num);
arr1=(int*)malloc(num*sizeof(int)); //开辟空间,并将地址返回给指针
int i=0,j=0;
for(;i<=num-1;i++)
if(arr1!=NULL){
printf("此时输入的是%d位上的元素:\n",i);
scanf("%d",&temp);
*(arr1+i)=temp;
}
for(;j<=num-1;j++)
printf("%d ",*(arr1+j));
free(arr1);
arr1=NULL;
return 0;
}
十分完美:
三.耍赖的玩法
如果各位觉得malloc比较麻烦,这里还有一种玩赖的写法:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
int num=0,i=0,j=0;
int temp=0;
printf("请输入数组长度:\n");
scanf("%d",&num);
int arr[num];
for(;i<=num-1;i++)
{
scanf("%d",&temp);
arr[i]=temp;
}
for(;j<=num-1;j++)
printf("%d ", arr[j]);
return 0;
}
没什么问题:
说真的,博主以前以为只有C++可以这样做,属于是长见识了。。。。
二.C++
其实C的第三种是在C++中常用的。除了这种方式,博主最偏爱的就是struct混合vector的方式,效果拔群,这里不再赘述:
三.伪码误导
博主最近一直在看的基本书,有些地方的伪码误导性较强,这里说一下:
1.算法笔记
int[] A绝对是大错特错的写法,相信大家都知道不能不声明数组长度~
此外就是预处理的过程,建议数组都赋0处理,避免脏数据对答案造成影响,不建议像上面这样直接赋值~
2.王道考研
倒没什么大的问题 ,就是对于小白不太友好:LNode *s,按照大一学C语言的惯性思维,会很想当然地将*s看做变量名,而LNode是变量类型。事实上,大家都知道,这里的S是一个LNode类型的指针~
建议大家平时在编码时,写成LNode* S,这样会一目了然S是LNode*类型的变量。
目前就发现这么多,日后继续总结,细节决定成败,对于408来说写伪码没什么太大问题,对于编程语言的考试一定要格外注意语法规范!