c语言

C语言笔记《八》

断了今生、忘了曾经 提交于 2020-03-02 06:41:46
#define M 10 #define N 5 int maxi,maxj; float score[M][N]; float av_stu[M],av_class[N]; /*全局变量定义每个学生的平均分 和每门课的*/ void aver_stu() /*计算每个学生平均分*/ { int i,j; float s; for(i=0;i<M;i++) {for(j=0;j<N;j++) s+=score[i][j]; av_stu[i]=s/N; } } void aver_class() /*计算每门课的平均分*/ { int i,j; float s; for(i=0;i<N;i++) { for(j=0;j<M;j++) s+=score[i][j]; av_class[N]=s/M; } } float high() { int i,j,max; max=score[0][0]; for(i=0;i<M;i++) { for(j=0;j<N;j++) if(max>score[i][j]) { maxi=i; maxj=j; } } return(max); } main() { int i,j; float max; for(i=0;i<M;i++) { printf("input NO.%d score \n",i+1); for(j=0;j<N;j++)

C语言学习笔记(八)--数组

若如初见. 提交于 2020-03-02 06:40:39
1 数组 在程序设计过程中我们往往需要处理一批相同类型的数据,如果使用基本类型定义变量来储存,显然是不方便的,这是我们就需要使用数组了。 2 数组特点 1.数组大小必须是确定的,不能随机改变的。 2.数组的元素必须是相同类型的,不允许出现混合类型。 3 一维数组 3.1 一维数组的定义: 类型说明符 数组名 [ 常量表达式 ] ; 例如: int a[10] 数组的生命需要注意以下几个问题: 1.数组的命名规则与变量相同; 2.常量表达式代表的是数组元素的个数,也就是数组的长度; 3.数组的下标是从 0 开始的,最后一个元素的下标是数组长度减 1 ; 4.数组的定义可以和普通变量一起声明和定义 Float i,j[]; 3.2 一维数组的引用:数组名 [ 下标表达式 ]; 例如: int a[5]; a[3]=10; 其中下标表达式可以是任意类型的表达式,但值必须是非负整型的。 数组分配内存空间是连续的空间,地址从低地址到高地址。 例子代码: #include "stdio.h" main() { float score[10]; int i; printf("please input scores:\n"); for (i=0;i<10;i++) /*数组下标为0~9*/ scanf("%f",&score[i]); /*依次输入每个数组元素*/ printf("\n");

C语言学习笔记<八>

别来无恙 提交于 2020-03-02 06:40:14
通过使用联合可以用不同的方式操作内存中同一段区域。 计算机中存储数据的方式有两种,把低位数据存储在低地址字节中的方式叫做小端存储方式,相反就叫大端存储方式,我们的计算机采用的是小端存储方式。 使用枚举类型可以把一组名称转换成整数,从数字0开始。 堆里的变量的生命周期是由程序员来管理的, 可以使唤用C语言提供的函数对堆中的变量进行管理,为了使用这些函数需要包含头文件stdlib.h。 malloc函数可以从堆中分配指定个数的连续字节把首字节地址返回。如果失败则返回NULL . free 函数可以把堆中的变量释放掉,需要首字节地址作为参数。 calloc 函数也可以从堆中分配变量,并且保证把变量都清0. realoc 函数可以调整一段已经分配好的内存空间的大小。如果失败返回空地址。特殊情况下操作效果类似于malloc 或free.0 const 指针有两种声明方法 const int *p_value; int * const p_value; 前一种指针表示的整数变量不可以被修改 后一种指针表示的指针变量本身不可以被修改。 二级指针变量用来记录一级指针变理的地址,声明方法如下 int **pp_value; 二级指针变理可以用来表示它自己和对应的一级指示变量以及整数变量,使用方法如下 pp_value 表示二级指针 *pp_value 表示对应的一级指针。 **pp_value

typedef 类型重命名 和 #define 宏定义(1)

