目录
3.哪些类别的变量可以被多个文件使用?哪些类别的变量仅限于在一个文件中使用?
int * p1 = (int *)malloc(100 * sizeof(int));
int * p1 = (int *)calloc(100, sizeof(int));
int value_ct(const int arr[], int value, int n);
b.用const int value和const int n分别替换int value和int n,是否对主调程序的值加强保护。
2.在美国,通常以英里/加仑来计算油耗;在欧洲,以升/100 公里来计算。下面是程序的一部分,提示用户选择计算模式(美制或公制),然后接收数据并计算油耗
3.重新设计编程练习2,要求只使用自动变量。该程序提供的用户界面不变,即提示用户输入模式等。但是,函数调用要作相应变化
4.在一个循环中编写并测试一个函数,该函数返回它被调用的次数
5.编写一个程序,生成100个1~10范围内的随机数,并以降序排列(可以把第11章的排序算法稍加改动,便可用于整数排序,这里仅对整数排序)
7.编写一个程序,按照程序清单12.13输出示例后面讨论的内容,修改该程序。使其输出类似:
Enter the number of sets; enter q to stop : 18
How many sides and how many dice? 6 3
Here are 18 sets of 3 6-sided throws.
12 10 6 9 8 14 8 15 9 14 12 17 11 7 10 13 8 14
How many sets? Enter q to stop: q
How many words do you wish to enter? 5
Enter 5 words now: I enjoyed doing this exerise
复习题
1.哪些类别的变量可以成为它所在函数的局部变量?
- 自动存储类别
- 寄存器存储类别
- 静态、无链接存储类别
2.哪些类别的变量在它所在程序的运行期一直存在?
- 静态、无链接存储类别
- 静态、内部链接存储类别
- 静态、外部链接存储类别
3.哪些类别的变量可以被多个文件使用?哪些类别的变量仅限于在一个文件中使用?
1)静态、外部链接存储内容
2)静态、内部链接存储内容
4.块作用域变量具有什么链接属性?
无链接
5.extern关键字有什么用途?
用于声明,表名该变量或函数已经在别处定义了
6.考虑下面两行代码,就输出的结果而言有何异同:
int * p1 = (int *)malloc(100 * sizeof(int));
int * p1 = (int *)calloc(100, sizeof(int));
前者在分配时内存中存储元素的值是未定义的,后者中的每一个元素都设置为0
7.下面的变量对哪些函数可见?程序是否有误?
/* 文件 1 */
int daisy;
int main(void)
{
int lily;
...;
}
int petal()
{
extern int daisy, lily;
...;
}
/* 文件 2 */
extern int daisy;
static int lily;
int rose;
int stem()
{
int rose;
...;
}
void root()
{
...;
}
1)
- 文件1中daisy对main()和petal()可见,文件2中以extern声明的daisy才对stem()、root()可见//12.1.7 【附录A中的答案给的是petal()中也要以extern声明,但书上12.1.7说是可选的声明不是必须的声明】
- 文件1中main()中的lily仅对main()函数可见
- 文件2中的lily,rose对文件2中的stem()和root()可见,其中stem()中声明的rose只对stem()可见
2)
- 文件1中lily的引用是错误的,不存在变量名为lily的外部链接变量
8.下面程序会打印什么
#include <stdio.h>
char color = 'B';
void first(void);
void second(void);
int main(void)
{
extern char color;
printf("color in main() is %c\n", color);
first();
printf("color in main() is %c\n", color);
second();
printf("color in main() is %c\n", color);
return 0;
}
void first(void)
{
char color;
color = 'R';
printf("color in first() is %c\n", color);
}
void second(void)
{
color = 'G';
printf("color in second() is %c\n", color);
}
color in main() is B
color in first() is R
color in main() is B
color in second() is G
color in main() is G
9.假设文件的开始处有如下声明:
static int plink;
int value_ct(const int arr[], int value, int n);
a.以上声明表明了程序员的什么意图?
b.用const int value和const int n分别替换int value和int n,是否对主调程序的值加强保护。
a.
- 定义一个名为plink的内部链接的存储变量
- 定义一个函数名为value_ct的函数,该函数第一个参数为int型的数组,且在函数执行过程中该数组内容不可改变,第二参数和第三个参数都是int型变量,该函数返回一个int型的值
b. 否,形参的值改变并不改变实参的值
编程练习
1.不使用全局变量,重写程序清单12.4
#include <stdio.h>
#include <stdlib.h>
void critic(int * u)
{
printf("No luck, my friend. Try again.\n");
scanf("%d", u);
}
int main(void)
{
int units;
printf("How many pounds to a firkin of butter?\n");
scanf("%d", &units);
while ( units != 56)
{
critic(&units);
}
printf("You must have looked it up!\n");
return 0;
}
2.在美国,通常以英里/加仑来计算油耗;在欧洲,以升/100 公里来计算。下面是程序的一部分,提示用户选择计算模式(美制或公制),然后接收数据并计算油耗
如果用户输入了不正确的模式,程序向用户给出提示消息并使用上一次输入的正确模式。请提供pe12-2a.h头文件和pe12-2a.c源文件。源代码文件应定义3个具有文件作用域、内部链接的变量。一个表示模式、一个表示距离、一个表示消耗的燃料。get_info()函数根据用户输入的模式提示用户输入相应数据,并将其储存到文件作用域变量中。show_info()函数根据设置的模式计算并显示油耗。可以假设用户输入的都是数值数据
//pe12-2a.c
#include "pe12-2a.h"
void set_mode(int n)
{
mode = n;
}
void get_info()
{
printf("Enter distance traveled in kilometers:");
scanf("%lf", &km);
printf("Enter fuel consumed in liters:");
scanf("%lf", &fc);
}
void show_info()
{
if(mode)
{
printf("Fuel consumption is %.1lf miles per gallon.\n", km / fc);
}
else
{
printf("Fuel consumption is %.2lf liters per 100 km.\n", fc / km);
}
}
//pe12-2a.h
#ifndef DRAFT_PE12_2A_H
#define DRAFT_PE12_2A_H
#include <stdio.h>
static int mode;
static double km, fc;
void set_mode(int n);
void get_info();
void show_info();
#endif
3.重新设计编程练习2,要求只使用自动变量。该程序提供的用户界面不变,即提示用户输入模式等。但是,函数调用要作相应变化
//pe12-2a.c
#include "pe12-2a.h"
void show_info(int mode)
{
double km, fc;
printf("Enter distance traveled in kilometers:");
scanf("%lf", &km);
printf("Enter fuel consumed in liters:");
scanf("%lf", &fc);
if(mode)
{
printf("Fuel consumption is %.1lf miles per gallon.\n", km / fc);
}
else
{
printf("Fuel consumption is %.2lf liters per 100 km.\n", fc / km);
}
}
//pe12-2a.h
#ifndef DRAFT_PE12_2A_H
#define DRAFT_PE12_2A_H
#include <stdio.h>
void show_info(int mode);
#endif