2016年4月1日C语言作业答案及遇到的问题

题目及解答

2.一年中的第几天——改编自习题4.3


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>;
int main (void)
{
int year, month, day;
int count;
int isLeap;
while (scanf("%d%d%d", &year, &month, &day) == 3)
{
count = 0;
isLeap = (year % 4 == 0 && year % 100 != 0) || (year % 100 == 0 && year % 400 == 0);
count += day;
month -= 1;
switch (month)
{
case 12: count += 31; month -= 1;
case 11: count += 30; month -= 1;
case 10: count += 31; month -= 1;
case 9: count += 30; month -= 1;
case 8: count += 31; month -= 1;
case 7: count += 31; month -= 1;
case 6: count += 30; month -= 1;
case 5: count += 31; month -= 1;
case 4: count += 30; month -= 1;
case 3: count += 31; month -= 1;
case 2: count += 28 + isLeap; month -= 1;
case 1: count += 31; month -= 1;
default: break;
}
printf("该日期是这一年中的第%d天\n", count);
}
return 0;
}

3.税金额度计算——改编自习题4.4


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* ZhihaoChen CSEE 1501 */
#include<stdio.h>;
/* Prototype Declaration */
void if_else_process (double x);
void switch_process (double x);
/* Main Function */
int main(void)
{
int number;
scanf("%d", &number);
int t; double x;
int count;
for (count = 0 ; count & number ; ++count)
{
scanf("%d%lf", &t, &x);
switch (t)
{
case 0:
if_else_process(x);
break;
case 1:
switch_process(x);
break;
case 2:
if_else_process(x);
switch_process(x);
break;
default:
break;
}
if (count != (number - 1))
printf("\n");
}
return 0;
}
/* data processing and output */
void if_else_process (double x)
{
double output;
if (x < 1000)
output = 0;
else if (x >= 1000 && x < 2000)
output = x * 0.05;
else if (x >= 2000 && x < 3000)
output = x * 0.10;
else if (x >= 3000 && x < 4000)
output = x * 0.15;
else if (x >= 4000 && x < 5000)
output = x * 0.20;
else if (x > 5000)
output = x * 0.25;
printf ("After if-else processing,the amount of tax to be paid is : %.2f\n", output);
}

void switch_process (double x)
{
double output;
switch((int)x / 1000)
{
case 0: output = 0; break;
case 1: output = x * 0.05; break;
case 2: output = x * 0.10; break;
case 3: output = x * 0.15; break;
case 4: output = x * 0.20; break;
default: output = x * 0.25; break;
}
printf("After switch processing,the amount of tax to be paid is : %.2f\n", output);
}

4.两个实数的四则运算——改编自习题4.5


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/* ZhihaoChen CSEE 1501 */
#include<stdio.h>;
/* Prototype Declaration */
void if_else_process(double a, double b, char c);
void switch_process(double a, double b, char c);
/* Main Function */
int main(void)
{
int t, count;
double a, b;
char c;
for (count = 0 ; (scanf("%d%lf%lf %c", &t, &a, &b, &c) != EOF) ; ++count)
{
if(count != 0)
printf("\n");
switch (t)
{
case 0:
if_else_process(a, b, c);
break;
case 1:
switch_process(a, b, c);
break;
case 2:
if_else_process(a, b, c);
switch_process(a, b, c);
break;
default:
break;
}
}
return 0;
}
/* data processing and output */
void if_else_process (double a, double b, char c)
{
double output = 0.0;
if (c == '+')
output = a + b;
if (c == '-')
output = a - b;
if (c == '*')
output = a * b;
if (c == '/')
output = a / b;
printf ("After if-else processing,the result is : %.2f\n", output);
}

void switch_process (double a, double b, char c)
{
double output = 0.0;
switch(c)
{
case '+': output = a + b; break;
case '-': output = a - b; break;
case '*': output = a * b; break;
case '/': output = a / b; break;
default: break;
}
printf("After switch processing,the result is : %.2f\n", output);
}

5.合并空格字符输出——改编自习题4.7


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
#define CHAR 0
#define SPACE 1

int main (void)
{
char character;
int status = CHAR;
while ((character = getchar()) != EOF)
{
if ((character == ' ') && (status == CHAR))
{
status = SPACE;
printf(" ");
}
if ((character != ' ') && (status == CHAR))
{
printf("%c", character);
}
if ((character != ' ') && (status == SPACE))
{
status = CHAR;
printf("%c", character);
}
}
return 0;
}

6.求π的近似值——改编自习题4.10


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <math.h>

int main (void)
{
double item = 1.0;
double pi = 0.0;
int count;
for (count = 0 ; (item >= 1.0e-5) ; ++count)
{
item = 1.0/(2 * count + 1);
if (count % 2 == 0)
pi += item;
else
pi += (-item);
}
printf("%.9f\n", pi * 4);
return 0;
}

7.验证哥德巴赫猜想——改编自习题4.13


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <stdio.h>
#include <math.h>

int isPrime (int x);

int main (void)
{
int number, testnum;
scanf ("%d", &number);
int count, subnumber1, subnumber2;
for (count = 0 ; count < number ; ++count)
{
scanf("%d", &testnum);
for (subnumber1 = 2 ; subnumber1 <= (testnum / 2) ; ++subnumber1)
{
subnumber2 = testnum - subnumber1;
if (isPrime(subnumber2) && isPrime(subnumber1))
{
printf("%d=%d+%d\n", testnum, subnumber1, subnumber2);
break;
}
}
}
return 0;
}

int isPrime (int x)
{
int i;
for (i = 2 ; i <= sqrt(x) ; ++i)
if (x % i == 0) return 0;
return 1;
}

8.正整数相加求平均数——改编自习题4.17


原题链接

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
int main (void)
{
int number;
scanf("%d", &number);
int count, subcount, status; int n, positiveNumber;
long sumNumber;
double averageNumber;
for (count = 0 ; count < number ; ++count)
{
n = 0; sumNumber = 0;
positiveNumber = 0;
averageNumber = 0.0;
scanf("%d", &status);
switch(status)
{
case 0:
for (subcount = 0 ; subcount < 10 ; ++subcount)
{
scanf("%d", &n);
if (n <= 0) continue;
sumNumber += n;
positiveNumber += 1;
}
averageNumber = (double)sumNumber / positiveNumber;
if (positiveNumber != 0)
printf("In \"continue\" way,numbers=%d,average=%f\n", positiveNumber, averageNumber);
break;
case 1:
for (subcount = 0 ; subcount < 10 ; ++subcount)
{
scanf("%d", &n);
if(n > 0)
{
sumNumber += n;
positiveNumber += 1;
}
}
averageNumber = (double)sumNumber / positiveNumber;
if (positiveNumber != 0)
printf("In \"no continue\" way,numbers=%d,average=%f\n", positiveNumber, averageNumber);
break;
default:
break;
}
}
return 0;
}

要注意的问题

1.注意审题,比如第六题注意到“最后一项”的绝对值,再比如说第三题注意到输出格式逗号前后都没有空格

2.注意数据类型的范围

3.注意浮点数的科学计数法表示

4.注意条件运算要不要加等于号

5.逻辑错误比语法错误更难检查,要关注程序的细节

6.注意scanf在读取的字符(%c)时候会识别’ ‘,所以在格式化字符串中用’ %c’或者’%1s’均可(后者无法通过系统)

7.注意浮点数的运算存在精度损失,例:double i = 1/e-5 而(int)i=99999,在作为循环条件时需要格外注意,一般情况下最好避免,或者+0.0001再取整