1.BC9 printf的返回值
注意点:1.printf("")在printf函数里面一样可以打印 2.图中的%d对应的是在括号里的printf函数里面" "当中的字节数(其中空格也是一个字节)
举一反三:
如图,这种套中套,解法是从内往外来解,先从最里面的printf来看
第一个10:printf("%d\n", A),打印出10。
第二个3:printf("%d\n", printf("%d\n", A)),其中红色的%d对应的是里面绿色部分的字节数,绿色部分中的%d对应的是A的值即为10,所以最里面绿色部分的%d\n为10\n有3个字节,所以第二个打印的数字是%d即为3。(打印的%d也是printf("%d\n", A)的返回值).
第三个2:printf("%d\n", printf("%d\n", printf("%d\n", A))),由上可知,橙色部分的整体返回值为3,其中红色的%d对应的是蓝色部分的字节数,蓝色部分的%d对应的就是橙色部分的返回值3,所以蓝色部分%d\n为3\n有2个字节,所以打印的第三个数字是%d即为2。(打印的%d也是printf("%d\n", printf("%d\n", A))的返回值)
同理,第四个2就由此推出。
2.BC11 学生基本信息输入输出
注意点:在输入时,输入的分号要注意将汉语输入转化成英文输入!!!否则就会出现如下:printf输出时后面的b,c,d就会全是0.00
3.BC14 出生日期输入输出
注意点:
1.图中scanf里面的%4d,%2d,%2d 指输入(4+2+2=8)八个数20130512,%4d截取前4位数2013,%2截取接下来的2位数05,最后的%2d截取接下来的2位数12。(输入的数字位数为d前的常量相加之和N,倘若输入多,则只截取前N位 )
2.图中printf里面的%02d 指输出两位十进制数,未满两位则在左边补上0。比如输出0087,用%d则打印87,用%3d则打印087,%4d则打印0087。总的来说,就是%md 就是必须输出一个十进制的m位的数,缺的位数就在前面补0。
4.BC46 判断是元音还是辅音
#include <stdio.h>
int main()
{
char arr[] = { 'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U' };
char a = 0;
while (scanf("%c", &a) != EOF)
{
int i = 0;
for (i = 0; i < 10; i++)
{
if (a == arr[i])
{
printf("Vowel\n");
break;
}
}
if (i == 10)
printf("Consonant\n");
}
return 0;
}
scanf函数取走相应字符后,还留下缓存区中的' \n '回车键。scanf检测到缓存区里还有字符后,接着提取使用,就会再执行一次while循环。改善:
#include <stdio.h>
int main()
{
char arr[] = { 'a', 'A', 'e', 'E', 'i', 'I', 'o', 'O', 'u', 'U' };//将元音字母放入数组更方便
char a = 0;
//下面的scanf(" %c",&a)中,在%c前加空格
while (scanf("%c", &a) != EOF)//while(~scanf("%c",&a)也是可以的
{
int i = 0;
for (i = 0; i < 10; i++)
{
if (a == arr[i])
{
printf("Vowel\n");
break;
}
}
if (i == 10)
printf("Consonant\n");
getchar();//清理缓存区
}
return 0;
}
while循环的结尾,用getchar清理输入缓存区。
还有两种方法清理缓存区里的' \n '
1.在%c后加' \n ' (仅限提取字符时可用,提取整型时不可用):
scanf("%c\n",&a),%c是从缓存区拿走一个字符,后面如果有\n,也会把缓冲区的\n拿走
2.在%c前加空格,会跳过空白字符:
第一次输入字符时,字符前面没有空白字符,直接运行。第二次输入开始时,输入缓存区还剩 ' \n ',scanf函数检测字符前有' \n '空白字符,直接跳过,提取下一个字符,从而实现每次都处理掉 \n
scanf函数结束输入时,会返回EOF - end of file,EOF值为-1
-1 的 补码:11111111111111111111111111111111
也可以改善为while(~scanf (" %c ", &a )),当scanf函数返回EOF(-1)时,~EOF (~ ( - 1 ) )
~ -1 补码按位取反:00000000000000000000000000000000
(~scanf)为0,假,while(~scanf)循环停止
5.JZ65 不用加减乘除做加法
int Add(int num1, int num2 ) {
while(num2)
{
int t = (num1 & num2) << 1;//与,相同的一个二进制位,进一位,相当于相加进一
num1 ^= num2;//异,不同的二进制位,处理后继续为一,相当于相加
num2 = t;//把加一位后的结果存进num2,以便继续相加
}
return num1;
}
6.KS33 寻找奇数
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int t = 0;
int i = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &t);
m ^= t;//出现偶数次的数会对消成0 ,只有奇数次才会保留
}
// 利用异或运算性质
// a^ a = 0
// 0 ^ a = a
// x ^ x ^ x ^ y = x ^ y
printf("%d\n", m);
return 0;
}