• 程序清单12.1,hiding.c:

// hiding.c -- 块中的变量
#include <stdio.h>int main(void)
{int x = 30;            // 原始的 x printf("x in outer block: %d at %p\n", x, &x);{int x = 77;       // 新的 x, 隐藏了原始的 x printf("x in inner block: %d at %p\n", x, &x);}printf("x in outer block: %d at %p\n", x, &x);while (x++ < 33)      // 原始的 x {int x = 100;      // 新的 x, 隐藏了原始的 x x++;printf("x in while loop: %d at %p\n", x, &x);}printf("x in outer block: %d at %p\n", x, &x);return 0;
} 

输出结果:

  • 程序清单12.2,forc99.c:

/* forc99.c -- 新的 C99 块规则 */
#include <stdio.h>int main(void)
{int n = 8;printf("    Initially, n = %d at %p\n", n, &n);for (int n = 1; n < 3; n++)printf("      loop 1: n = %d at %p\n", n, &n);printf("After loop 1, n = %d at %p\n", n, &n);for (int n = 1; n < 3; n++){printf("  loop 2 index n = %d at %p\n", n, &n);int n = 6;printf("  loop 2: n = %d at %p\n", n, &n);n++;}printf("After loop 2, n = %d at %p\n", n, &n);return 0;
}

输出结果:

  • 程序清单12.3,loc_stat.c:

/* loc_stat.c -- 使用局部静态变量 */
#include <stdio.h>void trystat(void);int main(void)
{int count;for (count = 1; count <= 3; count++){printf("Here comes iteration %d:\n", count);trystat();}return 0;
}void trystat(void)
{int fade = 1;static int stay = 1;printf("fade = %d and stay = %d\n", fade++, stay++);
}

输出结果:

  • 程序清单12.4,global.c:

/* global.c -- 使用外部变量 */
#include <stdio.h>int units = 0; /* 外部变量 */
void critic(void);int main(void)
{extern int units; /* 可选的重复声明 */ printf("How many pounds to a firkin of butter?\n");scanf("%d", &units);while (units != 56)critic();printf("You must looked it up!\n") ;return 0;
}void critic(void)
{/* 删除了可选的重复声明 */ printf("No luck, my friend. Try again.\n");scanf("%d", &units);
}

输出结果:

  • 程序清单12.5,12.6,该项目由两个源文件组成。

parta.c:

// parta.c -- 不同的存储类别
// 与partb.c 一起编译
#include <stdio.h>void report_count();
void accumulate(int k);
int count = 0; //文件作用域,外部链接int main(void)
{int value; //自动变量register int i; //寄存器变量printf("Enter a positive integer (0 to quit): ");while (scanf("%d", &value) == 1 && value > 0){++count; //使用文件作用域变量for (i = value; i >= 0; i--)accumulate(i);printf("Enter a positive integer (0 to quir): ");}report_count();return 0;
}void report_count()
{printf("Loop executed %d times\n", count);
}

partb.c:

// partb.c -- 程序的其余部分
// 与 parta.c 一起编译
#include <stdio.h>extern int count; //引用式声明,外部链接static int total = 0; //静态定义,内部链接
//void accumulate(int k);void accumulate(int k) //k具有块作用域,无链接
{static int subtotal = 0; //静态,无链接if (k <= 0){printf("loop cycle: %d\n", count);printf("subtotal :%d; total: %d\n", subtotal, total);subtotal = 0;}else{subtotal += k;total += k;}
}

输出结果:

  • 程序清单12.7,12.8,该项目包括两个源文件。

rand0.c:

/* rand0.c -- 生成随机数 */
/* 使用 ANSI C 可移植算法 */
static unsigned long int next = 1; /* 种子 */ unsigned int rand0(void)
{/* 生成伪随机数的魔术公式 */ next = next * 1103515245 + 12345;return (unsigned int) (next / 65536) % 32768;
}

r_drive0.c:

/* r_drive0.c -- 测试 rand0() 函数 */
/* 与 rand0.c 一起编译 */
#include <stdio.h>
extern unsigned int rand0(void); //extern可省略 int main(void)
{int count;for (count = 0; count < 5; count++)printf("%d\n", rand0());return 0;
}

输出结果:

  • 程序清单12.9,12.10,该项目包含两个源文件。