大憨熊 提交于 2020-03-02 05:57:45
http://www.blogjava.net/jasmine214--love/archive/2010/11/29/339307.html 在现实生活中,信息的概念可能是长度,数量和面积等。在C语言中,信息被抽象为int、float和double等基本数据类型。 从基本数据类型名称上, 不能够看出其所代表的物理属性 ,并且int、float和double为系统关键字,不可以修改。 为了解决用户自定义数据类型名称的需求,C语言中引入类 型重定义语句typedef ,可以为数据类型定义新的类型名称,从而 丰富数据类型所包含的属性信息 。 typedef的语法描述 : typedef 类型名称 类型标识符; 例如:typedef double LENGTH; typedef unsigned int COUNT; typedef 的主要应用有如下的几种形式 : 1) 为基本数据类型定义新的类型名 。例如: typedef unsigned int COUNT; typedef double AREA; 此种应用的主要目的,首先是丰富数据类型中包含的属 性信息,其次是为了系统移植的需要,稍后详细描述。 2) 为自定义数据类型(结构体、公用体和枚举类型)定义简洁的类型名称(在c++中没有这个必要了,因为直接可以使用类型名定义变量,前面不用加struct) 。例如: struct

C语言中带参数的宏

余生长醉 提交于 2020-03-02 05:32:35
带参数的宏定义有如下的格式: 【#define 指令----带参数的宏】 #define 标识符(x1,x2,……,xn) 其中 x1,x2,……xn是标志符(宏的参数) 注意:在宏的名字和括号之间必修没有空格。 如果有空格,预处理会认为是在定义一个简单的宏,其中(x1,x2,……,xn)是替换列表的一部分 当预处理器遇到一个带参数的宏,会将定义存储起来以便以后使用。在后面的程序中,如果任何地方出现了标识符(y1,y2……,yn)格式的宏调用(其中y1,y2, ……yn是一些列标记),预处理器会使用替换列表替代,并使用yi替换xi e.g. 假如我们定义了如下的宏: #define MAX(x,y) ((x)>(y) ? (x) : (y)) #define IS_EVEN(n) ((n)%2==0) 下面的例子是一个更加复杂的宏: #define TOUPPER(c) ('a'<=(c) && (c)<='z' ? (c)-'a'+'A' : (c)) 带参数的宏可以包含空的参数列表,如下所示: #define getchar() getc(stdin) 空的参数列表不是一定确实需要,但可以使getchar更像一个函数 使用带参数的宏替代实际的函数有两个优点: 程序可能会稍微快些。一个函数调用在执行时通常会有些额外开销----存储上下文信息、复制参数的值等

进程之fork()函数的详细介绍

旧时模样 提交于 2020-03-02 05:15:54
内容介绍 本博文主要探讨fork函数以及execuv的用法。 头文件介绍 下面的是csapp.h头文件,后面的讨论中均只用该头文件来完成程序的编写。 /* $begin csapp.h */ #ifndef __CSAPP_H__ #define __CSAPP_H__ #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <ctype.h> #include <setjmp.h> #include <signal.h> #include <sys/time.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/mman.h> #include <errno.h> #include <math.h> #include <pthread.h> #include <semaphore.h> #include <sys/socket.h> #include <netdb.h> #include <netinet/in.h> #include <arpa/inet.h> /* Default file

C语言文件操作详解

限于喜欢 提交于 2020-03-02 04:13:23
C语言文件操作详解 C语言中没有输入输出语句,所有的输入输出功能都用 ANSI C提供的一组标准库函数来实现。文件操作标准库函数有:       文件的打开操作 fopen 打开一个文件       文件的关闭操作 fclose 关闭一个文件       文件的读写操作 fgetc 从文件中读取一个字符               fputc 写一个字符到文件中去               fgets 从文件中读取一个字符串               fputs 写一个字符串到文件中去               fprintf 往文件中写格式化数据               fscanf 格式化读取文件中数据               fread 以二进制形式读取文件中的数据               fwrite 以二进制形式写数据到文件中去               getw 以二进制形式读取一个整数               putw 以二进制形式存贮一个整数     文件状态检查函数 feof 文件结束               ferror 文件读/写出错               clearerr 清除文件错误标志               ftell 了解文件指针的当前位置       文件定位函数 rewind 反绕              

