自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(85)
  • 收藏
  • 关注

原创 【例10-20】文件定位函数

1.fseek()函数作用:用于设置文件指针位置。fseek()函数的一般调用形式:fseek(文件指针,偏移量,设定文件开始偏移的位置);注:1)偏移量用长整型表示,正数表示正向偏移,负数表示负向偏移。2)偏移位置的取值有数值和符号常量两种:符号常量 数值 含义 SEEK_SET 0 文件开头 SEEK_CUR 1 当前位置 SEEK_END 2 文件结尾 例如:fseek(fp, 100L, 0); ...

2022-05-31 18:30:00 986

原创 【例10-19】文件检测函数

1.文件结束检测函数 feof()函数feof()用于检测文件位置指示器是否到达文件结尾,若是,返回一个非零值;若否,返回 0。二进制文件中的文件结尾标志 EOF 也是一个合法的二进制数,所以feof()函数即可以用于判断二进制文件也可以判断文本文件。对于文件,只根据简单的检查读入字符的值来判断文件是否结束是不可行的,还有可能会造成文件未结尾而被认定为结尾,所以必须有feof()函数。常用的判断文件是否结束得语句:while(!feof(fp)) ch = fgetc(fp);含义:只要文件指...

2022-05-31 14:15:00 652

原创 【例10-15】按数据块读写文件

(四)按数据块读写文件1.数据块写函数 fwrite()功能:把数据块(多个数据)写入目标文件中。fwrite()函数的一般调用形式为:fwrite(数据块存放的起始地址,数据块中每个数据的字节数,数据块中数据的个数,指向目标文件的指针); //演示1函数操作成功时,返回值为实际写入数据项的个数,如果操作失败,返回值0。该函数以二进制形式对文件进行操作,而不局限于文本文件。2.数据块读函数 fread()功能:从目标文件中读取数据块(多个数据)。fread()函数的一般调用形式为:...

2022-05-31 10:00:00 570 1

原创 【例10-11】按格式化读写文件

(三)按格式化读写文件1.格式化写函数 fprintf()功能:按照指定的格式把数据写入文件中。fprintf()函数的一般调用形式为:fprintf(指向目标文件的指针,写入数据的格式控制字符串,要写入目标文件的数据); //演示1例:fprintf(fp,"%d,%d",10,20); //将10和20以整型数据写入fp指向的文件中fprintf(fp,"%lf",n); //将变量n的值以双精度浮点型数据写入fp指向的文件中fprint...

2022-05-31 08:45:00 755

原创 【例10-7】按字符串读写文件

(二)按字符串读写文件1.字符串写函数 fputs()功能:向目标文件写入一个字符串(不自动写入字符串结束标记符'\0')。fputs()函数的一般调用形式为:fputs(要写入文件的字符串,指向目标文件的指针); //演示1注:fputs()函数的"参数1"可以是字符型指针,可以是字符串常量,也可以是存放字符串的字符数组首地址。成功写入一个字符串后,文件的位置指针会自动后移,函数返回值为非负整数,否则返回EOF(符号常量,其值为-1) 。2.字符串读函数 fgets()功能...

2022-05-30 18:16:26 225

原创 【例10-4】按字符读写文件

文件打开后,我们一般要对文件进行一些操作,也就是文件读写操作。读写操作方式有:字符、字符串、格式化、数据块。(一)按字符读写文件1.字符写函数 fputc()功能:将字符写入文件中。fputc()函数的一般调用形式为:fputc(要写入文件的字符,指向目标文件的指针); //演示1fputc()函数操作成功时,返回写入文件字符的ASCII值,否则返回EOF 。2.字符读函数 fgetc()功能:从文件中读取一个字符。fgetc()函数的一般调用形式为:fgetc(指向目标文...

2022-05-28 14:13:19 318

原创 【例10-1】文件的打开与关闭