s_and_r.c:

/* s_and_r.c -- 包含rand1() 和 srand1() 的文件 */
/* 使用 ANSI C 可移植算法 */
static unsigned long int next = 1; /* 种子 */ int rand1(void)
{/* 生成伪随机数的魔术公式 */ next = next * 1103515245 + 12345;return (unsigned int) (next / 65536) % 32768;
}void srand1(unsigned int seed)
{next = seed;
}

r_drive1.c:

/* r_drive1.c -- 测试rand1() 和 srand1() */
/* 与 s_and_r.c 一起编译 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>extern void srand1(unsigned int x); // extern 可选
extern int rand1(void);int main(void)
{int count;//unsigned seed;int num = 1;time_t *a = 0;//printf("Please enter your choice for seed.\n");while (num-- > 0){srand1((unsigned int) time(a));for (count = 0; count < 5; count++)printf("%d\n", rand1());//printf("Please enter next seed (q to quit):\n");}printf("Done\n");return 0;
} 

输出结果:

  • 程序清单12.11,12.12,12.13,该项目包含了一个头文件和两个源文件。

diceroll.h:

// diceroll.h
extern int roll_count;int roll_n_dice(int dice, int sides);

diceroll.c:

/* diceroll.c -- 掷骰子模拟程序 */
/* 与 manydice.c 一起编译 */
#include "diceroll.h"
#include <stdio.h>
#include <stdlib.h>          /* 提供库函数 rand() 的原型 */ int roll_count = 0;          /* 外部链接 */ static int rollem(int sides) /* 该函数属于该文件私有 */
{int roll;roll = rand() % sides + 1;++roll_count;            /* 计算函数调用次数 */ return roll;
}int roll_n_dice(int dice, int sides)
{int d;int total = 0;if (sides < 2){puts("Need at least 2 sides.");return -1;}if (dice < 1){puts("Need at least 1 dice.");return -1;}for (d = 0; d < dice; d++)total += rollem(sides);return total;
}

manydice.c:

/* manydice.c -- 多次掷骰子的模拟程序 */
/* 与 diceroll.c 一起编译 */
#include <stdio.h>
#include <stdlib.h>     /* 为库函数 srand() 提供原型 */
#include <time.h>       /* 为 time() 提供原型 */
#include "diceroll.h"   /* 为 roll_n_dice() 提供原型,为 roll_count 变量提供声明 */ int main(void)
{int dice, roll;int sides;int status;srand((unsigned int) time(0)); //重置种子 printf("Enter the number of sides per dice, 0 to stop.\n");while (scanf("%d", &sides) == 1 && sides > 0){printf("How many dice?\n");if ((status = scanf("%d", &dice)) != 1){if (status == EOF)break;           // 退出循环 else{printf("You should have enterd an integer.");printf("Let's begin again.\n");while (getchar() != '\n')continue;    // 处理错误的输入 printf("How many sides? Enter 0 to stop.\n");continue;        // 进入循环的下一轮迭代 */ }}roll = roll_n_dice(dice, sides);printf("You have rolled a %d using %d %d-sided dice.\n",roll, dice, sides);printf("How many sides? Enter 0 to stop.\n");}printf("The rollem() function was called %d times.\n",roll_count);             // 使用外部变量 printf("GOOD FORTUNE TO YOU!\n");return 0;
}

输出结果:

  • 编程练习

题目1,方法:使用指针传递参数。示例代码12_1.c:

#include <stdio.h>void critic(int *);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 looked it up!\n") ;return 0;
}void critic(int * num)
{printf("No luck, my friend. Try again.\n");scanf("%d", num);
}

输出结果:

题目2,方法:根据选择以不同模式计算油耗。该项目由一个头文件和两个源文件组成。

pe12_2a.h:

void set_mode(int);
void get_info(void);
void show_info(void);

pe12_2a.c:

