A.单选题
2-1
设变量已正确定义并赋值,以下正确的表达式是_____。(1分)
A.x=y*5=x+z
B.int(15.8%5)
C.x=25%5.0
D.x=y+z+5,++y
答案:D
2-2
下列程序段中,非死循环的是( )。(1分)
A.
int i=100;
while(1)
{ i=i%100+1;
if(i>=100)
break;
}
B.
int k=0;
do{
++k;
}while(k>=0);
C.
int s=10;
while(s)
s++;
D.
for( ; ; )
答案:A
2-3
以下运算符优先级按从高到低排列正确的是( )。(1分)
A.算术运算、赋值运算、关系运算
B.关系运算、赋值运算、算术运算
C.算术运算、关系运算、赋值运算
D.关系运算、算术运算、赋值运算
答案:C
2-4
判断a、b中有且仅有1个值为0的表达式是( )。(1分)
A.!(a*b)&&a+b
B.(a*b)&&a+b
C.a*b==0
D.a!=0 && !b
答案:A
2-5
若有语句int x=5, *p=&x;
,则(*p)++
相当于( )。(1分)
A.x++
B.p++
C.*(p++)
D.*p++
答案:A
2-6
若p1、p2都是整型指针,p1已经指向变量x,要使p2也指向x, ____是正确的。(1分)
A.p2=p1
B.p2=**p1
C.p2=&p1
D.p2=*p1
答案:A
2-7
若有以下说明语句,
struct birthday
{
int year;
int month;
int day;
}day1;
则下面叙述正确的是( )。(1分)
A.day1
为结构体类型名
B.struct birthday
为结构体变量名
C.month
为结构体变量名
D.day1
为结构体变量名
答案:D
2-8
有以下结构体说明、变量定义和赋值语句:
struct SID
{
char name [10];
int age;
char sex;
}s[5],stu;
则以下 scanf函数调用语句有错误的是( )。(1分)
A.scanf("%s", s[0].name);
B.scanf("%d", &s[0].age);
C.scanf("%s", &stu.name);
D.scanf("%c", &stu.sex);
答案:C
2-9
有以下结构体说明、变量定义和赋值语句:
struct SID
{
char name [20];
int age;
char sex;
}students[10],stu;
则以下 scanf函数调用语句有错误的是( )。(1分)
A.scanf("%s", students[0].name);
B.scanf("%d", &students[0].age);
C.scanf("%s", &stu.name);
D.scanf("%c", &stu.sex);
答案:C
2-10
以下scanf函数调用语句中不正确的是__。
struct pupil
{
char name[20];
int age;
int sex;
} pup[5], *p=pup;
(1分)
A.scanf("%s", pup[0].name);
B.scanf("%d", &pup[0].age);
C.scanf("%d", p->age);
D.scanf("%d", &(p->sex));
答案:C
< >程序填空题
5-1
输入学生姓名、平时成绩、期末成绩、平时成绩和期末成绩的百分比,计算综合成绩。
#include <stdio.h>
struct student{
char name[20];
int s1, s2; //s1:平时成绩 s2:期末成绩
int score; //综合成绩
};
void modifyScore(struct student*pstu, int r1, int r2){
pstu->score= (pstu->s1 * r1 + pstu->s2 * r2) /100;
}
int main() {
int n, r1, r2;
struct student stu;
scanf("%s%d%d", stu.name, &stu.s1, &stu.s2);
scanf("%d%d", &r1, &r2);
modifyScore(&stu, r1, r2);
printf("%s %d\n", stu.name, stu.score);
return 0;
}
5-2
一个字符串的长度等于字符串中包含的字符个数,不包括结尾的空字符。下面函数求字符串长度,请补充完整。
int strlen_v6(const char* s)
{
const char* p = s;
while (*s!='\0')
s++;
return s-p ;
}
fn:函数题
6-1 显示矩形(循环版) (10 分)
请编写函数,用循环方法显示矩形。
函数原型
void Rect(int width, int height, char symbol);
说明:参数 width
和 height
为矩形的宽和高,symbol
为显示字符。函数将在屏幕下显示宽度为 width
、高度为 height
由字符 symbol
组成的矩形。若 width
或 height
小于等于0,则不输出。
要求:需要利用前面作业中的 Show 函数。
裁判程序
#include <stdio.h>
void Show(int number, char symbol);
void Rect(int width, int height, char symbol);
int main()
{
int w, h;
char s;
scanf("%d %d %c", &w, &h, &s);
Rect(w, h, s);
return 0;
}
......
/* 你提交的代码将被嵌在这里 */
输入样例1
-3 -4 #
结尾无空行
输出样例1
结尾无空行
注:无输出。
输入样例2
20 5 *
结尾无空行
输出样例2
********************
********************
********************
********************
********************
结尾无空行
关联习题:重复显示字符(循环版)
代码:
void Rect(int width, int height, char symbol)
{
if (width <= 0 || height <= 0) return;
else
{
for (int i = 0; i < height; i++)
{
for (int k = 0; k < width; k++)
printf("%c", symbol);
printf("\n");//说是结尾无空行,结果不空行不对,空行反倒对了
}
}
}
</>编程题
7-1 左转弯 (8 分)
请编写程序,在屏幕上显示左转弯的路标。
输入样例
注:无输入
输出样例
// // //
\\ \\ \\
代码:
#include<stdio.h>
int main()
{
printf("// // //\n\\\\ \\\\ \\\\");
return 0;
}
7-2 本题要求编写程序,输入一个三位数,输出其个位数字、十位数字和百位数字。 (10 分)
本题要求编写程序,输入一个三位数,输出其个位数字、十位数字和百位数字。
输入样例:
在这里给出一组输入。例如:
152
结尾无空行
输出样例:
152 = 2 + 5*10 + 1*100
结尾无空行
代码:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a,b,c;
a=n/100,b=n/10%10,c=n%10;
printf("%d = %d + %d*10 + %d*100",n,c,b,a);
return 0;
}
7-3 分段函数 (10 分)
已知:y是x的函数,
当x<10时,y=-x;
当x=10时,y=31;
当x>10,且x<=100时,y=3x-7;
当x>100时,y= x2-5x+1;
输入格式:
任意输入一个int类型的整数x。
输出格式:
输出为一个整数,单独占一行,即x对应的函数值。
输入样例:
5
结尾无空行
输出样例:
-5
结尾无空行
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int x, y;
scanf("%d", &x);
if (x < 10) y = -x;
else if (x == 10) y = 31;
else if (x <= 100) y = 3 * x - 7;
else y = x * x - 5 * x + 1;
printf("%d", y);
return 0;
}
7-4 最大公约数和最小公倍数 (10 分)
本题要求两个给定正整数的最大公约数和最小公倍数。
输入格式:
输入在一行中给出两个正整数M和N(≤1000)。
输出格式:
在一行中顺序输出M和N的最大公约数和最小公倍数,两数字间以1空格分隔。
输入样例:
511 292
结尾无空行
输出样例:
73 2044
结尾无空行
鸣谢安阳师范学院段晓云老师和软件工程五班李富龙同学补充测试数据!
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int x, y;
scanf("%d %d", &x, &y);
int k,lowx,lowy;
k=y, lowx = x,lowy = y;
while (x % y != 0)
{
k = y;
y = x % y;
x = k;
}
int sum;
sum = lowx * lowy / y;
printf("%d %d", y, sum);
return 0;
}
7-5 求班级平均分 (10 分)
某班级若干个学生参加测验。在得到本次测验的成绩之后,确定该班级本次测验的平均分。
输入格式:
一个班级的若干个测验成绩( 0 到 100 之间的整数),以 −1 作为结束标记(结束标记不计算平均值)。
输出格式:
班级测验成绩平均分,结果保留两位小数。
若无输入成绩,则显示 No grades were entered
。
输入样例 1:
75 94 97 88 70 64 83 89 -1
输出样例 1:
在这里给出相应的输出。例如:
82.50
输入样例 2:
-1
输出样例 2:
在这里给出相应的输出。例如:
No grades were entered
代码:
#include<stdio.h>
#include<math.h>
int main()
{
double score, sum = 0,t=0;
while (scanf("%lf", &score), score >= 0)
sum += score, t++;
if (t == 0) printf("No grades were entered");
else printf("%.2lf", sum / t);
return 0;
}
7-6 逆序输出 (10 分)
输入n个数,然后把这n个数逆序输出。
输入格式:
测试数据有多组,处理到文件尾。每组测试数据在一行上首先输入整数n,接着输入n(n<=40)个整数。
输出格式:
对于每组测试,逆序输出n个数,每两个数据之间留一个空格。每两组测试数据之间留一个空行。
输入样例:
5 1 2 3 4 5
3 1 2 3
输出样例:
5 4 3 2 1
3 2 1
代码:
#include<stdio.h>
#include<math.h>
int main()
{
int n,answer=0;
while (scanf("%d", &n) != EOF)
{
if(answer==1) printf("\n");
int a[n];
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
while (--n!=-1)
{
printf("%d", a[n]);
if(n>0) printf(" ");
}
answer=1;
printf("\n");
}
return 0;
}
7-7 统计一行文本的单词个数 (12 分)
本题目要求编写程序统计一行字符中单词的个数。所谓“单词”是指连续不含空格的字符串,各单词之间用空格分隔,空格数可以是多个。
输入格式:
输入给出一行字符。
输出格式:
在一行中输出单词个数。
输入样例:
Let's go to room 209.
输出样例:
5
鸣谢用户 张麦麦 补充数据!
代码:
//这种题用标志变量很方便
#include<stdio.h>
#include<math.h>
#include<ctype.h>
int main()
{
char a[10000] = { 0 };
gets(a);
int t = 1, i = -1,sum=0;
while (a[++i] != '\0')
{
if (a[i] == ' ')
{
t = 1;
continue;
}
if (t == 1)
{
t = 0;
sum++;
}
}
printf("%d\n", sum);
return 0;
}