C语言100题(41~60)

第41题:

题目:学习static定义静态变量的用法。

解析:这里没有什么题目可以讲。我来把static的相关概念罗列一下。
当我们使用static对一个变量进行声明时,有两种方式:
①、所有函数外,使用关键字static

#include<stdio.h>
static int count; // 静态定义、内部链接
int main(void)
{
	return 0;
}

②、块内 、使用关键字static

#include<stdio.h>
void bore(int number);
int main(void)
{
	int  i;
	scanf("%d", &i);
	bore(i);
	return 0;
}
void bore(int number)
{
	static index; //静态、无链接
	index = number;
}

在②中若不使用static对index变量进行声明,那么当这个函数执行完后,index变量所占的内存便会销毁。但如果使用static对index变量进行声明,那么当这个函数执行完后,index变量仍然存在内存中

第42题:

题目:学习使用auto定义变量的用法。

解析:举一些例子和定义来说明auto变量的用法

auto关键字是存储类别说明符,常用于为了更清楚地表达你的意图时,显式使用关键字auto(例如,为了表明有意覆盖一个外部变量定义,或者强调不要把该变量改为其他存储类别)。

其次变量具有自动存储期,即:程序进入该变量声明所在的块时变量存在,程序退出该块时变量消失。

#include <stdio.h>
int main()
{
	int  num;
	num = 6;
	for (int i = 0; i<3; i++)
	{
		printf("块外 num 变量为 %d \n", num);
		num++;
		{
			auto int num = 1;
			printf("块内 num 变量为 %d \n", num);
			num++;
		}
	}
	return 0;
}

第43题:

题目:学习使用static的另一用法。

解析:之前41题已经做了详细的讲解,这里只用一个程序来举例子

#include <stdio.h>
int main()
{
	int i, num;
	num = 6;
	for (i = 0; i<3; i++)
	{
		printf("num 变量为 %d \n", num);
		num++;
		{
			static int num = 1; //第一次声明后,存储变量的内存不会销毁
			printf("块内 num 变量为 %d\n", num);
			num++;
		}
	}
	return 0;
}

第44题:

题目:学习使用如何调用外部函数。

解析:首先要搞清楚什么外部函数,其次再是使用外部函数

外部函数:能被其他源文件调用的函数。在我们定义外部函数时,需要在函数的返回值前面添加extern关键字。
内部函数:只能在被定义的文件中使用。在定义内部函数时,需要在函数的返回值类型前面加static关键字,也被称作静态函数

①、外部函数:

 // 头文件名为:extern.h
 int sum(int x, int y)
 {
 	return x + y;
 }
 //源文件
#include<stdio.h>
#include"extern.h"
extern int sum(int x, int y);
int main(void)
{
	printf("sum = %d", sum(6, 7));
}

这里是头文件的引用,更加具体的例子,我放在了第50题

②、内部函数:

 // 第一个源文件
#include<stdio.h>
void show()
{
	printf("%s \n","inside.c");
}
 //第二个源文件
#include<stdio.h>
static void show()
{
	printf("%s \n", "This is inside function example");
}
int main(void)
{
	show();
}

第45题:

题目:学习使用register定义变量的方法。

解析:讲定义与举例子。

寄存器变量存储在CPU的寄存器中,或者概括地说,存储在最快的可用内存中。与普通变量相比,访问和处理这些变量的速度更快。但是由于寄存器变量存储在寄存器而非内存中,所以无法获取寄存器变量的地址。在大多数情况下,寄存器变量和自动变量都一样。也就是说,它们都是块作用域、无链接和自动存储期。使用存储类别说明符register便可声明寄存器变量。

#include <stdio.h>
int main()
{
	register int quick;
}

第46~48题:

题目:宏#define命令练习

解析:总结#define的各种用法

明示常量(符号常量):#define指令来定义

类对象宏定义的组成:
#define PX printf(“x is %d.\n”,x)

#define 是预处理指令

px 是宏

printf(“x is %d.\n”,x) 是替换体

常见的宏定义用法:
(1)、定义变量、字符串
#define LIMIT 20
#define FOUR 2*2
#define OW “Consistency is the last refuge of the unimagina”

(2)、在#define中使用参数
#define SQUARE (X) ((X) * (X))
#define MEAN(X,Y) (((X)+(Y)) / 2)
X与Y称为宏参数,MEAN(X,Y)称为宏,(((X)+(Y)) / 2)称为替换体
注意在宏中使用参数时,尽量使用足够的圆括号来确保运算符和结合的正确顺序,这一点很重要

(3)、用宏参数创建字符串:#运算符
在类函数宏的替换体重,# 号作为一个预处理运算符,可以把记号转换成字符串。
例如,如果x是一个宏形参,那么 #x 就是转换为字符串“x”的形参名
看下面一个例程

#include<stdio.h>
#define PSQR(x) printf("The square of "#x" is %d.\n",((x)*(x)));
int main(void)
{
	int y = 5;
	PSQR(y);
	PSQR(2 + 5);

	return 0;
}

在这里插入图片描述
(4)、预处理器黏合剂:##运算符
# 运算符类似,## 运算符可用于类函数宏的替换部分。 ## 运算把两个记号组成一个记号

#include<stdio.h>

