NO.3章 入门篇(1)——入门模拟
1. 输入“2 a”
1 scanf("%d", &n); 2 getchar(); //scanf("%c", &sig) 可以收空格,即sig==' ',所以需用getchar()来接住 3 sig=getchar();
2. 四舍五入
因为'round': identifier not found,不能从<cmath>中调进来,需自己定义
法一:宏定义
法二:inline 函数
inline double round( double d ){ return floor( d + 0.5 ); //<cmath>里的函数:向上取整:floor(double);向下取整:ceil(double) }
法三:用于对 整数/2 之后的值四舍五入
if(n%2==1) m=n/2+1; //n为奇数,向上取整(0.5) else row=n/2;
3. 对数组中的元素赋相同的值 (int a[];)
法一:memset(a, 0, sizeof(a)); 法二:#define bzero(a, size) (void)memset((p), 0, (size))
4. sqrt() 函数相关
'sqrt' : ambiguous call to overloaded function. 此处涉及到C++函数重载的概念。
当编译器看到sqrt(4)的时候,它会试图去找一个sqrt(int)的函数,但是找不到。于是退而求其次,找一个可以从int转换过去的sqrt,结果一下找到了两个。一个是sqrt(long double),另一个是sqrt(float)。
编译器认为把int转换成long double或者float都很合理,于是编译器就晕菜了,不知道程序员的真正意图到底是要用哪一个。
解决:使用 sqrt(long double)、sqrt(float),或sqrtf()。 法一:sqrt(4.0) //因为4.0不是int,编译器不需要做转换,直接用对应的就行了 法二:sqrtf(4) //因为sqrtf只有一个函数原型sqrtf(float),就直接把int转换成float了
5. 有多组测试数据时
输入n,输入n个不同的数...;
输入n,输入n个不同的数...;
...多组测试
while(scanf("%d", &n) != EOF){ //EOF: end of the file for(int i=0; i<n; i++) scanf("%d", a[i]); }
6. 日期处理
(1)定义——平年和闰年每个月的天数
int month[13][2]={ {0,0}, {31,31}, {28,29}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31}, {31,31}, {30,30}, {31,31}, {30,30}, {31,31} }
(2)判断是否为闰年
bool isLeap(int year){ return (year%4==0 && year%100!=0) //1996 || (year%400==0) //2000 }
(3)eg. 求日期time1和time2的差值
int time1, y1, m1, d1; //设:总日期,年,月,日 int time2, y2, m2, d2;
7. 进制转换
(1)P进制x -> 十进制y
int y=0, product=1; //product=1, p, p^2, p^3... while(x!=0){ y=y + (x%10)*product; //x%10:每次获取x的个位 x=x/10; //去掉x的个位 product*=p; }
(2)十进制y -> Q进制z ("除基取余法" 基:要转换成的进制Q)
int z[40], num=0; //数组z存放Q进制y的每一位 do{ //do...while使满足:y=0时,z[0]=0 z[num++] = y%Q; //从后往前输出,即Q进制数z y = y/Q; }while(y!=0);
8. 字符串处理——判断回文串
只需遍历字符串的前一半(不需要取到 i==len/2 ):
若出现字符 str[i] != str[len-1-i],则不是回文串;若前一半的所有字符 str[i]==str[len-1-i],则是回文串。
(1)while( gets(str) ) {}; //输入一整行字符串,包括空格;此处输入多行 (2)int len=strlen(str); //取字符串长度
9. 字符数组 -> 字符串
在空格的位置添加字符串结束符:" " (eg. 见PAT(B) 1009)
char str[10]; gets(str); //输入一整行字符串,包括空格,以换行结束 int k=0, len=strlen(str); for(int i=0; i<len; i++) { if(str[i] != ' ') ana[k++]=str[i]; else ana[k++]='