第一题
解题思路:C语言中,类似这种打印二维图形的题目,一般就是构造两层for循环充当二维数组,寻找图形的规律。
本题的规律是i==j,和i+j==n-1。
#include <stdio.h>
int main() {
int n;
while (scanf("%d", &n) != EOF) { // 注意 while 处理多个 case
// 64 位输出请用 printf("%lld") to
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
if((i==j)||(i+j==n-1))
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
第二题
解题思路:将两组元素存入arr[i]和arr[j]中。
1、每次使用i下标的元素和j下标的元素进行比较。(前提是i和j没有走完)
2、打印叫小的元素,然后对其进行++,再次进行比较,直到一组元素打印完。
3、再打印另一组的剩余元素(可能有一个会提前走完,剩下的都可以进行打印)
#include <stdio.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
int arr1[1000]={0};
int arr2[1000]={0};
int i =0;
int j=0;
for(int i=0;i<n;i++)
{
scanf("%d ",&arr1[i]);
}
for(int j=0;j<m;j++)
{
scanf("%d ",&arr2[j]);
}
//两个数组目前都有可以比较的元素
while((i<n)&&(j<m))
{
if(arr1[i]<arr2[j])
{
printf("%d ",arr1[i]);
i++;
}
else {
printf("%d ",arr2[j]);
j++;
}
}
//把剩下的那部分都打印了
while(i<n)
{
printf("%d ",arr1[i]);
i++;
}
while(j<m)
{
printf("%d ",arr2[j]);
j++;
}
return 0;
}
第三题
答案解析:C
A:错误,可以没有参数和返回值类型,根据具体功能实现,void函数
B:错误,函数的实参可能是变量,也可能是常量,也可能是宏,也可能是指针等等。
变量:int a = 0;常量:const int a = 0;宏:#define X = 10;然后使用宏
C:正确,在使用库函数时,必须要包含该库函数所在的头文件,否则编译器将不能识别
D:错误,库函数是语言设计者为了让用户能够更好的使用,而给出的,但并不能解决用户的所有问题,因此其他问题还需要用户自己写方法解决
第四题
答案解析:
A:正确 不同的函数属于不同的作用域,因此不同的函数中定义相同名字的变量不会冲突
B:正确 在C语言中,函数的形参一般都是通过参数压栈的方式传递的
C:正确 在函数内定义的变量,称为局部变量,局部变量只能在其定义的函数中使用
D:错误 复合语句中定义的变量只能在复合语句中使用
例如 int main(){
{int a = 0;}//复合语句
printf("%d",a);//将会打印失败
}
因此:选择D
第五题
答案解析:
A:正确,高内聚低耦合即:函数体内部实现修改了,尽量不要对外部产生影响,否则:代码不方便维护
B:错误,全局变量每个方法都可以访问,很难保证数据的正确性和安全性
C:正确,参数越少越好,否则用户在使用时体验不是很好,还得必须将所有参数完全搞明白才可以使用
D:正确,谁申请的谁维护谁释放,否则如果交给外部使用者释放,外部使用者可能不知道或者忘记,就会造成资源泄漏
因此,选择B
第六题
答案解析:
exec((vl,v2),(v3,v4),v5,v6) 总共有四个参数
(v1, v2)属于第一个实参,逗号表达式,真实的参数时v2
(v3,v4)属于第二个实参,逗号表达式,真实的参数是v4
v5属于第三个实参
v6属于第四个实参
因此选择:B
补充:int a = ++b,c++,a++;这样不是逗号表达式,其本质是int a = ++b;然后进行c++,a++。
第七题
答案解析:
A:正确,传参时不论是按照值还是指针方式传递,形参拿到的都是实参的一份拷贝
B:正确,函数没有调用时,新参没有空间
C:错误,如果是按照值的方式传递,形参和实参各自有各自的空间,改变形参不能改变外部的实参
D:正确,因为形参和实参是两个不同的变量
第八题
答案解析:
A:错误,函数可以没有返回值,如果没有返回值也就不需要带回任何结果
B:正确,形参和实参在不同的函数中,即不同的作用域,因此形参和实参可以同名
C:错误,可以使用全局变量传参
D:错误,不一定,函数的定义可以放在任意的文件中,使用时只需要包含头文件即可
因此,选择B
第九题
答案解析:
A:错误,函数的定义可以放在任意位置,函数的声明必须放在函数的使用之前
B:正确
C:错误,函数定义在使用之后,使用之前没有声明时,编译器编译时识别不了该函数
D:错误,函数的声明只是告诉编译器函数返回值类型、函数名字以及函数所需要的参数,函数定义才是说明函数是怎么实现的
第十题
A: 函数中可以没return语句,只有需要返回值,或者提前结束函数的是才使用return
B:函数中需要提前结束,但是函数的返回类型是void,不需要返回任何值的时候,就使用return;
C: 正确
D: 函数中创建的数组,只能在函数内部使用,函数中返回数组,其实是将数组的地址返回给主调函数,等函数返回后,数组空间还给操作系统了,主调函数得到的地址就是野指针了。
第十一题
思路: 0. 函数原型设计 返回值:必须要有返回值,0表示不是素数,1表示是素数 1. 检测该数据是否为素数,方法参考前文。
#include <stdio.h>
#include<math.h>
int is_prime(int n)
{
int i = 0;
for (i = 2; i <= sqrt(n); i++)
{
if (0 == n % i)
{
return 0;
}
}
return 1;
}
int main()
{
int i = 0;
for (i = 100; i <= 200; i++) {
if (is_prime(i) == 1) {
printf("%d ", i);
}
}
return 0;
}
第十二题
思路: 0. 函数原型设计 返回值:必须要有返回值,返回结果为0说明不是闰年,为非0说明时闰年 参数:年份 1. 十年一闰百年不闰:即如果year能够被4整除,但是不能被100整除,则year是闰年 2. 每四百年再一闰:如果year能够被400整除,则year是闰年
int is_leap_year(int year)
{
if(((0 == year%4)&&(0!=year%100))||(0==year%400))
{
return 1;
}
else
{
return 0;
}
}
第十三题
思路: 1. 设计函数原型,不需要返回值,参数N表示乘法口诀表总共有多少行 2. 设定两个循环,外层循环控制总共有多少行 内层循环控制每行有多少个表达式以及表达式中的内容
void PrintMulTable(int N)
{
for (int i = 1; i <= N; ++i)
{
for (int j = 1; j <= i; ++j)
{
printf("%d*%d=%2d ", j, i, j*i);
}
printf("\n");
}
}
第十四题
void Init(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
arr[i] = i + 1;
}
}
void Print(int arr[], int sz)
{
for (int i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
void Reverse(int arr[], int sz)
{
int i = 0;
int j = sz - 1;
while (i < j)
{
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = arr[i];
i++;
j++;
}
}
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]);
Init(arr, sz);
Print(arr, sz);
Reverse(arr, sz);
return 0;
}