#define XNAME(n) x ## n
#define PRINT_XN(n) printf("X" #n " = %d\n", x ## n);

int main(void)
{
	int XNAME(1) = 14; //变成int x1 = 14;
	int XNAME(2) = 20;
	int x3 = 30;

	PRINT_XN(1);
	PRINT_XN(2);
	PRINT_XN(3);

	return 0;
}

在这里插入图片描述

(5)、变参宏:… 和 _ _VA_ARGS _ _
通过把宏参数列表中最后的参数写成省略号(即,3个点 )来实现这一功能。这样,预定义宏
_ _ VA _ ARGS _ _ 可用再替换部分 中,表明省略号代表什么。例如下面的定义:
#define PR() printf( _ _ VA_ARGS_ _ )

#include<math.h>
#define PR(X,...) printf("Message " #X " :" __VA_ARGS__)

int main(void)
{
	double x = 48;
	double y;

	y = sqrt(x);
	PR(1, "x = %g\n", x);
	PR(2, "x = %.2f,y = %.4f", x, y);
}

在这里插入图片描述
不难发现在上述代码中 “x = %g\n”, x 放在了 “Message " #X " :” VA_ARGS 中的**VA_ARGS** 这里,输出了 Message 1:x = 48时

第49题:

题目:#if #ifdef和#ifndef的综合应用。

解析:定义与例子

#ifdef MAVIS
#include “horse.h” // 如果已经用 #define 定义了MAVIS,则执行这两行代码
#define STABLES 5
#else
#include"cow.h" //如果没有用#define 定义了MAVIS,则执行这两行代码
#define STABLES 15
#endif

#ifdef 指令说明,如果预处理器已经定义后面的标识符(MAVIS)则执行 #else 或者 #endif 指令之前的所有指令。如果未定义,就执行 #else#endif 指令之间的 所有代码

#ifdef 和**#else很想C中的if else**。但两者的区别是:预处理器不识别用于标记块的花括号**{ },因此它使用#else** (如果需要) 和 #endif(必须存在)来标记指令块。当然这些指令可以嵌套

#define JUST_CHECKING
#define LIMIT 3

int main(void)
{
	int i;
	int total = 0;
	
	for (i = 1; i <= LIMIT; i++)
	{
		total += 2 * i + 1;
#ifdef JUST_CHECKING
		printf("i = %d , running total = %d\n", i, total);
#endif
	}

	printf("Grand total = %d ");
}

在这里插入图片描述

第50题:

题目:#include 的应用练习。

解析:#include的两种用法

<> 使用这种符号时,查找系统目录
" " 使用这种符号,查找当前工作目录

名字为names_st.h头文件

#include<string.h>
#define SLEN 32

typedef struct names_st
{
	char first[SLEN];
	char last[SLEN];
}names;

void get_name(names *);
void show_names(const names *);

名字为names_st.c源文件

#include<stdio.h>
#include"names_st.h"

void get_names(names *pn)
{
	printf("Please enter your first name:");
	scanf("%s", pn->first);

	printf("Please enter your last name:");
	scanf("%s", pn->last);
}

void show_names(const names *pn)
{
	printf("%s %s", pn->first, pn->last);
}

主程序源文件

#include<stdio.h>
#include"names_st.h"

int main(void)
{
	names candidate;

	get_names(&candidate);
	printf("Let's welcome ");
	show_names(&candidate);
	printf("to this program");
	return 0;
}

在这里插入图片描述

第51~55题:

题目:学习使用按位与 &;学习使用按位或 |;学习使用按位异或 ^;学习使用按位取反~;取一个整数 a 从右端开始的 4~7 位。

分析:这几个题目是类似的,按位&按位或|按位异或^按位取反~ 。这里的按位指的是按照定义的字节类型展开为对应的位数,。这里,我们使用8位二进制数来举例子,从左往右每位的编号为7~0。

按位&:(10010011)&(00111101)得到的结果为:00010001
按位或|:(10010011)|(00111101)得到的结果为:100111111
按位异或 ^: (10010011)^(00111101)得到的结果为:10111101
按位取反~: ~(10010011)得到的结果为:01101100
取一个整数 a 从右端开始的 4~7 位: 先让整数a右移四位,然后设置一个最后4位为1的数,按位相与即可得到由4~7位组成的一个数,当然也可以把这个转换成对应的二进制。

#include<stdio.h>
int main(void)
{
	int number;
	int mask = 15; //后4位全部为1
	puts("Please enter a integer:\n");
	scanf("%d", &number);
	for (int i = 0; i < 4; i++)
		number >>= 1;
	number &= mask;

	printf(" %d ", number);
	return 0;
}

第56~60题:

题目:画图,学用circle画圆形;学用line画直线;学用rectangle画方形。另外两个题均为综合例子。

解析:这里需要用到头文件 <graphics.h>。可以去这个网站 http://www.easyx.cn 下载对应的头文件。我这里也给出另外一个博主的链接,如果不懂怎么安装这个头文件,可以按照这个博主介绍的来操作 https://blog.csdn.net/weixin_46589442/article/details/115219558

具体的程序,由于我用的VS2013不好实现,故小可我就偷个小懒不在这里再详细码出。因为我觉得在用软件画图这方面有更强大的软件。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值