【好题分享】适合C++初学者(指针与静态)

今天咱们来继续进行好题分享,难度比上次会增加哦!

前三道是选择题,后四道是OJ题

大家一键三连,多多关注,爱你们哦!

我从简单到难,一起和大家走上漫漫刷题路!

1.关于static说法不正确的是:( )

        A.static可以修饰局部变量

        B.static可以修全局变量

        C.static修饰的变量不能改变

        D.static可以修饰函数

答案解析

本题主要考察static的特性

  1. static修饰变量

   a. 函数中局部变量:

      声明周期延长:该变量不随函数结束而结束

      初始化:只在第一次调用该函数时进行初始化

      记忆性:后序调用时,该变量使用前一次函数调用完成之后保存的值

      存储位置:不会存储在栈上,放在数据段

   b. 全局变量

     改变该变量的链接属性,让该变量具有文件作用域,即只能在当前文件中使用

   c. 修饰变量时,没有被初始化时会被自动初始化为0

  2. static修饰函数

   改变该函数的链接属性,让该函数具有文件作用域,即只能在当前文件中使用

   A:正确,原因参考上述注解

  B:正确,原因参考上述注解

  C:错误,const修饰的变量不能改变

  D:正确,原因参考上述注解

  因此:选择C

 2.下面代码的结果是什么?( )

#include <stdio.h>
int sum(int a)
{
    int c = 0;
    static int b = 3;
    c += 1;
    b += 2;
    return (a + b + c);
}
int main()
{
    int i;
    int a = 2;
    for (i = 0; i < 5; i++) 
    { 
        printf("%d,", sum(a)); 
    } 
} 

        A. 6,8,10,12,14

        B.8,10,12,14,16

        C.10,12,14,16,18

        D.12,14,16,18,20

答案解析

 本题主要考察static修饰局部变量的特性,static修饰局部变量,该变量不会随函数的结束而消失,并且只在第一次调用时进行初始化,后序调用该函数时,使用的都是上次结束前该变量的值。

  第一次循环:a=2 b=5 c=1 a+b+c=8

  第二次循环:a=2 b=7 c=1 a+b+c=10

  第二次循环:a=2 b=9 c=1 a+b+c=12

  第二次循环:a=2 b=11 c=1 a+b+c=14

  第二次循环:a=2 b=13 c=1 a+b+c=16

  因此:选择B

3. 关于指针说法正确的是:( )

        A.sizeof(char*)大小一定是1

        B.指针变量是个变量,用来存放地址

        C.指针变量的大小都是4个字节

        D.指针不是变量

答案解析

  A:错误,指针是一种复合数据类型,指针变量内容是一个地址,因此一个指针可以表示该系统的整个地址集合,

   故按照32位编译代码,指针占4个字节,按照64位编译代码,指针占8个字节(注意:不是64位系统一定占8个字  节,关键是要按照64位方式编译)

  B:正确

  C:错误,参考A选项解释

  D:错误,该条描述比较模糊 指针可以认为是一种数据类型,也可以认为是定义出来的指针变量

  

  因此,选择B

4.[BC129-小乐乐计算函数] 

描述

小乐乐学会了自定义函数,BoBo老师给他出了个问题,根据以下公式计算m的值。

其中 max3函数为计算三个数的最大值,如: max3(1, 2, 3) 返回结果为3。

输入描述:

一行,输入三个整数,用空格隔开,分别表示a, b, c。

输出描述:

一行,一个浮点数,小数点保留2位,为计算后m的值。 

题解:  

#include<stdio.h>

float max3(float a, float b, float c) {

    if (a > b && a > c) {
        return a;
    }

    else if (b > a && b > c) {

        return b;

    }

    else {

        return c;

    }

}

int main() {

    float a, b, c;

    scanf("%f %f %f", &a, &b, &c);

    double m = max3((a + b), b, c) / (max3(a, (b + c), c) + max3(a, b, (b + c)));

    printf("%f", m);

    return 0;

}

 5.[BC101-班级成绩输入输出]

描述

输入一个班级5个学生各5科成绩,输出5个学生各5科成绩及总分。

输入描述:

五行,每行输入一个学生各5科成绩(浮点数表示,范围0.0~100.0),用空格分隔。

输出描述:

五行,按照输入顺序每行输出一个学生的5科成绩及总分(小数点保留1位),用空格分隔

题解:  

#include<stdio.h>
void fen()
{
	static int count = 1;
	static float a[30] = { 0 };
	if (count <= 30) {
		scanf("%f %f %f %f %f", &a[count], &a[count + 1], &a[count + 2], &a[count + 3], &a[count + 4]);
		a[count + 5] = a[count] + a[count + 1] + a[count + 2] + a[count + 3] + a[count + 4];
		count += 6;
	}
	else
	{
		for (int i = 1; i <= 30; i += 5) {
			printf("%.1f %.1f %.1f %.1f %.1fn", a[i], a[i + 1], a[i + 2], a[i + 3], a[i + 4], a[i + 5]);
		}
	}
}
int main()
{
	for (int i = 0; i < 6; i++) {
		fen();
	}
}

 6.[BC72-平均身高]

描述

从键盘输入5个人的身高(米),求他们的平均身高(米)。

输入描述:

一行,连续输入5个身高(范围0.00~2.00),用空格分隔。

输出描述:

一行,输出平均身高,保留两位小数。

 题解:

#include<stdio.h>
int main() {
	float a, b, c, d, e, ave;
	scanf("%f %f %f %f %f", &a, &b, &c, &d, &e);
	ave = (a + b + c + d + e) / 5;
	printf("%.2f", ave);
	}

 7.[BC56-线段图案]

 

描述

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的线段图案。

输入描述:

多组输入,一个整数(1~100),表示线段长度,即“*”的数量。

输出描述:

针对每行输入,输出占一行,用“*”组成的对应长度的线段。

 题解: 

int main() {
	int a;

	while (scanf("%d", &a) != EOF) {
		for (int i = 0; i < a; i++) {
			printf("*");
		}
		printf("n");
	}
}

 

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>