(一)文件操作概述:C语言通过系统提供的结构类型FILE定义的文件指针变量来访问文件,可通过定义的文件指针来进行文件操作。结构类型FILE已在头文件stdio.h中定义了,因此,文件操作时用 FILE 直接定义文件指针变量即可。定义形式为:FILE *文件指针变量名; //FILE必须大写,*表示定义的变量是指针类型(二)常见的文件后缀.doc (Word生成的文件).txt (文本文件).dat (数据文件).c (C源文件).cpp (C++源文件).for (FORTRAN源...

2022-05-27 15:16:11 641

原创 【例9-9】用户自定义类型

C语言允许用typedef说明一种新的类型名,或对已有基本数据类型重新命名。1.将已有基本数据类型重新命名的一般格式为:typedef 基本类型名 新类型名;如:typedef int NEW_INT; //将整型变量重新命名为NEW_INTNEW_INT i, j; //用NEW_INT定义变量i,j使用typedef说明后,NEW_INT就成为int的同义词。但重命名后的NEW_INT只能用来定义int型变量,而不能取代int的地位,如,"long NEW_I...

2022-05-25 10:11:32 260

原创 【例9-8】共用体类型

"共用体"也称为"共同体"、"联合体",是一种数据类型。共用体的说明、共用体变量的定义与结构体十分相似,只是使用的关键字不同。(一)定义共用体union [共用体名称] //[]内的名称可根据需要进行取舍{ 共用体成员1; 共用体成员2; … 共用体成员n;}共用体变量1,共用体变量2,… ; //共用体变量也可单独由"union 共用体名 共用体变量名"创立使用共用体变量时,系统按其成员中占用内存字节数最多者分配内存(演示1),...

2022-05-24 21:53:43 863

原创 【例9-7】链表