#include <stdio.h>
#include "pe12_2a.h"static int mode; // 静态变量自动初始化为 0
static double distance;
static double fuel;void set_mode(int num)
{if (num > 1){printf("Invalid mode specified. Mode %s used.\n",(0 == mode) ? "0(metric)" : "1(US)");}    elsemode = num; // 改变了具有文件作用域的静态变量 mode, 在程序执行期间不改变
}void get_info(void)
{if (0 == mode)printf("Enter distance traveled in kilometers: ");elseprintf("Enter distance traveled in miles: ");scanf("%lf", &distance);if (0 == mode)printf("Enter fuel consumed in liters: ");elseprintf("Enter fuel consumed in gallons: ");scanf("%lf", &fuel);
}void show_info(void)
{if (0 == mode)printf("Fuel consumption is %.1lf liters per 100 km.\n", (fuel / distance) * 100);elseprintf("Fuel consumption is %.1lf miles per gallon.\n", distance / fuel);
}

pe12_2b.c:

#include <stdio.h>
#include "pe12_2a.h"int main(void)
{int mode;printf("Enter 0 for metric mode, 1 for US mode: ");scanf("%d", &mode);while (mode >= 0){set_mode(mode);get_info();show_info();printf("Enter 0 for metric mode, 1 for US mode");printf(" (-1 to to quit): ");scanf("%d", &mode);}printf("Done.\n");return 0;
}

输出结果:

题目3,方法:使用自动变量改写题目2。该项目包含一个头文件和两个源文件。

pe12_3a.h:

void set_mode(int *);
void get_info(int, double *, double *);
void show_info(int, double, double);

pe12_3a.c:

#include <stdio.h>
#include "pe12_3a.h"void set_mode(int * n1)
{if (*n1 > 1){*n1 = 0;printf("Invalid mode specified. Mode %s used.\n", (0 == *n1) ? "0(metric)" : "1(US)");}
}void get_info(int n, double * n1, double * n2)
{if (0 == n)printf("Enter distance traveled in kilometers: ");elseprintf("Enter distance traveled in miles: ");scanf("%lf", n1);if (0 == n)printf("Enter fuel consumed in liters: ");elseprintf("Enter fuel consumed in gallons: ");scanf("%lf", n2);
}void show_info(int n, double n1, double n2)
{if (0 == n)printf("Fuel consumption is %.1lf liters per 100 km.\n", (n2 / n1) * 100);elseprintf("Fuel consumption is %.1lf miles per gallon.\n", n1 / n2);
}

pe12_3b.c:

#include <stdio.h>
#include "pe12_3a.h"int main(void)
{int mode;double distance, fuel;printf("Enter 0 for metric mode, 1 for US mode: ");scanf("%d", &mode);while (mode >= 0){set_mode(&mode);get_info(mode, &distance, &fuel);show_info(mode, distance, fuel);printf("Enter 0 for metric mode, 1 for US mode");printf(" (-1 to to quit): ");scanf("%d", &mode);}printf("Done.\n");return 0;
}

输出结果:

题目4,方法:测试函数被调用次数。示例代码:

#include <stdio.h>int call_times(void);int main(void)
{int i, num;for (i = 0; i < 10; i++)num = call_times();printf("I have been called %d times.\n", num);return 0;
}int call_times(void)
{static int count = 0;count++;return count;
}

输出结果:

