期末必做题
1
计算薪水总额
已知某公司有一批销售员工,其底薪为 2000 元,员工销售额与提成比例如下:
编程实现: 输入一个整数表示员工的销售额,计算出其薪水总额(单精度浮点型数据)并输出。
注意:薪水= 底薪 + 销售额 * 提成;薪水总额保留两位小数。
1.1
C 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 #include <stdio.h>
int main () {
int a ;
float b ;
scanf ( "%d" , & a );
if ( a <= 3000 )
{
b = 2000 ;
printf ( "%.2f" , b );
}
else if ( a > 3000 && a <= 7000 )
{
b = 2000 + a * 0.1 ;
printf ( "%.2f" , b );
}
else if ( a > 7000 && a <= 10000 )
{
b = 2000 + a * 0.15 ;
printf ( "%.2f" , b );
}
else if ( a > 10000 )
{
b = 2000 + a * 0.2 ;
printf ( "%.2f" , b );
}
return 0 ;
}
1.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include <stdio.h>
int main () {
int sales ;
scanf ( "%d" , & sales );
int salary = 2000 ;
float percent ;
if ( sales <= 3000 ) {
percent = 0 ;
} else if ( sales <= 7000 ) {
percent = 0.1 ;
} else if ( sales <= 10000 ) {
percent = 0.15 ;
} else {
percent = 0.2 ;
}
float income = salary + ( sales * percent );
printf ( "%0.2f" , income );
return 0 ;
}
2
判断成绩的等级
以下为某学校以成绩划分等级的规则:
Text Only 成绩等于 100 分,S级;
成绩在 90 ~ 99 分,A级;
成绩在 80 ~ 89 分,B级;
成绩在 70 ~ 79 分,C级;
成绩在 60 ~ 69 分,D级;
成绩在 0 ~ 59 分,E级;
编程实现: 输入一个成绩(整数),判断该成绩位于什么等级,并将等级打印输出。
2.1
C 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>
int main () {
int num ;
scanf ( "%d" , & num );
if ( num == 100 ) {
printf ( "S" );
}
if ( 90 <= num && num <= 99 ) {
printf ( "A" );
}
if ( 80 <= num && num <= 89 ) {
printf ( "B" );
}
if ( 70 <= num && num <= 79 ) {
printf ( "C" );
}
if ( 60 <= num && num <= 69 ) {
printf ( "D" );
}
if ( 0 <= num && num <= 59 ) {
printf ( "E" );
}
return 0 ;
}
2.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <stdio.h>
int main () {
int grade ;
scanf ( "%d" , & grade );
if ( grade == 100 ) {
printf ( "S" );
} else if ( grade <= 99 && grade >= 90 ) {
printf ( "A" );
} else if ( grade <= 89 && grade >= 80 ) {
printf ( "B" );
} else if ( grade <= 79 && grade >= 70 ) {
printf ( "C" );
} else if ( grade <= 69 && grade >= 60 ) {
printf ( "D" );
} else if ( grade <= 59 && grade >= 0 ) {
printf ( "E" );
}
return 0 ;
}
3
输出商品信息
已知四种商品的编号,名称及其单价为:
编号
名称
单价
1
薯片(crisps)
3.0 元/公斤
2
爆米花(popcorn)
2.5 元/公斤
3
巧克力(chocolate)
4.0 元/公斤
4
可乐(cola)
3.5 元/份
编程实现: 输入一个商品的编号,输出其英文名称和单价,当输入不存在的编号时,输出none
。
3.1
C 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 #include <stdio.h>
int main () {
int number ;
scanf ( "%d" , & number );
switch ( number ) {
case 1 :
printf ( "crisps: " );
printf ( "3.0 \n " );
break ;
case 2 :
printf ( "popcorn: " );
printf ( "2.5 \n " );
break ;
case 3 :
printf ( "chocolate: " );
printf ( "4.0 \n " );
break ;
case 4 :
printf ( "cola: " );
printf ( "3.5 \n " );
break ;
default :
printf ( "none \n " );
break ;
}
return 0 ;
}
3.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h>
int main () {
int number ;
scanf ( "%d" , & number );
if ( number == 1 ) {
printf ( "crisps: 3.0" );
} else if ( number == 2 ) {
printf ( "popcorn: 2.5" );
} else if ( number == 3 ) {
printf ( "chocolate: 4.0" );
} else if ( number == 4 ) {
printf ( "cola: 3.5" );
} else {
printf ( "none" );
}
return 0 ;
}
4
任务描述
请你编写程序:现在老师想知道一班的等级,即给出一百分制成绩,要求输出该班成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。90 分以上为‘A’,80~89 分为‘B’,70~79 分为‘C’,60~69 分为‘D’,60 分以下为‘E’。
实现思路
使用多个 if...else...
语句判断输入的成绩 score
符合上面的哪种情况,根据情况不同,计算出不同的结果。
4.1
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <stdio.h>
int main () {
int score ;
scanf ( "%d" , & score );
if ( score >= 90 && score <= 100 ) {
printf ( "成绩等级:A \n " );
} else if ( score >= 80 && score < 90 ) {
printf ( "成绩等级:B \n " );
} else if ( score >= 70 && score < 80 ) {
printf ( "成绩等级:C \n " );
} else if ( score >= 60 && score < 70 ) {
printf ( "成绩等级:D \n " );
} else if ( score >= 0 && score < 60 ) {
printf ( "成绩等级:E \n " );
} else {
printf ( "请输入有效的成绩(0-100)。 \n " );
}
return 0 ;
}
4.2
C 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>
int main ()
{
double score ;
char grade ;
scanf ( "%lf" , & score );
while ( score > 100 || score < 0 ) {
printf ( "error \n " );
scanf ( "%lf" , & score );
}
switch (( int )( score / 10 )) {
case 10 :
case 9 : grade = 'A' ; break ;
case 8 : grade = 'B' ; break ;
case 7 : grade = 'C' ; break ;
case 6 : grade = 'D' ; break ;
case 5 :
case 4 :
case 3 :
case 2 :
case 1 :
case 0 : grade = 'E' ;
}
printf ( "%c \n " , grade );
return 0 ;
}
5
输出三个数中的最大数
有 3 个整数 a,b,c,由键盘输入,输出其中最大的数。
5.1
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h>
int main () {
double weight1 , weight2 , weight3 ;
scanf ( "%lf %lf %lf" , & weight1 , & weight2 , & weight3 );
if ( weight1 > weight2 && weight1 > weight3 ) {
printf ( "%.2lf \n " , weight1 );
} else if ( weight2 > weight1 && weight2 > weight3 ) {
printf ( "%.2lf \n " , weight2 );
} else if ( weight3 > weight1 && weight3 > weight2 ) {
printf ( "%.2lf \n " , weight3 );
} else {
printf ( "无法确定最重的羊,可能有两只或三只羊的体重相同。 \n " );
}
return 0 ;
}
5.2
C 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 // 参考答案一
#include <stdio.h>
int main ()
{
int a , b , c ;
scanf ( "%d %d %d" , & a , & b , & c );
if ( a < b ) {
if ( b < c ) {
printf ( "%d \n " , c );
}
else {
printf ( "%d \n " , b );
}
}
else if ( a < c ) {
printf ( "%d \n " , c );
}
else {
printf ( "%d \n " , a );
}
return 0 ;
}
/* 参考答案二
#include <stdio.h>
int main()
{
int a, b, c, temp, max;
scanf("%d %d %d", &a, &b, &c);
temp = (a > b) ? a : b;
max = (temp > c) ? temp : c;
printf("%d\n", max);
return 0;
}
*/
6
兑换人名币
用 100 元人民币兑换 10 元、5 元和 1 元的纸币(每一张都要有)共 50 张。
用穷举法列出每种方案各兑换多少张纸币。
6.1
C 1
2
3
4
5
6
7
8
9
10
11
12
13 #include <stdio.h>
int main () {
for ( int a = 0 ; a <= 50 ; a ++ ) {
for ( int b = 0 ; b <= 50 ; b ++ ) {
int c = 50 - a - b ;
if ( c >= 1 && a * 10 + b * 5 + c == 100 ) {
printf ( "10元: %d, 5元: %d, 1元: %d \n " , a , b , c );
}
}
}
return 0 ;
}
6.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13 #include <stdio.h>
int main () {
for ( int i = 10 ; i <= 100 ; i += 10 ) {
for ( int j = 5 ; j <= 100 - i ; j += 5 ) {
int k = 100 - i - j ;
if (( i / 10 + j / 5 + k ) == 50 && i + j + k == 100 ) {
printf ( "10元: %d, 5元: %d, 1元: %d \n " , i / 10 , j / 5 , k );
}
}
}
return 0 ;
}
7
任务描述
小明想拥有一个简易计算器来计算课后题四则运算,请你来编写程序:输入操作数一number1
、操作符operator
和操作数二number2
, 求该表达式的值.
注意: 除法算式输出时,输出浮点数,其他算式输出整数。若除数为 0, 则输出The divsior is 0
.
实现思路
使用多个 switch...
语句判断输入的操作符operator
,符合上面的哪种情况,根据情况不同,计算出不同的结果.
7.1
C 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 #include <stdio.h>
int main () {
double number1 , number2 ;
char operator ;
double result ;
scanf ( "%lf" , & number1 );
scanf ( " %c" , & operator );
scanf ( "%lf" , & number2 );
switch ( operator ) {
case '+' :
result = number1 + number2 ;
printf ( "%d \n " , ( int ) result );
break ;
case '-' :
result = number1 - number2 ;
printf ( "%d \n " , ( int ) result );
break ;
case '*' :
result = number1 * number2 ;
printf ( "%d \n " , ( int ) result );
break ;
case '/' :
if ( number2 == 0 ) {
printf ( "The divsior is 0 \n " );
} else {
result = number1 / number2 ;
printf ( "%.6lf \n " , result );
}
break ;
default :
printf ( "无效的操作符 \n " );
break ;
}
return 0 ;
}
7.2
C 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 #include <stdio.h>
int main ()
{
int x , y ;
char flag ;
scanf ( "%d %c %d" , & x , & flag , & y );
switch ( flag )
{
case '+' :
printf ( "%d \n " , x + y );
break ;
case '-' :
printf ( "%d \n " , x - y );
break ;
case '*' :
printf ( "%d \n " , x * y );
break ;
case '/' :
if ( y == 0 )
{
printf ( "The divsior is 0" );
break ;
}
printf ( "%f \n " , ( float ) x / ( float ) y );
break ;
}
return 0 ;
}
8
打印数字
编程实现: 从键盘输入两个正整数,第一个正整数 n 表示行数,第二个正整数 m 表示每一行最大的数。请用循环在屏幕上打印一个 n 行 m 列的数字矩形。
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <stdio.h>
int main () {
int a , num ;
scanf ( "%d" , & a );
scanf ( "%d" , & num );
for ( int i = 1 ; i <= a ; i ++ )
{
for ( int j = 1 ; j <= num ; j ++ )
{
printf ( "%d " , j );
}
printf ( " \n " );
}
return 0 ;
}
9
打印矩形
请用程序实现: 从键盘输入两个正整数,分别表示行和列,请用循环在屏幕上打印一个 n 行 m 列的星号矩形。
C 1
2
3
4
5
6
7
8
9
10
11
12
13 #include <stdio.h>
int main () {
int n , m ;
scanf ( "%d %d" , & n , & m );
for ( int i = 0 ; i < n ; i ++ ) {
for ( int j = 0 ; j < m ; j ++ ) {
printf ( "*" );
}
printf ( " \n " );
}
return 0 ;
}
10
统计公倍数
请用程序实现: 输入两个正整数n1, n2
,统计1000(含)
以内有多少个n1
和n2
的公倍数,并将统计结果输出。
输入格式
在一行中输入两个大于 0 的整数,中间用空格分隔。
10.1
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include <stdio.h>
int main ()
{
int n1 , n2 ;
int sum = 0 ;
scanf ( "%d %d" , & n1 , & n2 );
for ( int i = 0 ; i <= 1000 ; i ++ )
{
if ( i % n1 == 0 && i % n2 == 0 )
{
sum ++ ;
}
}
printf ( "%d" , sum - 1 );
return 0 ;
}
10.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <stdio.h>
int main () {
int n1 , n2 ;
scanf ( "%d %d" , & n1 , & n2 );
int i , count = 0 ;
for ( i = 1 ; i <= 1000 ; i ++ ) {
if ( i % n1 == 0 && i % n2 == 0 ) {
count += 1 ;
}
}
printf ( "%d" , count );
return 0 ;
}
11
水仙花数
”水仙花数“是指一个三位数,其各位数字立方和等于该数本身。例如153 = 1³ + 5³ + 3³
,所以153
是一个水仙花数。
编程实现: 请输入一个三位数,找出100 ~ num(含)
中的所有水仙花数,并将找出的水仙花数输出。
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include <stdio.h>
int main () {
int num ;
int a , b , c ;
scanf ( "%d" , & num );
for ( int i = 100 ; i <= num ; i ++ ) {
a = i % 10 ;
b = ( i / 10 ) % 10 ;
c = i / 100 ;
if ( a * a * a + b * b * b + c * c * c == i ) {
printf ( "%d \n " , i );
}
}
return 0 ;
}
12
阶乘
编程实现: 输入一个正整数,计算并输出它的阶乘。
注意:结果以单精度浮点型数据输出,保留 2 位小数。n!=1×2×3×…×n。
12.1
C 1
2
3
4
5
6
7
8
9
10
11
12 #include <stdio.h>
int main () {
int n ;
scanf ( "%d" , & n );
float factorial = 1.0 ;
for ( int i = 1 ; i <= n ; i ++ ) {
factorial *= i ;
}
printf ( "%.2f \n " , factorial );
return 0 ;
}
12.2
C 1
2
3
4
5
6
7
8
9
10
11
12 #include <stdio.h>
int main () {
int num ;
scanf ( "%d" , & num );
float sum = 1.0 ;
for ( int i = 1 ; i < num + 1 ; i ++ ) {
sum = sum * i ;
}
printf ( "%.2f" , sum );
return 0 ;
}
13
将数组首尾互换后输出
编程实现 :将一个数组{11,9,8,2,1,0}首尾互换后输出。
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <stdio.h>
#define N 6
void conv ( int a []) {
int temp ;
for ( int i = 0 ; i < N / 2 ; i ++ ) {
temp = a [ i ];
a [ i ] = a [ N - i - 1 ];
a [ N - i - 1 ] = temp ;
}
}
int main () {
int a [ N ] = { 11 , 9 , 8 , 2 , 1 , 0 }, i ;
conv ( a );
for ( i = 0 ; i < N ; i ++ ) {
printf ( "%4d" , a [ i ]);
}
return 0 ;
}
14
求矩阵主对角线元素之和
编程实现 :求一个5*5整型矩阵主对角线元素之和。
C 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 N 5
int sum ( int a [ N ][ N ]) {
int s = 0 ;
int i ;
for ( i = 0 ; i < N ; i ++ )
s = s + a [ i ][ i ];
return s ;
}
int main () {
int a [ N ][ N ], s ;
int i , j ;
printf ( "请输入N*N个元素: \n " );
for ( i = 0 ; i < N ; i ++ ) {
for ( j = 0 ; j < N ; j ++ )
scanf ( "%d" , & a [ i ][ j ]);
}
s = sum ( a );
printf ( "主对角线元素之和为%d \n " , s );
return 0 ;
}
15
统计多行文字的字符个数
有一篇文章,共有 3 行文字,每行有 80 个字符。要求分别统计出其中英文大写字母、小写字母、数字、空格以及其他字符的个数。
注意,使用二维数组模拟文章的三行文字,并于键盘输入三行文字的内容。
C 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>
int main () {
int i , j , upp , low , dig , spa , oth ;
char text [ 3 ][ 80 ];
upp = low = dig = spa = oth = 0 ;
for ( i = 0 ; i < 3 ; i ++ ) {
gets ( text [ i ]);
for ( j = 0 ; j < 80 && text [ i ][ j ] != '\0' ; j ++ ) {
if ( text [ i ][ j ] >= 'A' && text [ i ][ j ] <= 'Z' )
upp ++ ;
else if ( text [ i ][ j ] >= 'a' && text [ i ][ j ] <= 'z' )
low ++ ;
else if ( text [ i ][ j ] >= '0' && text [ i ][ j ] <= '9' )
dig ++ ;
else if ( text [ i ][ j ] == ' ' )
spa ++ ;
else
oth ++ ;
}
}
printf ( "upper case: %d \n " , upp );
printf ( "lower case: %d \n " , low );
printf ( "digit : %d \n " , dig );
printf ( "space : %d \n " , spa );
printf ( "other : %d \n " , oth );
}
16
冒泡排序之升序
请用程序实现: 输入10
个整数, 对这10
个整数进行冒泡排序, 使其按照从小到大的顺序排列, 并将排列后的结果输出.
16.1
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <stdio.h>
int main () {
int arr [ 10 ] = { 0 };
for ( int i = 0 ; i < 10 ; i ++ ) {
scanf ( "%d" , & arr [ i ]);
}
for ( int j = 0 ; j < 9 ; j ++ ) {
for ( int i = 0 ; i < 9 - j ; i ++ ) {
if ( arr [ i ] > arr [ i + 1 ]) {
int tmp = arr [ i ];
arr [ i ] = arr [ i + 1 ];
arr [ i + 1 ] = tmp ;
}
}
}
for ( int i = 0 ; i < 10 ; i ++ )
{
printf ( "%d " , arr [ i ]);
}
return 0 ;
}
16.2
C 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 #include <stdio.h>
#define N 10
void Input ( int b [ N ]) {
//输入函数
int i ;
printf ( "请输入%d个整数: \n " , N );
for ( i = 0 ; i < N ; i ++ ) {
scanf ( "%d" , & b [ i ]);
}
}
void BubbleSort ( int b [ N ]) {
//冒泡排序函数
int i , j , t ;
for ( i = 0 ; i < N -1 ; i ++ ) {
//外层循环控制趟数
for ( j = 0 ; j < N -1 - i ; j ++ ) {
//内层循环控制每趟的比较次数
if ( b [ j ] > b [ j + 1 ]) {
t = b [ j ];
b [ j ] = b [ j + 1 ];
b [ j + 1 ] = t ;
}
}
}
}
void Print ( int b [ N ]) {
//输出函数
int i ;
for ( i = 0 ; i < N ; i ++ ) {
if ( i % 10 == 0 )
printf ( " \n " );
printf ( "%6d" , b [ i ]);
}
printf ( " \n " );
}
int main () {
int a [ N ];
Input ( a );
printf ( "排序前:" );
Print ( a );
BubbleSort ( a );
printf ( "排序后:" );
Print ( a );
return 0 ;
}
17
杨辉三角
任务要求
杨辉三角,又称贾宪三角形、帕斯卡三角形,是二项式系数在三角形中的一种几何排列。其中前10行样式如下:
Text Only 1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
编写程序,输入一个整数 number,通过二维数组的方式输出杨辉三角的第 number 行。
实现思路
定义一个100*100
的数组
for循环遍历并定义第i行的第i个元素以及第i行的第1个元素都为1
当长度大于2时,执行如下算法
Text Only for (j = 1; j <= i-1; j++)
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
17.1
C 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 #include <stdio.h>
int main ()
{
int arr [ 100 ][ 100 ] = { 0 };
for ( int i = 0 ; i < 100 ; i ++ )
{
arr [ i ][ i ] = 1 ;
arr [ i ][ 0 ] = 1 ;
if ( i > 1 )
{
for ( int j = 1 ; j <= i - 1 ; j ++ ) {
arr [ i ][ j ] = arr [ i - 1 ][ j - 1 ] + arr [ i - 1 ][ j ];
}
}
}
int number ;
scanf ( "%d" , & number );
for ( int i = 0 ; i < number ; i ++ )
{
printf ( "%d " , arr [ number - 1 ][ i ]);
}
return 0 ;
}
17.2
C 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>
int main ()
{
int length , arr [ 100 ][ 100 ], i , j ;
scanf ( "%d" , & length );
for ( i = 0 ; i < length ; i ++ ){
arr [ i ][ i ] = 1 ;
arr [ i ][ 0 ] = 1 ;
}
if ( length > 2 ) {
for ( i = 2 ; i < length ; i ++ )
for ( j = 1 ; j <= i -1 ; j ++ )
arr [ i ][ j ] = arr [ i -1 ][ j -1 ] + arr [ i -1 ][ j ];
}
for ( i = 0 ; i < length ; i ++ ) {
printf ( "%6d" , arr [ length -1 ][ i ]);
}
printf ( " \n " );
return 0 ;
}
18
统计字符个数
请用程序实现: 输入一个长度不超过100
的字符串string
,分别统计出这个字符串包含的英文字母、空格、数字和其他字符的个数。
提示: 如果'A' <= char <= 'Z'
,则char
是一个大写字母。
注意: C语言中,可以使用char string_name[num]
保存字符串数据,其中num
表示字符串的最大长度;可以使用gets(string_name)
获取从键盘输入的字符串并将输入的字符串保存到变量string_name
中,可以使用strlen(string_name)
获取字符串string_name
的长度。
18.1
C 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 //关于此题的说明:使用的gets函数并不适用于所有编译环境,所以使用时要注意。
//注意引用头文件<string.h>
#include <stdio.h>
#include <string.h>
int main () {
char string_name [ 101 ];
int letter = 0 , space = 0 , number = 0 , other = 0 ;
//scanf("%s",&string);
//string_name[101]={string};
gets ( string_name );
int num = strlen ( string_name );
for ( int i = 0 ; i < num ; i ++ )
{
if ( string_name [ i ] >= 'A' && string_name [ i ] <= 'Z' )
{
letter ++ ;
}
else if ( string_name [ i ] >= 'a' && string_name [ i ] <= 'z' )
{
letter ++ ;
}
else if ( string_name [ i ] >= '0' && string_name [ i ] <= '9' )
{
number ++ ;
}
else if ( string_name [ i ] == ' ' )
{
space ++ ;
}
else
{
other ++ ;
}
}
printf ( "letter:%d \n space:%d \n number:%d \n other:%d \n " , letter , space , number , other );
return 0 ;
}
18.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include <stdio.h>
#include <string.h>
int main () {
char string [ 100 ];
gets ( string );
int char_num = 0 , space_num = 0 , number_num = 0 , other_num = 0 ;
for ( int i = 0 ; i < strlen ( string ); i ++ ) {
if (( 'a' <= string [ i ] && string [ i ] <= 'z' ) || ( 'A' <= string [ i ] && string [ i ] <= 'Z' )) {
char_num += 1 ;
} else if ( string [ i ] == ' ' ) {
space_num += 1 ;
} else if ( '0' <= string [ i ] && string [ i ] <= '9' ) {
number_num += 1 ;
} else {
other_num += 1 ;
}
}
printf ( "letter: %d \n " , char_num );
printf ( "space: %d \n " , space_num );
printf ( "number: %d \n " , number_num );
printf ( "other: %d \n " , other_num );
return 0 ;
}
19
小写字母转换为密码
编写一个程序,输入一个小写字母,并将它转换为密码。转换规则:将 ‘a’变成’Z’,将 ‘b’变成’Y’,将 ‘c’变成’X’…。
19.1
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <stdio.h>
int main () {
char low ;
// 输入小写字母
scanf ( " %c" , & low );
// 转换为密码
char password = 'Z' - ( low - 'a' );
// 输出密码
printf ( "%c \n " , password );
return 0 ;
}
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <stdio.h>
char fun ( char c );
int main () {
char ch ;
scanf ( "%c" , & ch );
ch = fun ( ch );
printf ( "%c" , ch );
return 0 ;
}
char fun ( char c ) {
return ( 'Z' - ( c - 'a' ));
}
19.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h>
char fun ( char c );
int main () {
char c ;
printf ( "请输入一个小写字母:" );
scanf ( "%c" , & c );
c = fun ( c );
printf ( "%c \n " , c );
return 0 ;
}
char fun ( char c ) {
char c1 ;
c1 = 'z' - ( c - 'a' ) -32 ;
return c1 ;
}
20
连接两字符串的函数
在函数中将两个字符串string1, string2
连接成一个字符串string
。
函数定义
Text Only int concatenate (char string1[], char string2[], char string[]);
参数说明
参数 string1、string2、string 均是字符串,在函数中将 string1 和 string2 连接为一个字符串 string,且 string1 在 string2 前。
C 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 #include <stdio.h>
int concatenate ( char string1 [], char string2 [], char string []) {
int i , j ;
for ( i = 0 ; string1 [ i ] != '\0' ; i ++ ) {
string [ i ] = string1 [ i ];
}
for ( j = 0 ; string2 [ j ] != '\0' ; j ++ ) {
string [ i + j ] = string2 [ j ];
}
string [ i + j ] = '\0'
}
int main () {
char string1 [ 100 ], string2 [ 100 ], string [ 100 ];
//scanf("%s", string1);
//scanf("%s", string2);
//fgets(string1, sizeof(string1), stdin);
//fgets(string2, sizeof(string2), stdin);
gets ( string1 );
gets ( string2 );
concatenate ( string1 , string2 , string );
printf ( "%s \n " , string );
return 0 ;
}
21
反序存放字符串的函数
在函数中将字符串按反序存放。
函数定义
Text Only int inverse (char str[]);
参数说明
参数 str 是字符串,在函数中需要将该字符串进行反序存放。
21.1
C 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 #include <stdio.h>
#include <string.h>
// 函数声明
void inverse ( char str []);
int main () {
char inputString [ 100 ];
// 输入字符串
fgets ( inputString , sizeof ( inputString ), stdin );
// 调用函数反序存放字符串
inverse ( inputString );
// 输出结果
printf ( " %s \n " , inputString );
return 0 ;
}
// 反序存放字符串的函数
void inverse ( char str []) {
int length = strlen ( str );
// 使用两个指针进行反序交换
int start = 0 ;
int end = length - 1 ;
while ( start < end ) {
// 交换字符
char temp = str [ start ];
str [ start ] = str [ end ];
str [ end ] = temp ;
// 移动指针
start ++ ;
end -- ;
}
}
21.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <stdio.h>
#include <string.h>
int inverse ( char str []) {
char t ;
int i , j ;
for ( i = 0 , j = strlen ( str ); i < strlen ( str ) / 2 ; i ++ , j -- ) {
t = str [ i ];
str [ i ] = str [ j - 1 ];
str [ j - 1 ] = t ;
}
}
int main () {
char str [ 100 ];
scanf ( "%s" , str );
inverse ( str );
printf ( "%s \n " , str );
return 0 ;
}
22
判断素数的函数
编程实现: 请完善函数isPrime
。isPrime
函数的功能是判断一个数是否为素数,如果是素数,则输出Yes
,不是素数则输出No
。
注意:请不要修改 main 函数中的代码。
参数说明
参数 num 是整数,在函数中需要判断该数是否为素数。
22.1
C 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>
// 函数声明
void isPrime ( int num );
int main () {
int num ;
// 输入整数
scanf ( "%d" , & num );
// 调用函数判断素数
isPrime ( num );
return 0 ;
}
// 判断素数的函数
void isPrime ( int num ) {
if ( num < 2 ) {
printf ( "No \n " ); // 小于2的数不是素数
return ;
}
zfor ( int i = 2 ; i * i <= num ; i ++ ) {
if ( num % i == 0 ) {
printf ( "No \n " ); // 能够被整除,不是素数
return ;
}
}
printf ( "Yes \n " ); // 没有找到能够整除的因子,是素数
}
22.2
C 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>
int isPrime ( int num ) {
if ( num < 2 ) {
printf ( "No \n " );
}
else if ( num == 2 || num == 3 ) {
printf ( "Yes \n " );
}
else {
int flag = 1 , i ;
for ( i = 2 ; i <= num / 2 && flag == 1 ; i ++ )
if ( num % i == 0 )
flag = 0 ;
if ( flag )
printf ( "Yes \n " );
else
printf ( "No \n " );
}
return 0 ;
}
int main () {
int num = 11 ;
isPrime ( num );
return 0 ;
}
23
计算年龄
有 n 个人围坐在一起,问第 n 个人多大年纪,他说比第 n-1 个人大 2 岁;问第 n-1 个人,他说比第 n-2 个人大 2 岁;…………,以此类推,问第 2 个人,他说比第 1 个人大 2 岁。第 1 个人说自己 10 岁。
编程实现: 请完善函数age
。age
函数的功能是用递归法计算并输出第 n 个人的年龄。
注意:请不要修改 main 函数中的代码。
参数说明
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include <stdio.h>
int age ( int n ) {
if ( n == 1 ) {
return 10 ;
} else {
return age ( n - 1 ) + 2 ;
}
}
int main () {
int n ;
scanf ( "%d" , & n );
int ages = age ( n );
printf ( "%d \n " , ages );
return 0 ;
}
24
最小公倍数
编程实现: 请完善函数common_multiple
。common_multiple
函数的功能是计算并返回两个整数的最小公倍数。
注意:请不要修改 main 函数中的代码。
参数说明
24.1
C 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 #include <stdio.h>
// 函数声明
int common_multiple ( int number1 , int number2 );
int main () {
int number1 , number2 ;
// 输入两个整数
scanf ( "%d %d" , & number1 , & number2 );
// 调用函数计算最小公倍数
int result = common_multiple ( number1 , number2 );
// 输出结果
printf ( "%d \n " , result );
return 0 ;
}
// 计算最小公倍数的函数
int common_multiple ( int number1 , int number2 ) {
int max = ( number1 > number2 ) ? number1 : number2 ;
while ( 1 ) {
if ( max % number1 == 0 && max % number2 == 0 ) {
return max ;
}
max ++ ;
}
}
24.2
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h>
int common_multiple ( int number1 , int number2 ) {
int multiple ;
for ( multiple = 1 ; ; multiple ++ ) {
if ( multiple % number1 == 0 && multiple % number2 == 0 ) {
break ;
}
}
return multiple ;
}
int main () {
int multiple , number1 = 24 , number2 = 16 ;
multiple = common_multiple ( number1 , number2 );
printf ( "%d" , multiple );
return 0 ;
}
25
使用指针实现字符串复制
编程实现 :编写函数void StrCopy(char ps1, char ps2),其功能:把字符串ps2的内容复制到字符串ps1中,要求不能使用strcpy函数。主函数输入两个字符串和调用StrCopy函数输出复制后ps1的字符串。
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #include <stdio.h>
#define N 30
void StrCopy ( char * ps1 , char * ps2 ) {
while ( * ps2 ) {
* ps1 ++ = * ps2 ++ ;
}
* ps1 = '\0' ;
}
int main () {
char str1 [ N ], str2 [ N ];
fgets ( str1 , N , stdin );
fgets ( str2 , N , stdin );
// scanf("%s%s", str1, str2);
StrCopy ( str1 , str2 );
printf ( "复制后的字符串为: \n " );
// puts(str1);
printf ( "%s" , str1 );
return 0 ;
}
26
使用指针实现删除数组中指定元素
编程实现 :编写一个函数void Delete(int *a,int i)
,用于实现删除数组a中第i个元素。
C 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 #include <stdio.h>
#define N 10
void Delete ( int * a , int i ) {
for (; i < N - 1 ; i ++ ) {
* ( a + i ) = * ( a + i + 1 );
}
}
int main () {
int a [ N ], i , n ;
printf ( "请输入%d个整数:" , N );
for ( i = 0 ; i < N ; i ++ ) {
scanf ( "%d" , & a [ i ]);
}
printf ( "请输入删除数组中第几个元素:" );
scanf ( "%d" , & n );
Delete ( a , n );
printf ( "删除数组中第%d个元素后的数据为: \n " , n );
for ( i = 0 ; i < N - 1 ; i ++ ) {
printf ( "%d " , a [ i ]);
}
printf ( " \n " );
return 0 ;
}
27
用指针求平均成绩
编程实现: 请完善函数average
。average
函数的功能是计算成绩数组中的平均成绩,并将平均成绩返回。
注意:请不要修改 main 函数中的代码。
参数说明
n
,整型,表示成绩数组的长度。
score
,整型指针,表示保存成绩的数组。
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 #include <stdio.h>
double average ( int n , int * score ) {
double ave = 0 ;
for ( int i = 0 ; i < n ; i ++ ) {
ave = ave + score [ i ];
}
ave = ave / n ;
return ave ;
}
int main () {
int n = 10 , score [ 10 ] = { 88 , 99 , 76 , 78 , 89 , 93 , 95 , 86 , 92 , 85 };
double ave_score ;
ave_score = average ( n , score );
printf ( "%f \n " , ave_score );
return 0 ;
}
28
用指针对数组元素排序
编程实现: 请完善函数sort
。sort
函数的功能是使用指针对数组元素进行由小到大排序。
注意:请不要修改 main 函数中的代码。
参数说明
n
,整型,表示数组长度。
p
,整型指针,表示需要排序的数组。
C 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 #include <stdio.h>
void sort ( int n , int * p ) {
int i , j , t ;
for ( i = 0 ; i < n - 1 ; i ++ ) {
for ( j = 0 ; j < n - 1 - i ; j ++ ) {
if ( p [ j ] > p [ j + 1 ]) {
t = p [ j ];
p [ j ] = p [ j + 1 ];
p [ j + 1 ] = t ;
}
}
}
}
int main () {
int arr [ 10 ], i ;
for ( i = 0 ; i < 10 ; i ++ ) {
scanf ( "%d" , & arr [ i ]);
}
sort ( 10 , arr );
printf ( "排序后:" );
for ( i = 0 ; i < 10 ; i ++ ) {
printf ( "%d " , arr [ i ]);
}
return 0 ;
}
29
用指针对两个数进行交换
编程实现: 请完善函数exchange
。exchange
函数的功能是用指针对两个整数进行交换。
注意:请不要修改 main 函数中的代码。
参数说明
p
,整型指针,存储待交换的数字一。
q
,整型指针,存储待交换的数字二。
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include <stdio.h>
void exchange ( int * p , int * q ) {
int t ;
t =* p ;
* p =* q ;
* q = t ;
}
int main () {
int a , b ;
scanf ( "%d %d" , & a , & b );
exchange ( & a , & b );
printf ( "交换后:%d %d \n " , a , b );
return 0 ;
}
30
简单的图书借阅程序
编程实现 :简单的图书借阅程序。假定图书信息包括:编号、书名、价格、借阅人姓名、是否已借出标记。程序功能:根据输入的图书编号,查找库中是否有此图书,若无此图书,输出相应信息表示没有此书;若有,再查看是否已被借出,若没有被借出,则输入借阅人姓名并将此书标记为借出,若已被借出,输出相应信息表示已被借出。
C 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 #include <stdio.h>
#include <string.h>
#define N 3
typedef struct BookList { //书的结构体
char num [ 20 ]; //图书编号
char name [ 20 ]; //书名
int price ; //书的价格
char person [ 20 ]; //借阅人
int yes ; //判断书是否已经借出,1没有借出,0已借出
} Book ;
void bookborrow ( Book * b , int n , char * bh ) {
//简单的图书借阅程序
int i , flag = 0 ; //0:要借阅的图书不存在,1:要借阅的图书存在
for ( i = 0 ; i < n ; i ++ , b ++ )
if ( strcmp ( b -> num , bh ) == 0 ) {
flag = 1 ;
break ;
}
if ( flag )
if ( b -> yes == 1 ) {
printf ( "此书可借! \n " );
} else
printf ( "此书已被借出! \n " );
else
printf ( "没有此图书! \n " );
}
/* 其它参考写法
void bookborrow(Book b[], int n, char* num) {
int flag = 0; //0:要借阅的图书不存在,1:要借阅的图书存在
for (int i = 0; i < n; i++) {
if (strcmp(b[i].num, num) == 0) {
flag = 1;
if (b[i].yes == 1) {
printf("此书可借!\n");
} else {
printf("此书已被借出!\n");
}
break;
}
}
if (!flag) {
printf("没有此图书!\n");
}
}
*/
int main () {
Book b [ N ] = {{ "J001" , "C语言程序设计" , 28 , "Mary" , 0 },{ "J002" , "JAVA程序设计" , 35 , "" , 1 },{ "T001" , "数据结构" , 26 , "" , 1 }};
char bh [ 20 ];
printf ( "请输入要借阅的图书编号: \n " );
gets ( bh );
bookborrow ( b , N , bh );
return 0 ;
}
31
读取标准输入并赋值给结构体
用函数实现,读取标准输入并赋值给结构体。
函数定义
Text Only void input_person(person *p);
函数说明
input_person
函数的功能是,将读取的标准输入赋值给结构体。
31.1
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include <stdio.h>
struct person {
char name [ 24 ];
int age ;
};
void input_person ( struct person * p ) {
// TODO:请编写代码,将标准输入的信息读入 person 的 `p` 中
fgets ( p -> name , 25 , stdin );
scanf ( "%d" , & p -> age );
}
int main () {
struct person p = { "" , 0 };
input_person ( & p );
printf ( "姓名:%s \n " , p . name );
printf ( "年龄:%d \n " , p . age );
return 0 ;
}
31.2
C 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>
#include <string.h>
typedef struct {
char name [ 50 ];
int age ;
} person ;
void input_person ( person * p ) {
printf ( "请输入姓名: " );
fgets ( p -> name , sizeof ( p -> name ), stdin ); // 读取姓名,包括换行符
p -> name [ strcspn ( p -> name , " \n " )] = '\0' ; // 去掉末尾的换行符
printf ( "请输入年龄: " );
scanf ( "%d" , & ( p -> age )); // 读取年龄
getchar (); // 消耗掉输入缓冲区中的换行符
}
int main () {
person p ;
input_person ( & p );
printf ( "姓名: %s \n " , p . name );
printf ( "年龄: %d \n " , p . age );
return 0 ;
}
32
以下程序的功能是将文件file1.c的内容输出到屏幕上并复制到文件file2.c 中,请填入适当内容。
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include <stdio.h>
int main () {
FILE * fp1 , * fp2 ;
//FILE _____;
char ch ;
fp1 = fopen ( "file1.c" , "r" );
fp2 = fopen ( "file2.c" , "w" );
while (( ch = fgetc ( fp1 )) != EOF ) {
putchar ( ch );
//putchar(_____);
fputc ( ch , fp2 )
//fputc(_____)
}
fclose ( fp1 );
fclose ( fp2 );
return 0 ;
}
33
下面程序从一个二进制文件中读入结构体数据,并把结构体数据显示在终端屏幕上。请填入适当内容。
C 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 #include <stdio.h>
struct rec {
int num ;
float total ;
};
int main () {
FILE * f ;
if (( f = fopen ( "bin.dat" , "rb" )) == NULL );
{
printf ( "cannot open \n " );
exit ( 0 );
}
reout ( f );
fclose ( f );
return 0 ;
}
void reout ( FILE * f ) {
//void reout(_____) {
struct rec r ;
fread ( & r , sizeof ( struct rec ), 1 , f );
//fread(&r,_____, 1, f);
while ( ! feof ( f )) {
printf ( "%df,%f \n " , r . num , r . total );
//printf("%df,%f\n", _____);
fread ( & r , sizeof ( struct rec ), 1 , f );
//fread(&r,_____, 1, f);
}
}
34
下述程序向文件输出的结果是
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 void WriteStr1 ( char * fn , char * str , char * rw ) {
FILE * fp ;
fp = fopen ( fn , rw );
fputs ( str , fp );
fclose ( fp );
}
void WriteStr2 ( char * fn , char * str , char * rw ) {
FILE * fp ;
fp = fopen ( fn , rw );
rewind ( fp );
fputs ( str , fp );
fclose ( fp );
}
int main () {
WriteStr1 ( "t1.dat" , "start" , "w" );
WriteStr2 ( "t1.dat" , "end" , "a" );
return 0 ;
}
startend
35
**以下程序输出的结果是 **
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 #include <stdio.h>
int main () {
FILE * fp ;
int i = 20 , j = 30 , k = 40 , n = 50 ;
fp = fopen ( "d1.dat" , "w" );
fprintf ( fp , "%d %d \n " , i , j );
fprintf ( fp , "%d %d \n " , k , n );
fclose ( fp );
fp = fopen ( "d1.dat" , "r" );
fseek ( fp , 4 , 0 );
fscanf ( fp , "%d%d" , & k , & n );
printf ( "%d,%d \n " , k , n );
fclose ( fp );
return 0 ;
}
0,40
36
程序运行后的输出结果是
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14 int main () {
FILE * fp ;
int i , k , n ;
fp = fopen ( "data.dat" , "w+" );
for ( i = 1 ; i < 6 ; i ++ ) {
fprintf ( fp , "%d" , i );
if ( i % 3 == 0 ) fprintf ( fp , "%c" , '\n' );
}
rewind ( fp );
fscanf ( fp , "%d%d" , & k , & n );
printf ( "%d %d \n " , k , n );
fclose ( fp );
return 0 ;
}
123 45
37
下述程序输出的结果是
C 1
2
3
4
5
6
7
8
9
10
11
12
13
14 int main ( ) {
FILE * fp ;
int i , a [ 4 ] = { 1 , 2 , 3 , 4 }, b ;
fp = fopen ( "data.dat" , "wb" );
for ( i = 0 ; i < 4 ; i ++ )
fwrite ( & a [ i ], sizeof ( int ), 1 , fp );
fclose ( fp );
fp = fopen ( "data.dat" , "rb" );
fseek ( fp , -2 * sizeof ( i ), SEEK_END );
fread ( & b , sizeof ( int ), 1 , fp );
fclose ( fp );
printf ( "%d \n " , b ) ;
return 0 ;
}
3