(一)单链表链表是一种常见的数据结构,它是一组结点(node)的序列。线性结构的链表除了单链表外,还有循环链表、双向链表。《C语言程序设计.主编:衡军山 马晓晨》中只是简单的讲述了单链表,想了解更多链表知识可以去找《数据结构(C语言版 第2版)主编:严蔚敏》,目前也有第3版的。1.认识单链表数据域:用于存放数据。指针域:用于存放下一结点的内存地址(即指针)。结点:由数据域和指针域构成一个结点。用结构体类型定义该数据结构:struct node { //结点名为node...

2022-05-21 19:12:36 284

原创 【例9-6】用函数处理结构体类型数据

(一)结构体变量作函数参数结构体变量不能作为一个整体进行输入输出,但可以作为一个整体被复制、赋值、传递给函数并可作为函数返回值。当用结构体变量作参数时,实际上是把变量中包含的全部成员一一传递给形参。当该结构体变量的成员所占内存较大时,会使传递的时间和空间开销过大,因此,采用结构体指针变量,即用指向结构体变量的指针作为函数参数,这时由实参传递给形参的只是地址,会更节省开销。//用函数处理结构体类型数据演示1输出表中总成绩最高的考生信息,用函数实现最高总成绩的考生信息的查找。编号 姓名

2022-05-20 11:04:35 344

原创 【例9-3】结构体变量的引用

(三)结构体变量的引用1.引用结构体变量成员若定义了一个结构体变量和一个指向结构体变量的指针,则有以下三种引用形式:(1)结构体变量.成员名 //利用成员运算符"."访问 //演示1(2)(*结构体指针).成员名 //利用指针运算符"*"和成员运算符"."访问 //演示2(3)结构体指针->成员名 //利用指针和指向运算符"->"访问 //演示22.引用整个结构体变量相同类型的结构体变量...

2022-05-19 14:31:13 4109

原创 【例9-2】结构体变量的定义

(二)结构体变量的定义1.定义的方式有2种:(1)struct 结构名 结构体变量; //演示1(2)将结构体类型说明和结构体变量合二为一。 //演示22.结构体变量初始化:按结构体中每个成员在结构中的顺序依次对应赋初值,所赋初值用"{}"括起。(两种定义方式都如此) //演示33.系统给结构体变量分配内存的字节总数:结构体变量所包含的各个成员变量所占字节数之和。如演示2中,结构体变量"a"所占字节数为num(4B)+name(10B)+exam...

2022-05-19 14:06:55 569

原创 【例9-1】结构体类型的说明

生活中会遇到一些表格数据,表格数据的构成有如下特点:1.行内各字段数据的类型和含义不完全相同;2.各行间数据类型情况是相同的。这是一个特殊的集合体,不同类型的数据作为一个整体存在,并以"行"为单位进行处理、针对此类数据,C语言提供了"结构体"这一构造类型来进行表示。结构体类型的基本使用:使用方法类似于绘制二维表格的过程,第一步:结构说明为结构起个名称,同时列出该结构由哪些成员构成(名称、类型)。第二步:结构变量定义根据需要定义,可以是单个变量(一行),也可以是数组(多行)。 //一个...

2022-05-19 13:59:04 445

原创 【例8-17】动态内存分配

动态内存分配:在程序执行的过程中动态地分配或回收存储空间的内存分配方法,动态内存分配不像数组等静态内存分配那样需要预先分配存储空间,而是由系统根据程序的需要实时分配。C语言提供了能够实现动态内存分配与管理的相应库函数。使用下列函数前,需包含其对应的头文件"stdlib.h"。(1)malloc 函数malloc 函数原型是void *malloc(unsigned int size);作用:在内存的动态存储区中分配一个长度为 size 的连续空间。其参数是一个无符号整型数,返回值是一个指针,指

2022-05-18 13:12:50 176

原创 记录:Warning C4129: “i”: 不可识别的字符转义序列

//出现该警告的源程序(已修改)#include<stdio.h>int main(){ FILE* fpin; errno_t err; //err = fopen_s(&fpin, "d:\test\in.dat", "r"); //Warning C4129 err = fopen_s(&fpin, "d:\\test\\in.dat", "r"); if (err != 0) puts("文件打开失败."); else printf("..

2022-04-30 13:05:12 1318 1

原创 记录:Warning C6387: “fp“可能是“0“,这不符合函数“fclose“的规范

Warning C6387: "fp"可能是"0",这不符合函数"fclose"的规范。//出现该警告的源程序(已修改)#include<stdio.h>int main(){ FILE* fp; errno_t err; err = fopen_s(&fp, "test.dat", "r"); if (err != 0) puts("文件打开失败"); else printf("文件打开成功"); if (fp == NULL) //无该条件判断.

2022-02-28 17:16:11 10712

原创 记录:Erorr C4996: ‘fopen‘: This function or variable may be unsafe.

Erorr C4996:'fopen': This function or variable may be unsafe.Consider using fopen_s instead.To disable deprecation,use _CRT_SECURE_NO_WARNINGS. See online help for details.

2022-02-28 16:38:46 281

原创 【例8-16】返回地址的函数

函数的返回值可以是地址(指针类型),用户可以根据需要自定义返回值为地址的函数。此时函数的定义形式为:类型标识符 *函数名 (形参列表)正确使用返回值为指针的函数,应有以下三点:1.在函数定义时,通过在函数名前添加"*"指明函数返回值为地址值。2.在函数返回值语句 return 中指明返回的地址值。3.主函数中返回值的接收着也为指针类型。//返回地址的函数演示将两个整数中较大的那个数的地址作为返回值#include<stdio.h>int* bigger(int*, int

2022-02-25 16:34:14 5739

原创 【例8-13】用字符指针操作字符串

字符串实质上是存放在某存储区域的一串字符序列,所以可以用字符指针指向字符串,通过字符指针访问该存储区域。例如:char *cp = "a string" cp被定义为字符指针,它指向字符串的首字符"a",通过cp[i]或*(cp+i)就可以访问到每一个字符。例题中出现的输入缓冲区问题:输入缓冲区:所有从键盘输入的数据,不管是字符还是数字,都是先存储在内存的缓 冲区中,叫作“键盘输入缓冲区”,简称“输入缓冲区”或“输入流”。从键盘输入的数据都会被依...

2022-02-22 20:29:23 3067

原创 【例8-10】用指针操作二维数组

(一)用指针操作二维数组:(1)二维数组中蕴含的地址关系定义一个整型二维数组a[3][4] = {{11,21,31,41},{22,32,42,52},{33,43,53,63}};对于存储地址、数组元素有如下等价关系:(a为数组名(首地址)、i为行循环控制变量、j为列循环控制变量)存储地址的表示方式:&a[i][j] <---> a[i]+j <---> *(a+i)+j数组元素的表示方式:a[i][j] <---> *(a[i]+j) <---

2022-02-22 20:06:33 3814

原创 【例8-6】用指针操作一维数组

用指针操作一维数组:(一)定义一个一维数组a[5]、一个指针变量*p并初始化为一维数组首地址a,即*p = a = &a[0]。对于一维数组和指针有如下等价关系(i为循环控制变量):表示地址:&a[i] <---> a+i <---> p+i表示元素:a[i] <---> p[i] <---> *(a+i) <---> *(p+i)(二)数组名作函数参数利用函数处理一维数组时,不需要将数组的每一个元素都传递给函数,只需要

2022-02-19 14:48:01 3742

原创 【例8-4】指针变量的基本使用

引用指针变量的一般方法为:*指针变量名(1)"*"为指针运算符,用来求得指针变量所指向的变量的值,即指针变量指向内存单元的内容。(2)定义中的"*"是标志符,此处"*"是运算符。(个人理解)指针变量存放的是某个变量地址,加"*"就是拿出这个变量地址里的东西。//指针变量的基本使用演示1通过指针变量访问的方式计算两个整数之和。#include<stdio.h>int main(){ int a, b, s = 0; int* pa = &a, * pb = &amp

2022-02-18 12:29:03 1068

原创 【例8-1】指针变量的定义

计算机的内存是以字节为单位的一片连续的存储空间,每一个字节都有一个内存地址。scanf_s("%d",&n); //使用地址运算符&获得变量n的存储地址char str[10];gets_s(str,10) //一维数组的名称str代表该数组在内存中的首地址&n就是变量n的指针,str就是字符数组str[10]的指针。C语言允许用一个变量来存放指针,这种变量称为指针变量,指针变量的值就是某个内存单元的地址。(一)指针变量的定义定义指针变量的

2022-02-18 07:45:00 1639

原创 【例7-13】变量的存储类型

(二)变量变量的存储类型:"动态储存"、"静态储存"。1.动态储存变量:在程序执行过程中,函数调用它时才分配存储单元,使用完毕立即释放,多次 调用,则反复分配和释放存储单元。属于动态储存变量的储存类型有:auto(自动变量)、register(寄存器变量)。(1)auto(自动变量):auto变量均为局部变量,在赋初值前,其值是不确定的。对于同一函数两次 调用之间,自动变量的值不保留,因为动态存储变量多次调用时,反复分配和释放存储单元。(2)register(...

2022-02-17 12:00:27 644

原创 【例7-12】变量的作用域

函数、变量都有其存储类型和作用域。(一)函数函数的存储类型:extern(外部函数)、static(内部、静态函数)函数的作用域:当函数存储类型为extern 时,函数能被所有编译单位使用; 当函数存储类型为static 时,函数只限于某一个编译单位使用。指明存储类型的函数定义的一般形式:[存储类型] 函数返回类型 函数名(形参列表){ 函数体;}函数的存储类型默认为extern 。(二)变量变量的作用域:局部变量、全局变量。1...

2022-02-17 11:49:55 456

原创 记录:Warning C6385 : 从“p”中读取的数据无效: 可读大小为“n * sizeof(int)”个字节,但可能读取了“8”个字节。

Warning C6385 : 从“p”中读取的数据无效: 可读大小为“n * sizeof(int)”个字节,但可能读取了“8”个字节。官网解释:警告 C6385:无效数据:访问buffer-name,可读大小为size1字节,但size2字节可以读取:行:x、y缓冲区的可读范围可能小于用于从缓冲区读取的索引。 尝试读取有效范围外的数据会导致缓冲区溢出。源程序(已改正,警告语句在注释行):#include<stdio.h>#include<stdlib.h>.

2022-02-16 17:05:45 6478 6

原创 记录:Warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。

网上复制的代码保存到记事本中,并把文件后缀名改为.c 。打开Visual Studio 2022,点击右下角"创建新项目",选择"空项目"。创建完成后,单击"源文件",右键展开选项,选择"添加"-"现有项",在文件浏览中找到保存好的代码.c 。运行后出现警告"warning C4819"。warning C4819: 该文件包含不能在当前代码页(936)中表示的字符。请将该文件保存为 Unicode 格式以防止数据丢失。解决方法:1.点击左上方的"文件"2.选择"xxx.c另存为".

2022-02-16 16:39:31 1647

原创 【例7-10】使用递归函数解决问题

使用递归解决问题的关键是(1)找出递归关系,然后给出(2)递归调用的终止条件。//使用递归解决问题(1)用递归求n的阶乘 n! = n(n-1)(n-2)…1 = n(n-1)! 注:1的阶乘等于1 0的阶乘等于1递归关系:n > 1时,n!= n(n-1)!递归终止条件:当n = 1或n = 0时,n!=1#include<stdio.h>int fac(int n) //函数定义{ if (n == 0 || n == 1) retur...

2022-02-03 08:30:00 462

原创 【例7-9】递归问题的引入

递归:函数自己不断调用自己(递),直到调用到唯一已知对象(终止条件)后,开始层层返回上一步(归)的一个完整过程。递归作为一种算法在编程中广泛应用,它通常把一个大型复杂的问题层层转化为一个个与原问题相似、规模较小的问题来求解。递归需要边界条件(终止条件),当边界条件不满足时,递归前进;当边界条件满足时,递归返回。如果没有边界条件,只递无归的话,会造成栈溢出,导致程序崩溃。递归的优点:在某些特定的问题上,能通过简单的递归关系得到解决。递归算法只需少量程序就可描述出解题过程所需的多次重复计算,使得程序更加简洁

2022-02-02 21:30:00 1206

原创 【例7-7】用带参数的宏定义代替公式型函数

公式型函数:通过一个公式表达式来求得函数返回值的函数。如:z = x > y ? x : y; S = πr^2可以用带参数宏定义代替该公式型的函数。(一)带参宏定义的一般形式#define 宏名(形参列表) 字符串1.宏名一般用大写字母表示。2.形参有多个时,各参数间用[英]逗号隔开,形参不分配内存单元,因此不必作类型定义3.字符串中要用到形参列表中所有的形参。(二)带参宏调用的一般形式宏名(实参列表);1.实参可以是常量、变量、表达式,但必须有具体的值;且实参数量要和形参一一...

2022-02-02 15:56:16 1651

原创 【例7-5】自定义函数的调用

(一)函数调用的形式函数调用的一般形式为:函数名(实际参数列表)1.若调用无参函数,实际参数列表(简称实参)为空;调用有参函数时,在()内写出实参,当有多个实参时,用[英]逗号隔开,且实参与形参的类型、数量需一致。2.若函数无返回值,函数调用通常单独作为一个语句; 若函数有返回值,函数调用通常出现在表达式中,或者作为某个函数的实参。(二)函数调用过程中的参数传递对于有参函数,函数调用过程中参数传递有两种情况,分别为数值传递、地址传递。1.数值传递:实参传递给形参的数据是数值,实参和形参在内.

2022-02-01 17:15:00 3844

原创 【例7-4】自定义函数的声明

函数声明的作用:把有关函数的信息(函数名、函数类型、函数参数的类型与个数)通知编译系统,当进行编译时,编译系统依据声明检查被调用函数是否正确存在。(一)函数声明的方法1.库函数的声明:在源程序开头包含头文件即可。2.自定义函数的声明:函数首部加上[英]顿号";",函数首部也称为函数原型。注:在函数声明中形参变量名可以省略不写,只写形参的类型,但形参的类型和个数必须与函数首部保持一致。如:(int x, int y)可写为(int , int )、(char str[])可写为(char [])

2022-02-01 08:00:00 2010

原创 【例7-2】自定义函数的定义

(一)函数应包括的内容1.函数返回值类型:用来表明函数执行后是否有返回值,是什么类型的返回值2.函数名:唯一标识该函数,供使用者按名调用。3.函数参数:包括参数的名字和类型,用来表明该函数要接收的参数信息。4.函数功能:函数应当完成的操作,在函数体中编写代码实现。包括以上4点的完整代码描述称为函数的定义。(二)用户自定义函数的一般形式函数返回类型 函数名(形式参数列表) //函数首部{ 函数体;}1.函数首部:包括返回值类型、函数名、形式参数等信息。2.返回值类型:有返回...

2022-01-31 20:00:00 1320

原创 【例7-1】自定义函数示例

程序的功能全部都是在主函数main()函数中实现的,当程序功能较复杂时,主函数规模会变得很大,把一些常用的程序"模块化",当主函数需要使用该"模块"的功能时,直接调用"组装"在主函数上。(一) C程序的执行从主函数main()开始,主函数通过调用其它函数完成相关任务,其它函数的地位平等,可根据需要相互调用。(二) "模块化"的程序有"库函数"和"用户自定义函数"两类。1.库函数:由系统提供的,调用时只需进行头文件声明即可。2.用户自定义函数:用于解决用户专门需要的函数,使用时包括函数的声明、定

2022-01-31 09:00:00 891

原创 【例6-25】批量数据处理综合应用(3)

//输入一个字符串,然后输入字符串中的指定字符,要求输出删掉指定字符后的字符串#include<stdio.h>#define N 100int main(){ int i, j; char str[N], ch; printf("请输入一个字符串:"); gets_s(str, 100); printf("请输入字符串中单个或连续的字符:"); ch = getchar(); for (i = 0; str[i] != '\0'; i++) //第一层循环,没遇到

2022-01-30 09:15:00 265

原创 【例6-24】批量数据处理综合应用(2)

//输入某宿舍4名学生的5门课程成绩,统计输出该宿舍每个同学的总成绩。#include<stdio.h>int main(){ int score[4][5], sum[4]={0}; int i = 0, j = 0; for (i = 0; i < 4; i++) { printf("请输入第%d位同学的5门成绩:\n", i + 1); for (j = 0; j < 5; j++) { scanf_s("%d", &score[i]

2022-01-29 20:30:00 477

原创 【例6-23】批量数据处理综合应用(1)

//采用冒泡法对选秀节目中10位评委所给出的分数排序。冒泡法:从首元素开始两两比较,score[j] 和 score[j + 1],若score[j] > score[j + 1],则score[j] 与 score[j + 1]进行交换,完成交换需要一个中间参数n,n = score[j]; //把原score[j]的值赋给中间参数nscore[j] = score[j + 1]; //把score[j+1]的值赋给score[j]scor...

2022-01-29 09:00:00 494

原创 【例6-22】字符串比较函数strcmp()

在使用字符串处理函数前,需要在程序开头使用编译预处理命令 #include<string.h>(六)字符串比较函数 strcmp()函数调用格式:strcmp(str1,str2);函数功能:按字典序比较字符串 str1 和 str2 的大小。比较规则:将两个字符串自左向右逐个字符进行ASCLL码大小比较,直到出现不同字符或遇'\0'停止; 若全部字符相同,返回 0 值; 若出现第一对不同字符,计算其ASCII之差; ASCII...

2022-01-28 18:30:00 9588

原创 【例6-21】字符串连接函数strcat()、strcat_s()

在使用字符串处理函数前,需要在程序开头使用编译预处理命令 #include<string.h>(五)字符串连接函数 strcat()函数调用格式:strcat(str1,str2); //已过时//Error C4996 : 'strcat': This function or variable may be unsafe.//Consider using strcat_s instead. To disable deprecation,//use _CRT_SECURE_NO_...

2022-01-28 09:00:00 631

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除