标准C语言(6)
数组名称不可以代表任何存储区(数组名称不可以被赋值),数组名称可以代表数组里第一个存储区的地址
/*
* 数组练习
* */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int arr[7] = {0}, arr1[7] = {0}, tmp = 0, cnt = 0, num = 0, num1 = 0;
srand(time(0));
do {
tmp = rand() % 36 + 1;
//检查新数字是否可以使用
for (num = 0;num <= cnt - 1;num++) {
if (tmp == arr[num]) {
break;
}
}
//如果for循环正常结束就说明新数字可以
//使用,否则不能使用
if (num >= cnt) {
arr[cnt] = tmp;
cnt++;
}
} while (cnt < 7);
for (num = 0;num <= 6;num++) {
printf("%d ", arr[num]);
}
printf("\n");
for (num = 0;num <= 6;num++) {
printf("请输入一个数字:");
scanf("%d", &arr1[num]);
}
cnt = 0;
for (num = 0;num <= 6;num++) {
for (num1 = 0;num1 <= 6;num1++) {
if (arr[num] == arr1[num1]) {
cnt++;
break;
}
}
}
printf("买对的数字个数是%d\n", cnt);
return 0;
}
可以对数组名称进行sizeof计算,结果是数组里所有存储区的总大小
/*
* 变长数组演示
* */
#include <stdio.h>
int main() {
int size = 0;
printf("请输入一个整数:");
scanf("%d", &size);
int arr[size]; //变长数组
printf("sizeof(arr)是%d\n", sizeof(arr));
return 0;
}
C99规范里允许使用变长数组,声明变长数组的时候用变量表示数组里的存储区个数,如果程序多次运行则每次运行的时候变长数组里包含的存储区个数都可能不同,某一次程序执行过程中变长数组里包含的存储区个数不会改变,变长数组不可以初始化
多维数组可以用来表示存储区的分组情况,不能表示存储区分组情况的数组叫一维数组,二维数组可以表示存储区的一次分组情况,这是最常见的多维数组.声明二维数组的时候需要提供两个整数,第一个整数表示分组个数,第二个整数表示每组里的存储区个数.二维数组名称后加两个下标可以表示二维数组里的一个存储区,前一个下标是分组编号(组下标),后一个下标是存储区编号(组内下标),组下标的有效范围从0开始到分组个数减一为止,组内下标的有效范围从0开始到组内存储区个数减一为止,可以采用多重循环依次处理二维数组里的每个存储区
/*
* 二维数组演示
* */
#include <stdio.h>
int main() {
int arr[][2] = {{1, 2}, {3}, {6}}; //二维数组演示
//arr[1][0] = 10;
int row = 0, col = 0, num = 1;
/*for (row = 0;row <= 2;row++) {
for (col = 0;col <= 1;col++) {
arr[row][col] = num;
num++;
}
}*/
for (row = 0;row <= 2;row++) {
for (col = 0;col <= 1;col++) {
printf("%d ", arr[row][col]);
}
printf("\n");
}
return 0;
}
可以把二维数组当作一维数组进行初始化,也可以在初始化的时候对初始化数据进行分组,每组初始化数据用来初始化一组存储区,如果可以根据初始化数据计算出分组个数就可以省略二维数组声明里的分组个数
二维数组名称也用来代表二维数组里第一个存储区的地址对二维数组名称进行sizeof计算结果是二维数组里所有存储区的总大小
可以在二维数组名称后只使用一个下标,这个下标是组下标。这个写法代表那一组里第一个存储区的地址。二维数组名称后加一个下标也可以看作是一个一维数组,这个一维数组里包含下标对应组中所有的存储区。
/*
* 扫雷游戏练习
* */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
int map[10][10] = {0}, row = 0, col = 0, cnt = 0, num = 0;
int delta[][2] = {-1, -1, -1, 0, -1, 1,
0, -1, 0, 1, 1, -1, 1, 0, 1, 1};
int tmp_row = 0, tmp_col = 0;
srand(time(0));
do {
//找到一个随机位置
row = rand() % 10;
col = rand() % 10;
if (!map[row][col]) {
//如果这个位置里不是地雷就放一个地雷
map[row][col] = -1;
cnt++; //地雷个数加一
}
} while (cnt < 10);
for (row = 0;row <= 9;row++) {
for (col = 0;col <= 9;col++) {
if (map[row][col] == -1) {
continue;
}
for (num = 0;num <= 7;num++) {
tmp_row = row + delta[num][0];
tmp_col = col + delta[num][1];
if (tmp_row < 0 || tmp_row > 9) {
continue;
}
if (tmp_col < 0 || tmp_col > 9) {
continue;
}
if (map[tmp_row][tmp_col] == -1) {
map[row][col]++;
}
}
}
}
for (row = 0;row <= 9;row++) {
for (col = 0;col <= 9;col++) {
if (!map[row][col]) {
printf("O");
}
else if (map[row][col] == -1) {
printf("X");
}
else {
printf("%d", map[row][col]);
}
}
printf("\n");
}
return 0;
}
C语言里可以采用分组方式管理语句,每个语句分组叫做一个函数
多函数程序执行时的时间分配情况必须遵守以下规则
1.整个程序的执行时间被分成几段,每段被分配给一个函数使用
2.所有时间段之间不能互相重叠并且必须连续
3.如果函数A把自己的时间分配给函数B使用则函数B结束后必须把后面的时间还给函数A
如果函数A把自己的时间分配给了函数B则它们之间存在函数调用关系,在这个函数调用关系中函数A叫做调用函数,函数B叫做被调用函数,只有在被调用函数工作期间才存在函数调用关系
函数调用语句可以在函数之间产生函数调用关系
/*
* 函数演示
* */
#include <stdio.h>
void func(void) {
int num;
printf("num是%d\n", num);
num = 10;
}
void func1(void) {
int num = 1000;
func();
}
int main() {
func();
func1();
return 0;
}
不可以跨函数使用变量,不同函数里的变量可以重名,如果函数多次执行则每次执行的时候里面的变量对应的存储区都可能不同,可以使用volatile关键字声明变量,这种变量的内容可以被其他程序修改
标准C语言(6)的更多相关文章
- 关于标准C语言的预定义宏【转】
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来. __LINE__ 当 ...
- 【部分原创】标准C语言的优先级、结合性、求值顺序、未定义行为和非确定行为浅析
零. 优先级 在C++ Primer一书中,对于运算符的优先级是这样描述的: Precedence specifies how the operands are grouped. It ...
- 标准SQL语言的用法
原文链接:http://www.ifyao.com/2015/05/18/%E6%A0%87%E5%87%86%E7%9A%84sql%E8%AF%AD%E8%A8%80%E4%BD%BF%E7%94 ...
- 关于标准C语言的预定义宏
标准C语言预处理要求定义某些对象宏,每个预定义宏的名称一两个下划线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义.下面预定义宏表,被我抄了下来.__LINE__ 当前 ...
- UML标准建模语言与应用实例
一.基本信息 标题:UML标准建模语言与应用实例 时间:2012 出版源:科技创新导报 领域分类:UML标准建模语言 面向对象 系统分析与设计 二.研究背景 问题定义:UML建模语言用图形来表现典型的 ...
- UML(统一建模语言)是通用的可视化标准建模语言。由构造块、公共机制、构架三部分组成。
UML UML(统一建模语言)是通用的可视化标准建模语言.由构造块.公共机制.构架三部分组成. 1.构造块:包括基本的UML建模元素(类.接口.用例等).关系(关联关系.依赖关系.泛化关系.实现关系) ...
- 标准C 语言总结
***************C语言****************** --day01-- Linux是一个和Windows类似的操作系统 通常通过终端软件使用Linux操作系统 终端软件里只能使用 ...
- 标准C语言(1)
C语言程序的绝大部分内容应该记录在以.c作为扩展名的文件里,这种文件叫源文件,C语言里还包含以.h作为扩展名的文件,这种文件叫做头文件 C语言程序里可以直接使用数字和加减乘除四则运算符号(*代表乘法, ...
- 【M35】让自己习惯于标准C++语言
1.最近一些年C++语言增加的特性有: a.RTTI,namespace,bool,关键字mutable和explicit,enums,以及const static int可以直接初始化. b.扩充了 ...
- 标准C语言的输入输出流(i/o)方法详解
cppreference.com -> 标准 C I/O ->详细说明 标准 C I/O clearerr 语法: #include <stdio.h> void cleare ...
随机推荐
- DELPHI 通用的数据记录复制过程
//表名,关键字段名,单条内容的SQL语句,产生新记录的值 function Tfrmdmmain.CopyTbale(const tablename, fileldname, swhere, new ...
- mybatis-generator自动生成代码时,只生成insert方法
今天使用mybatis-generator自动生成代码时,发现只能生成insert方法, 以前所有的方法都是可以生成的,查看网上解决办法和检查数据库表结构后, 发现2种可以解决的办法: 1.修改myb ...
- MySQLdb._exceptions.OperationalError: (2059, <NULL>)
这是将 将数据迁移至mysql8.0时遇到的问题, 在网上找到了解决方案(亲测有用), 这是因为mysql8.0密码加密的问题,mysql8.0对用户密码的加密方式为caching_sha2_pass ...
- java线程中start和run的区别
public class Test1 extends Thread { @Override public void run() { while (true) { System.out.println( ...
- 【计算机视觉】论文笔记:Ten years of pedestrian detection, what have we learned?
最近正在研究行人检测,学习了一篇2014年发表在ECCV上的一篇综述性的文章,是对行人检测过去十年的一个回顾,从dataset,main approaches的角度分析了近10年的40多篇论文提出的方 ...
- 非常好的一个JS代码(FixedMenu.htm)
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- python 爬虫 requests模块 目录
requests模块(response常用属性) 基于requests模块的get请求 基于requests模块发起ajax的get请求 基于requests模块发起ajax的post请求
- Net 文件和流 I/O
文件和流 I/O 2017/03/30 文件和流 I/O(输入/输出)是指在存储媒介中传入或传出数据. 在 .NET Framework 中,System.IO 命名空间包含允许以异步方式和同步方式对 ...
- 四则运算计算器的微信小程序_1 界面
主界面wxml文件: page{ height:100%; } .content{ min-height:100%; display:flex; flex-direction:column; alig ...
- 依赖作用域之<scope>test</scope>
经常在代码中看到依赖的作用域为<scope>test</scope>,它的作用是,只能在test目录(通过右键->Make Directory as->Test S ...