轻量级协程库-C语言实现

混江龙づ霸主 提交于 2020-03-02 03:23:41
协程(coroutine)顾名思义就是“协作的例程”(co-operative routines)。跟具有操作系统概念的线程不一样,协程是在用户空间利用程序语言的语法语义就能实现逻辑上类似多任务的编程技巧。实际上协程的概念比线程还要早,按照 Knuth 的说法 “子例程是协程的特例” ,一个子例程就是一次子函数调用,那么实际上协程就是类函数一样的程序组件,你可以在一个线程里面轻松创建数十万个协程,就像数十万次函数调用一样。只不过子例程只有一个调用入口起始点,返回之后就结束了,而协程入口既可以是起始点,又可以从上一个返回点继续执行,也就是说协程之间可以通过 yield 方式转移执行权, 对称(symmetric)、平级 地调用对方,而不是像例程那样上下级调用关系。当然 Knuth 的“特例”指的是协程也可以模拟例程那样实现上下级调用关系,这就叫 非对称协程 (asymmetric coroutines)。 基于事件驱动模型 我们举一个例子来看看一种 对称协程 调用场景,大家最熟悉的“生产者-消费者”事件驱动模型,一个协程负责生产产品并将它们加入队列,另一个负责从队列中取出产品并使用它。为了提高效率,你想一次增加或删除多个产品。伪代码可以是这样的: 1 2 3 4 5 6 7 8 9 10 11 12 13 # producer coroutine loop while queue

EclipseforC/CPP 之配合 doxygen + graphviz 生成HTML代码文档

雨燕双飞 提交于 2020-03-02 02:51:56
JAVA语言中的代码注释那是相当好的一个东西,尤其是使用了Eclipse之后,简直是程序员的福音。小弟前几天用了一下午的时间,经过在网上的查找以及我一点点的探索,终于搞定在windows平台下,使用 Eclipse for c/cpp + doxygen + graphviz 自动提示代码注释以及生成HTML格式的文档。 还不知道doxygen的同学,请自行百度/Google 声明:JDK以及mingw的安装和配置请自行解决,这里的测试以C语言为主 使用到的软件: jdk mingw eclipse for c/cpp doxygen eclox graphviz 一、安装doxygen、graphviz以及eclipse插件:eclox doxygen、graphviz的安装比较简单,就是典型的下一步,不再赘述。 然后就是在eclipse【实际上是 Eclipse IDE for C/CPP ,以下简称为 eclipse】中安装doxygen的插件 eclox了,它的下载地址 http://home.gna.org/eclox/ 至于 eclipse 安装插件的方法,这里推荐使用 link 安装方法,具体的作法不再多说 安装好之后,还要做一些设置: 1、window->preferences->doxygen 在右侧点击 Add,添加doxygen安装目录的bin目录

c语言文本局部修改

好久不见. 提交于 2020-03-02 01:03:55
文章目录 一、借助新建文件 二、文件指针定位覆盖 1. 得到待修改的数据在文件中的位置 2. 将文件内部指针定位到该位置 3. 写入新数据到文件 两种方法修改局部数据 一、借助新建文件 //已在内存中修改过单行数据后直接调用该函数 void RebuildFile ( List a ) //List为结构体指针,指针a指向已修改部分链表 { int num1 ; char name1 [ 100 ] ; double source ; FILE * p1 = fopen ( "...\\date.txt" , "r" ) ; FILE * p2 = fopen ( "...\\date2.txt" , "w+" ) ; //新建date2.txt while ( fscanf ( p1 , "%d%s%lf" , & num1 , name1 , & source ) == 3 ) { if ( strcmp ( a -> name , name1 ) ) //未修改部分直接存入 fprintf ( p2 , "%d %s %.2lf\n" , num1 , name1 , source ) ; else fprintf ( p2 , "%d %s %.2lf\n" , a -> num , a -> name , a -> source ) ; //修改后数据存入 }