C语言----变量及作用域 、 指针 、 指针和数组 、 进程空间 、 字符串
1 使用程序来模拟放球、取球的问题
1.1 问题
栈是一种特殊的线性表,它的逻辑结构和线性表相同,只是其运算规则较线性表有更多的限制,故又称为运算受限的线性表。
栈的定义是限制仅在表的一端进行插入和删除运算的线性表。
1) 通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
2) 当表中没有元素时称为空栈。
3) 栈为后进先出(Last In First Out)的线性表,简称为LIFO表。
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,要到最后才能删除。
栈的基本运算有:
1) init(S)
构造一个空栈S。
2) empty(S)
判栈空。若S为空栈,则返回TRUE,否则返回FALSE。
3) full(S)
判栈满。若S为满栈,则返回TRUE,否则返回FALSE。
注意:该运算只适用于栈的顺序存储结构。
4) push(S,x)
进栈。若栈S不满,则将元素x插入S的栈顶。
5) pop(S)
退栈。若栈S非空,则将S的栈顶元素删去,并返回该元素。
6) top(S)
取栈顶元素。若栈S非空,则返回栈顶元素,但不改变栈的状态。
1.2 方案
本案例是栈的一个应用,用数字来代表球,向栈中放入一个数字1代表放入了1号球,向栈中放入一个数字2代表放入了2号球,依次类推。同样,从栈中取出数字1代表取出了1号球。
1.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义栈的结构
代码如下:
- #define LISTSIZE 10
- typedef int DataType;
- struct Stack {
- DataType data[LISTSIZE];
- int top; //处了记录大小 还可以记录栈顶位置
- };
上述代码中,下面的代码行:
- #define LISTSIZE 10
定义了一个宏名,用它来表示栈的容量。
上述代码中,代码行:
- typedef int DataType;
为关键字int起一个别名叫DataType。此时,语句int a;与语句DataType a;是等效的,都是定义的了两个整型变量。
上述代码中,代码行:
- struct Stack {
- DataType data[LISTSIZE];
- int top; //处了记录大小 还可以记录栈顶位置
- };
定义了一个结构体,一个结构体内可以有多个数据成员。如本案例中的结构体就有两个数据成员,一个是整型数组data,用它来模拟栈,每个数组元素的位置都可以存放一个栈元素;另一个是整型变量top,用它来模拟栈顶指针。
步骤二:初始化一个结构体
代码如下:
- #include <stdio.h>
- #include <stdbool.h>
- #define LISTSIZE 10
- typedef int DataType;
- struct Stack {
- DataType data[LISTSIZE];
- int top; //处了记录大小 还可以记录栈顶位置
- };
- void init(struct Stack* stack){
- stack->top = 0;
- }
- int main()
- {
- struct Stack s;
- init(&s);
- return 0;
- }
上述代码中,下面代码行:
- struct Stack s;
是在主程序中,定义一个结构体变量s,用它来模拟栈,在本案例中将向栈中放入球。
上述代码中,下面代码行:
- init(&s);
是调用初始化栈函数,实参是结构体变量s的地址。
上述代码中,下面代码行:
- void init(struct Stack* stack){
- stack->top = 0;
- }
是初始化栈函数的定义,该函数有一个形参,用于接收结构体变量的指针。在这个函数的函数体中,语句stack->top=0;表示将结构体变量stack中的整型变量成员top赋值为0,符号->被称为成员运算符,它的作用是将结构体变量中的某个成员取出来进行操作,像上面就是赋值操作。
步骤二:判断栈空、栈满
代码如下:
- #include <stdio.h>
- #include <stdbool.h>
- #define LISTSIZE 10
- typedef int DataType;
- struct Stack {
- DataType data[LISTSIZE];
- int top; //处了记录大小 还可以记录栈顶位置
- };
- void init(struct Stack* stack){
- stack->top = 0;
- }
- bool empty(struct Stack* stack) {
- return stack->top == 0;
- }
- bool full(struct Stack* stack) {
- return stack->top == LISTSIZE;
- }
- int main()
- {
- struct Stack s;
- init(&s);
- return 0;
- }
上述代码中,下面代码行:
- bool empty(struct Stack* stack) {
- return stack->top == 0;
- }
是判断栈空函数,函数接受一个结构体变量指针,在函数体内,如果栈顶指针stack->top等于0时,代表栈空。
上述代码中,下面代码行:
- bool full(struct Stack* stack) {
- return stack->top == LISTSIZE;
- }
是判断栈满函数,函数接受一个结构体变量指针,在函数体内,如果栈顶指针stack->top等于栈容量LISTSIZE时,代表栈满。
步骤三:入栈操作
代码如下:
- #include <stdio.h>
- #include <stdbool.h>
- #define LISTSIZE 10
- typedef int DataType;
- struct Stack {
- DataType data[LISTSIZE];
- int top; //处了记录大小 还可以记录栈顶位置
- };
- void init(struct Stack* stack){
- stack->top = 0;
- }
- bool empty(struct Stack* stack) {
- return stack->top == 0;
- }
- bool full(struct Stack* stack) {
- return stack->top == LISTSIZE;
- }
- void push(struct Stack* stack, DataType d) {
- if (full(stack))
- return;
- stack->data[stack->top++] = d;
- }
- int main()
- {
- struct Stack s;
- init(&s);
- push(&s, 1);
- push(&s, 2);
- push(&s, 3);
- push(&s, 4);
- return 0;
- }
上述代码中,下面代码行:
- push(&s, 1);
是调用入栈函数,向栈s中放入一个整型数据1,即放入1号球。
上述代码中,下面代码行:
- void push(struct Stack* stack, DataType d) {
- if (full(stack))
- return;
- stack->data[stack->top++] = d;
- }
是入栈函数,函数包含两个形参,第一个形参是一个指向结构体Stack的指针,它的作用是表示向哪个栈中放入数据;第二个形参是向栈中放入的数据是什么。函数体首先判断栈是否已经满,如果栈满就不能继续向栈中加入数据。如果栈不满,语句stack->data[stack->top++] = d;将数据d放入栈stack->data[]当中。栈顶指针stack->top指示出数据加入的位置,当数据加入完成后,栈顶指针stack->top加1,指向下一个位置。
步骤四:出栈操作和取栈顶元素操作
代码如下:
- #include <stdio.h>
- #include <stdbool.h>
- #define LISTSIZE 10
- typedef int DataType;
- struct Stack {
- DataType data[LISTSIZE];
- int top; //处了记录大小 还可以记录栈顶位置
- };
- void init(struct Stack* stack){
- stack->top = 0;
- }
- bool empty(struct Stack* stack) {
- return stack->top == 0;
- }
- bool full(struct Stack* stack) {
- return stack->top == LISTSIZE;
- }
- void push(struct Stack* stack, DataType d) {
- if (full(stack))
- return;
- stack->data[stack->top++] = d;
- }
- void pop(struct Stack* stack) {
- if (empty(stack))
- return;
- stack->top--;
- }
- DataType top(struct Stack* stack) {
- return stack->data[stack->top - 1];
- }
- int main()
- {
- struct Stack s;
- init(&s);
- push(&s, 1);
- push(&s, 2);
- push(&s, 3);
- push(&s, 4);
- printf("%d\n", top(&s));
- pop(&s);
- printf("%d\n", top(&s));
- pop(&s);
- printf("%d\n", top(&s));
- pop(&s);
- printf("%d\n", top(&s));
- pop(&s);
- return 0;
- }
上述代码中,下面代码行:
- printf("%d\n", top(&s));
是调用取栈顶元素函数top(&s),将栈s中最后放入的数据取出来。
上述代码中,下面代码行:
- DataType top(struct Stack* stack) {
- return stack->data[stack->top - 1];
- }
是取栈顶元素函数,函数带有一个形参,表示从哪个栈中取出元素。函数体中的语句stack->data[stack->top - 1];表示将栈顶指针stack->top减1的位置的栈元素stack->data[]取出来。
上述代码中,下面代码行:
- pop(&s);
是调用出栈函数。将栈s的地址作为实参。
上述代码中,下面代码行:
- void pop(struct Stack* stack) {
- if (empty(stack))
- return;
- stack->top--;
- }
是出栈函数,函数带有一个形参,表示从哪个栈中出栈。函数体首先判断栈是否为空,如果栈空,表示栈中已经没有元素,就不能再出栈了。然后将栈顶指针stack->top减1,表示栈中的元素少了一个。
1.4 完整代码
本案例的完整代码如下所示:
- #include <stdio.h>
- #include <stdbool.h>
- #define LISTSIZE 10
- typedef int DataType;
- struct Stack {
- DataType data[LISTSIZE];
- int top; //处了记录大小 还可以记录栈顶位置
- };
- void init(struct Stack* stack){
- stack->top = 0;
- }
- bool empty(struct Stack* stack) {
- return stack->top == 0;
- }
- bool full(struct Stack* stack) {
- return stack->top == LISTSIZE;
- }
- void push(struct Stack* stack, DataType d) {
- if (full(stack))
- return;
- stack->data[stack->top++] = d;
- }
- void pop(struct Stack* stack) {
- if (empty(stack))
- return;
- stack->top--;
- }
- DataType top(struct Stack* stack) {
- return stack->data[stack->top - 1];
- }
- int main()
- {
- struct Stack s;
- init(&s);
- push(&s, 1);
- push(&s, 2);
- push(&s, 3);
- push(&s, 4);
- printf("%d\n", top(&s));
- pop(&s);
- printf("%d\n", top(&s));
- pop(&s);
- printf("%d\n", top(&s));
- pop(&s);
- printf("%d\n", top(&s));
- pop(&s);
- return 0;
- }
2 求一组数的最大值、最小值
2.1 问题
创建程序,实现以下的功能:编制一个自定义函数同时返回一组数的最大值、最小值
需求为:在主函数中创建一个长度为10的数组,数组内放置10个0~99之间(包含0,包含99)的随机数作为数组内容,按要求编制一个自定义函数同时返回数组中的最大值、最小值,然后在主函数中将自定义函数的返回值打印显示在界面上。控制台效果如图-1所示:
图-1
2.2 方案
首先,定义一个函数,功能是求数组中的最大值与最小值。
然后,在主函数中,定义一个长度为10的数组,并将10个数组元素分别赋值为10个随机数,然后调用以上编制的函数,求出最大值、最小值,并在主函数中显示结果。
2.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:在主函数中定义数组
在主函数中,定义一个数组,并为每个数组元素赋值成一个随机数,然后将数组中数据显示出来。
代码如下:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- int main(int argc, const char * argv[])
- {
- int data[10];
- srand((unsigned)time(0));
- for (int i = 0; i < 10; i++)
- data[i] = rand() % 100;
- printf("数组中的数据为:");
- for (int i = 0; i < 10; i++)
- printf("%d ", data[i]);
- printf("\n");
- return 0;
- }
步骤二:定义函数求最大值与最小值
代码如下:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- void maxAndMin(int data[], int size, int *max, int *min)
- {
- *max = data[0];
- *min = data[0];
- for (int i = 0; i < size; i++)
- {
- if (*max < data[i])
- *max = data[i];
- if (*min > data[i])
- *min = data[i];
- }
- }
- int main(int argc, const char * argv[])
- {
- int data[10];
- srand((unsigned)time(0));
- for (int i = 0; i < 10; i++)
- data[i] = rand() % 100;
- printf("数组中的数据为:");
- for (int i = 0; i < 10; i++)
- printf("%d ", data[i]);
- printf("\n");
- return 0;
- }
上述代码中,下面代码行:
- void maxAndMin(int data[], int size, int *max, int *min)
是自定义函数的函数头,该函数为无返回值函数,函数名为maxAndMin,函数有四个形参,第一个形参为一个数组,在此数组中找到最大值和最小值;第二个形参为数组的长度;第三个形参是一个指针变量,此参数用于将数组中的最大值带回主函数;第四个形参也是一个指针变量,此参数用于将数组中的最小值带回主函数。
上述代码中,下面代码行:
- *max = data[0];
- *min = data[0];
首先假定数组的最大值与最小值都是数组的第一个元素。
上述代码中,下面代码行:
- for (int i = 0; i < size; i++)
- {
- if (*max < data[i])
- *max = data[i];
- if (*min > data[i])
- *min = data[i];
- }
遍历数组,逐个元素与最大值和最小值对比,如果比最大值大,替换最大值;如果比最小值小,则替换最小值。
步骤三:在主函数中调用
代码如下:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- void maxAndMin(int data[], int size, int *max, int *min)
- {
- *max = data[0];
- *min = data[0];
- for (int i = 0; i < size; i++)
- {
- if (*max < data[i])
- *max = data[i];
- if (*min > data[i])
- *min = data[i];
- }
- }
- int main(int argc, const char * argv[])
- {
- int data[10];
- srand((unsigned)time(0));
- for (int i = 0; i < 10; i++)
- data[i] = rand() % 100;
- printf("数组中的数据为:");
- for (int i = 0; i < 10; i++)
- printf("%d ", data[i]);
- printf("\n");
- int max;
- int min;
- maxAndMin(data, 10, &max, &min);
- printf("最大值为:%d\n", max);
- printf("最小值为:%d\n", min);
- return 0;
- }
上述代码中,下面代码行:
- int max;
- int min;
定义两个变量,分别用于存储数组中的最大值和最小值。
上述代码中,下面代码行:
- maxAndMin(data, 10, &max, &min);
调用maxAndMin函数,数组data作为第一个实参,第二个实参是数组data的长度,第三个实参是变量max的地址,这样可以将最大值带回来,第四个实参是变量min的地址,它用于带回最小值。
2.4 完整代码
本案例的完整代码如下所示:
- #include <stdio.h>
- #include <time.h>
- #include <stdlib.h>
- void maxAndMin(int data[], int size, int *max, int *min)
- {
- *max = data[0];
- *min = data[0];
- for (int i = 0; i < size; i++)
- {
- if (*max < data[i])
- *max = data[i];
- if (*min > data[i])
- *min = data[i];
- }
- }
- int main(int argc, const char * argv[])
- {
- int data[10];
- srand((unsigned)time(0));
- for (int i = 0; i < 10; i++)
- data[i] = rand() % 100;
- printf("数组中的数据为:");
- for (int i = 0; i < 10; i++)
- printf("%d ", data[i]);
- printf("\n");
- int max;
- int min;
- maxAndMin(data, 10, &max, &min);
- printf("最大值为:%d\n", max);
- printf("最小值为:%d\n", min);
- return 0;
- }
3 输入输出个人信息
3.1 问题
在控制台上首先输入某个学生的个人信息,包括姓名、年龄、毕业院校,然后输出。效果图如图-2所示:
图-2
3.2 方案
定义数组和变量用于存储学生的个人信息,然后使用scanf函数输入该信息,最后再使用printf函数输出该信息。
3.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:定义数据
数组name,用于存储学生的姓名。
变量age,用于存储学生的年龄。
数组school,用于存储学生的毕业院校。
代码如下:
- #include <stdio.h>
- int main(int argc, const char * argv[])
- {
- char name[20];
- int age;
- char school[100];
- return 0;
- }
步骤二:输入学生的个人信息
使用scanf函数输入学生的姓名、年龄和毕业院校。
注意:数组使用用占位符%s。
代码如下:
- #include <stdio.h>
- int main(int argc, const char * argv[])
- {
- char name[20];
- int age;
- char school[100];
- printf("请输入学生的姓名:");
- scanf("%s", name);
- printf("请输入学生的年龄:");
- scanf("%d", &age);
- printf("请输入学生的毕业院校:");
- scanf("%s", school);
- printf("\n");
- return 0;
- }
步骤三:输出学生的个人信息
使用printf函数输出学生的姓名、年龄和毕业院校。
代码如下:
- #include <stdio.h>
- int main(int argc, const char * argv[])
- {
- char name[20];
- int age;
- char school[100];
- printf("请输入学生的姓名:");
- scanf("%s", name);
- printf("请输入学生的年龄:");
- scanf("%d", &age);
- printf("请输入学生的毕业院校:");
- scanf("%s", school);
- printf("\n");
- printf("学生的个人信息如下:\n");
- printf("姓名:%s\n", name);
- printf("年龄:%d\n", age);
- printf("毕业院校:%s\n", school);
- return 0;
- }
3.4 完整代码
本案例的完整代码如下所示:
- #include <stdio.h>
- int main(int argc, const char * argv[])
- {
- char name[20];
- int age;
- char school[100];
- printf("请输入学生的姓名:");
- scanf("%s", name);
- printf("请输入学生的年龄:");
- scanf("%d", &age);
- printf("请输入学生的毕业院校:");
- scanf("%s", school);
- printf("\n");
- printf("学生的个人信息如下:\n");
- printf("姓名:%s\n", name);
- printf("年龄:%d\n", age);
- printf("毕业院校:%s\n", school);
- return 0;
- }
C语言----变量及作用域 、 指针 、 指针和数组 、 进程空间 、 字符串的更多相关文章
- C语言 变量的作用域和生命周期(转)
转自 https://blog.csdn.net/u011616739/article/details/62052179 a.普通局部变量 属于某个{},在{}外部不能使用此变量,在{}内部是可以使用 ...
- C语言变量的作用域和存储类型
1.动态局部变量:也称局部变量.自动变量,是指在函数内部定义的自动变量,不带static修饰,作用域是定义该变量的子程序.在退出函数后,变量自带内存会自动释放. 2.静态局部变量:是指在函数内部定义的 ...
- Java 语言基础 (初识Java语言, 变量和数据类型, 运算符, 流程控制语句, 数组)
初始 Java 语言 Java SE -- Java Platform, Standard Edition 是 Java 平台的基础 Java SE 以前称为 J2SE, 可以编写桌面应用和基于 we ...
- 【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- C语言 命令行参数 函数指针 gdb调试
. 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21551397 | http://www.hanshul ...
- C语言基础(17)-作用域
一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域. 不推荐写法 int a; // 出现了语法的二义性,可能是声明也可能是定义,所以最好定义完成之后声明 void func(); ...
- C语言-存储类&作用域&生命周期&链接属性
1.概念解析(1)存储类 a.存储类就是存储类型,也就是描述C语言变量在何种地方存储. b.内存有多种管理办法:栈.堆.数据段.bss段..text段......一个变量的存储类属性就是描述这个变量存 ...
- 《征服 C 指针》摘录2:C变量的 作用域 和 生命周期(存储期)
在开发一些小程序的时候,也许我们并不在意作用域的必要性.可是,当你书写几万行,甚至几十万行的代码的时候,没有作用域肯定是不能忍受的. C 语言有如下 3 种作用域. 1.全局变量 在函数之外声明的变量 ...
- C/C++——C++变量的作用域与生命周期,C语言中变量的作用域和生命周期
全局变量 作用域:全局作用域(全局变量只需在一个源文件中定义,就可以作用于所有的源文件.) 生命周期:程序运行期一直存在 引用方法:其他文件中要使用必须用extern 关键字声明要引用的全局变量. 内 ...
随机推荐
- CSS 收集
margin:0 auto margin后面如果只有两个参数的话,第一个表示top和bottom,第二个表示left和right, 因为0 auto,表示上下边界为0,左右则根据宽度自适应相同值(即居 ...
- OpenTSDB介绍——基于Hbase的分布式的,可伸缩的时间序列数据库,而Hbase本质是列存储
原文链接:http://www.jianshu.com/p/0bafd0168647 OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is ...
- c++实现之 -- 汉语词语的简单处理
好了,我们现在已经会怎样读入了,然后就是研究一下如何存储等一些细节上的的问题了. 首先,比较函数是不能传入char*的地址的,但是可以接受一个string类. 然而,如果是两个比较长的string类, ...
- 为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?
twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区.文档也是很少可怜我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的 匿名用 ...
- 数据库与SQL语言
数据库(DB) :长期储存在计算机中.有组织.可共享的数据的集合. 特点:(1)数据按一定的数据模型组织.描述和储存:(2)较小的冗余度:(3)数据独立性较高:(4)易扩展:(5)可共享(不同用户可按 ...
- Asynchttpclient开源框架下载图片和文本,于Volley和Glide开源框架的区别。
AsyncHttpClient是一款比较流行的Android异步网路加载库,在github上的网址是:https://github.com/loopj/android-async-httpAsyncH ...
- 最简单的PHP socket echo server。
常有人困惑php的socket服务,现在有libevent和多线程了,但是我还是整一个select的 <?php $addr = '0.0.0.0'; $port = 1234; $socket ...
- hdu 4630 No Pain No Game
http://acm.hdu.edu.cn/showproblem.php?pid=4630 离散化+树状数组 将数组 *a 从后向前遍历 遍历到 a[x] 的时候 再枚举a[x]的约数 假如 约数 ...
- DataGridView复选框实现全选功能,并取被选中的某行某列的值(三)
目标: 一.选中全选这个复选框,会选中第一列所有的复选框 拉过来一个CheckBox控件(CheckBox1)覆盖在第一列的标题上,文本值:全选 方法:双击上面拉的CheckBox控件,进入其事件 p ...
- 织梦dedecms分类信息模型上一页下一页失效办法
修改文件/include/arc.archives.class 将一下代码 $next = (is_array($nextR) ? " where arc.id={$nextR['id']} ...