题目5,方法:生成随机数并排序。示例代码12_5.c:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define LEN 10void sort_array(int, int *);
void show_array(int, const int *);int main(void)
{int i;int * ar;ar = (int *) malloc(LEN * sizeof(int));srand((unsigned int) time(0));for (i = 0; i < LEN; i++)*(ar + i) = (rand() % 10) + 1; // 生成 1~10 的随机数 printf("Before sorted:\n");show_array(LEN, ar);sort_array(LEN, ar);printf("\n\nAfter sorted:\n");show_array(LEN, ar);free(ar);return 0;}void sort_array(int n, int * ar) // 冒泡排序
{int i, j, temp;for (i = 0; i < n - 1; i++)for (j = i + 1; j < n; j++)if (*(ar +i) < *(ar + j)){temp = *(ar + i);*(ar + i) = *(ar + j);*(ar + j) = temp;}
}void show_array(int n, const int * ar)
{int i;for (i = 0; i < n; i++){printf("%-3d", *(ar + i));if ((i + 1) % 5 == 0)putchar('\n');}
}

输出结果(以10个数测试):

题目6,方法:测试不同随机数种子生成的不同数字出现的次数。示例代码12_6.c:

#include <stdio.h>
#include <stdlib.h>
#define LEN 10
#define MAX 1000int main(void)
{int i, j;int ar[LEN];unsigned int seed;for (i = 0; i < LEN; i++, seed = i){printf("\n%dth time,seed: %u\n\n", i + 1, seed);srand(seed);for (j = 0; j < LEN; j++) // 初始化保存出现次数的数组 *(ar + j) = 0;for (j = 0; j < MAX; j++) // 记录 0~9 出现的次数,类似 1~10 ar[(rand() % 10)]++;for (j = 0; j < LEN; j++)printf("%d appeared %d times.\n", j + 1, ar[j]);}return 0;
}

输出结果:

题目7,方法:掷骰子修改。示例代码12_7.c:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>int rollem(int n); //生成随机数 int main(void)
{int sets; //摇多少次骰子int count; //计数每次的点数int sides; //骰子的面数int dices; //每次几个骰子int i, j; //用于循环 printf("Enter the number of sets; enter q to stop: ");srand((unsigned int) time(0));while (scanf("%d", &sets) == 1 || sets < 1){printf("How many sides and how many dice? ");while (scanf("%d%d", &sides, &dices) != 2 || sides < 2 || dices < 1){printf("Input illegal, try again: ");while (getchar() != '\n')continue;}for (i= 0; i < sets; i++){count = 0; //每次摇动骰子之前初始化;for (j = 0; j < dices; j++)count += rollem(sides);printf("%dth time, total count: %d\n", i + 1, count); }printf("How many sets? Enter q to stop: ");}return 0;
}int rollem(int n)
{return rand() % n + 1;
}

输出结果:

题目8,方法:使用 malloc() 代替数组。示例代码12_8.c:

#include <stdio.h>
#include <stdlib.h>int * make_array(int elem, int val);
void show_array(const int ar[], int n);int main(void)
{int * pa;int size;int value;printf("Enter the number of elements: ");while (scanf("%d", &size) == 1 && size > 0){printf("Enter the initialization value: ");scanf("%d", &value);pa = make_array(size, value);if (pa){show_array(pa, size);free(pa);}printf("\nEnter the number of elements (<1 to quit): ");}printf("Done.\n");return 0;
}int * make_array(int elem, int val)
{int * index;int i;index = (int *) malloc(elem * sizeof(int));if (NULL == index)exit(EXIT_FAILURE);for (i = 0; i < elem; i++)*(index + i) = val;return index;
}void show_array(const int ar[], int n)
{int i;for (i = 0; i < n; i++){printf("%-3d", *(ar + i));if ((i + 1) % 8 == 0)putchar('\n');}
}

输出结果:

题目9,方法:保存单词并打印。示例代码12_9.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LEN 256int main(void)
{int words; //单词数量int size; //单词大小char ** pt; //保存单词的地址(指针的指针) char temp[LEN]; //临时保存单词 int i;printf("How many words do you wish to enter? ") ;scanf("%d", &words);if ((pt = (char **) malloc(words * sizeof(char *))) != NULL){printf("Enter %d words now:\n", words);for (i = 0; i < words; i++){scanf("%s", temp);size = strlen(temp) + 1; //多 1 个字节存储空字符 *(pt + i) = (char *) malloc(size * sizeof(char));if (*(pt + i) == NULL)exit(EXIT_FAILURE);strcpy(*(pt + i), temp); //将字符串从临时数组拷贝到malloc分配的空间 }printf("Here are your words:\n") ;for (i = 0; i < words; i++){puts(*(pt + i));free(*(pt + i));*(pt + i) = NULL;}free(pt);pt = NULL;}elseexit(EXIT_FAILURE);return 0;
}

输出结果:

第十二章 存储类别、链接和内存管理相关推荐

  1. python 宝典 笔记 第十二章 存储数据和对象 (各种对象转换成字符串)

    第十二章 存储数据和对象 12.1数据存储概述 12.1.1文本与二进制对比 文本格式易于阅读和调试,跨平台性能好.二进制格式占用空间小,适于按记录存取. 12.1.2压缩 假如对象的大小开始成为问题 ...

  2. RH124 第十二章 Linux系统中的软件管理

    RH124 第十二章 Linux系统中的软件管理 1.Linux中软件包的类型 1.DEB #UBlinux DEBlinux 2.RPM #redhat centOS fc 3.bz2|gz|xz ...

  3. linux系统日志_第十二章:走进Linux世界——系统日志管理,日志轮转。

    1.关心问题:哪类程序---> 产生的什么日志----> 放到什么地方 2.处理日志的进程 (1) 第一类: rsyslogd: 系统专职日志程序. 处理绝大部分日志记录, 系统操作有关的 ...

  4. 第九章 存储类别、链接和内存管理

    文章目录 存储类别 作用域 翻译单元和文件 链接 存储期 5种存储类别 自动变量 寄存器变量 块作用域的静态变量 外部链接的静态变量 内部链接的静态变量 多文件 存储类别说明符 存储类别和函数 随机函 ...

  5. 【信息系统项目管理师】第二十二章 信息系统安全管理(考点汇总篇)

    [信息系统项目管理师]第二十二章 信息系统安全管理(考点汇总篇) 考点分析与预测 信息安全为高级科目独有的章节,在第三版教材中有66页的内容.需要掌握的知识点非常多,且知识点非常散,在考试中上午一般考 ...

  6. iPhone开发基础教程笔记(十二)--第十二章 使用Quartz和OpenGL绘图

    第十二章 使用Quartz和OpenGL绘图 有时应用程序需要能够自定义绘图.一个库是Quartz 2D,她是Core Graphics框架的一部分:另一个库是OpenGL ES,她是跨平台的图形库. ...

  7. 高级shell编程笔记(第十二章 外部过滤器,程序和命令)

    第十二章 外部过滤器,程序和命令 标准的UNIX命令使得脚本更加灵活.通过简单的编程结构把shell指令和系统命令结合起来,这才是脚本能力的所在. 12.1 基本命令 新手必须掌握的初级命令 ls 基 ...

  8. 在Jetson Nano上学习ROS的记录(版本Ubuntu18.04,课程来源赵虚左老师的《ROS理论与实践》)第十二章 机器人导航(仿真)

    系列文章目录 第一章 ROS空间创建.helloworld的实现.开启多个节点 第二章 话题通信 第三章 服务通信 第四章 参数服务器 第五章 常用指令 第六章 通信机制实操 第七章 ROS通信机制进 ...

  9. 从零开始的linux 第十二章

    从零开始的linux 第十二章 (敲门声)咚咚咚... 路人甲:"小..小编大人在家吗?" (睡意朦胧的小编去开门):唉??路...路人甲!? (↑看到小编后的路人甲):" ...

最新文章

  1. 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知...
  2. java两个有序数组的初始化_leecode:88–合并两个有序数组 | 星尘
  3. 使用微软WPF技术开发产品优势究竟在那里
  4. 测试人员面临的测试挑战和必备技能
  5. 如何成为强大的程序员?(转)
  6. macOS SIP 权限设置
  7. [蓝桥杯2019初赛]完全二叉树的权值-完全二叉树的性质
  8. mkenvimage
  9. 使用负边距创建自适应宽度的流体布局
  10. JavaScript变量、属性、函数、方法的区别(1)
  11. 【JavaScript】回流(reflow)与重绘(repaint)
  12. recordset.Open strSql, Conn, 3,3
  13. Uhuntu搜狗拼音输入法安装详细过程
  14. 毕业设计 : 基于LSTM的文本情感分类 - 情感分类 情感分析 lstm
  15. codeforces 884F 费用流,图解很清晰
  16. 如何1秒内快速判断一个函数的凹凸性?还看不懂我给你赔钱
  17. python 爬取拉钩数据
  18. 云台山风景区茶园骑共享单车,游玩茶园的每一个角落
  19. linux压缩到最小命令,Linux下压缩某个文件夹命令
  20. 论文《基于结构光和双目视觉的三维重建系统研究》摘要

热门文章

  1. 上海哪家券商两融利率最低?能提供量化交易软件ptrade和QMT?
  2. python openpyxl遍历工作表(sheet)
  3. ArcGIS基础实验操作100例--实验67设置标注样式
  4. 苹果电脑mp4转换成mp3的免费软件
  5. 数据结构及算法之数组
  6. 从LOL 中学习“专注
  7. 今年秋冬还在流行的3条连衣裙
  8. 创成汇丨集创业服务一身的创业服务平台
  9. Ubuntu20.04 安装 Google Chrome浏览器
  10. 自己U盘插自己电脑显示不了,插别人电脑有用,自己电脑插别的U盘有用的解决方法