你该逆袭了
红色标注的是:错误的答案
蓝色标注的是:正确的答案
绿色标注的是:做题时有疑问的地方
一、复习题
1、
我的答案:
答:只会读取空格前面的字符串
#include <stdio.h>
int main()
{
char name[20] = { 0 };
printf("请输入你的姓名:");
scanf("%s", name);
printf("\n请输出你的姓名:%s\n",name);
return 0;
}
正确答案:
C 语言在使用 scanf( ) 函数读取用户输入的字符串时,如果遇到第一个空白(空格、制表符、换行符),就认为完成数据读取工作,后续数据不再写入当前变量,而只保存在输入缓冲区中。
因此读取名的 scanf( ) 函数只能够在 name[ ] 中存储第一个无空白的连续单词。在空白之后用户输入的内容仍然保存在输入缓冲区内,等待下一次 scanf( ) 函数 的输入。
因此,程序中并没有等待用户输入体重数据,而直接将刚才缓冲区内的姓赋予给体重。
#include <stdio.h>
int main()
{
char name[20] = { 0 };
double weight = 0;
printf("请输入你的姓名:");
scanf("%s", name);
printf("\n请输出你的姓名:%s\n", name);
scanf("%f", &weight);
printf("your weight is %f\n", weight);
return 0;
}
2、
答:
a:
错误答案:
2.34e+02
正确答案:
会自动将 e 计数法 转换成 十进制,保留小数点两位数字
b:
Hi)
105 所对应的ASCII就是 ‘i’
对的
‘\41’ 的意思是 第41个ASCII字符 吗?
错误:这是八进制,一般来说写成 ‘\041’,也可以省略 0,直接写成 ‘\41’
printf("%c%c%c\n", 'H', 105, '\41'); // Hi!
正确答案:输出:Hi!,用字符型、十进制整数、八进制 转义方式打印 3 个字符。整形十进制数据 105 对应字符 ‘i’ ,‘41’ 这是八进制,一般来说写成 ‘\041’,也可以省略 0,直接写成 ‘\41’
c:
”His Hamlet was funny without being vulgar.“
has 44 characters.
预编译指令定义了 Q 为字符串 “His Hamlet was funny without being vulgar.” 。
打印时会直接通过转换说明符输出该字符串,strlen( ) 函数计算实参字符串 Q 的长度,即 42 ,并输出。
需要注意的是,strlen( ) 函数并没有计算字符串结尾 ‘\0’。
#include <stdio.h>
#define Q "his hamlet was funny without being vulgar."
int main()
{
printf("%s\nhas %d characters.\n", Q, strlen(Q)); //值得注意
return 0;
}
d:
1.20e+03
1201.00
3、
在双引号前面加上 \
4、
#include <stdio.h>
#define B "booboo" //一定要加上双引号
#define X 10
int main()
{
int age;
char name[20];
int xp;
printf("please enter your first name.");
scanf("%s", name);
printf("all right,%s,what's your age?\n", name);
scanf("%d", &age);
xp = age + X;
printf("that's a %s! you must be at least %d.\n", B, xp);
return 0;
}
5、
#include <stdio.h>
#define BOOK "War and Peace"
int main()
{
float cost = 12.99;
float percent = 80.0;
printf("this copy of \"%s\" sells for $%.2f.\nthat is %.0f%% of list.", BOOK, cost, percent);
return 0;
}
6、
答:
a:错误答案:%10d
正确答案:%d 字段宽度 与 位数 相同不需要使用特殊修饰符
b:%4x
c:%10.3f
d:%12.2e
e:%-30s
7、
答:
a:%15lu
b:%#4x
c:%-12.2E
d:%+10.3f
e:%8.8s
注意:.数字 对于%s 转换,表示待打印字符的最大数量
8、
答:
a:%6.4d
注意:.数字 对于整形转换,表示待打印数字的最小位数。
b:错误答案:%5o
正确答案:%*o 在printf()中字段宽度由参数列表指定,使用修饰符 *
c:错误答案:%2s
正确答案:%2c 字段宽度为 2
d:%+.2f
正确答案:%+0.2f
e:%-7.5s
9、
a、
#include <stdio.h>
int main()
{
int a;
scanf("%d", &a);
printf("%d\n", a);
return 0;
}
b、
#include <stdio.h>
int main()
{
float b, c;
scanf("%f %E", &b, &c);
printf("%f %E", b, c);
return 0;
}
c、
#include <stdio.h>
int main()
{
char d[20] = { 0 };
scanf("%s", d);
printf("%s", d);
return 0;
}
d、
#include <stdio.h>
int main()
{
char e[20] = { 0 };
int f = 0;
scanf("%s %d", e, &f);
printf("%s %d", e, f);
return 0;
}
e、
#include <stdio.h>
int main()
{
char g[20] = { 0 };
int i = 0;
scanf("%*s%d", &i);
printf("%d", i);
return 0;
}
10、
答:制表符、回车、空格
正确答案:
空白指的是:空格、制表符、换行符,这 3 种空白是 scanf( ) 函数进行输入分割的符号。
11、
sizeof 运算符对应:%zd
12、
不可行,在程序中,{ } 已经用来处理别的任务了
二、编程练习
1、
#include <stdio.h>
int main()
{
char ming[20] = { 0 };
char xing[20] = { 0 };
printf("请输入名:");
scanf("%s", ming);
printf("请输入姓:");
scanf("%s", xing);
printf("名.姓:%s.%s\n", ming, xing);
return 0;
}
2、第4问我不会
a、
#include <stdio.h>
int main()
{
char ming[20] = { 0 };
char xing[20] = { 0 };
printf("请输入名:");
scanf("%s", ming);
printf("请输入姓:");
scanf("%s", xing);
printf("\"%s.%s\"\n", ming, xing);
return 0;
}
b、
#include <stdio.h>
int main()
{
char ming[20] = { 0 };
char xing[20] = { 0 };
printf("请输入名:");
scanf("%s", ming);
printf("请输入姓:");
scanf("%s", xing);
printf("\"%20s.%20s\"\n", ming, xing);
return 0;
}
c、
#include <stdio.h>
int main()
{
char ming[20] = { 0 };
char xing[20] = { 0 };
printf("请输入名:");
scanf("%s", ming);
printf("请输入姓:");
scanf("%s", xing);
printf("\"%-20s.%-20s\"\n", ming, xing);
return 0;
}
d、
我不理解意思:什么是比姓名宽度宽 3 的字段中打印名和姓???
正确答案:
#include <stdio.h>
int main()
{
char name[20] = { 0 };
int width = 0;
printf("请输入你的名字:");
scanf("%s", name);
width = printf("%s", name); //返回字符个数
putchar('\n');
printf("%d\n", width);
printf("%*s\n", (width + 3), name); //指定宽度参数
return 0;
}
3、
#include <stdio.h>
int main()
{
double a = 0;
printf("请输入小数:");
scanf("%lf", &a);
printf("%+.3f,%+.3E", a,a);
return 0;
}
4、
#include <stdio.h>
int main()
{
char name[20] = { 0 };
float height = 0;
float h = 0;
printf("请输入身高:");
scanf("%f", &height);
printf("请输入名字:");
scanf("%s", name);
printf("cm 为单位输入身高:");
scanf("%f", &h);
printf("%s,you are %.3f feet tall.\n", name, h/100.0);
printf("%s,you are %.3f feet tall.\n", name, height);
return 0;
}
5、
错误答案:
#include <stdio.h>
int main()
{
float download_speed = 18.12;
float download_context = 2.20;
printf("at %.2f megabits per second , a file of %.2f megabytes downloads in %.2f seconds\n", download_speed, download_context, download_context /download_speed);
return 0;
}
正确答案:
正确答案:megabits 和 megebytes,所以计算公式:time = size * 8 / speed ;
6、
#include <stdio.h>
#include <string.h>
int main()
{
char name1[20] = { 0 };
char name2[20] = { 0 };
int n1 = 0;
int n2 = 0;
printf("请输入姓名一:");
scanf("%s", name1);
printf("请输入姓名二:");
scanf("%s", name2);
n1 = strlen(name1);
n2 = strlen(name2);
printf("%s %s\n", name1, name2);
printf("%*d %*d\n", n1, n1, n2, n2);
printf("%s %s\n", name1, name2);
printf("%-*d %-*d\n", n1, n1, n2, n2);
return 0;
}
7、
不一样
#include <stdio.h>
#include <float.h>
int main()
{
double n1 = 1.0 / 3.0;
float n2 = 1.0 / 3.0;
printf("%.6f,%.6f\n", n1, n2); //0.333333,0.333333
printf("%.12f,%.12f\n", n1, n2); //0.333333333333,0.333333343267
printf("%.16f,%.16f\n", n1, n2); //0.3333333333333333,0.3333333432674408
printf("%d %d", FLT_DIG, DBL_DIG); // 6 15
return 0;
}
正确答案:
printf( ) 函数在打印浮点型数时使用转换说明符 %f ,double 类型也可以使用 %lf ,虽然编译器在打印时统一转换为 double类型,但是打印时的转换并不能提高原 float 类型数据的精度。