
C语言及程序设计
学习贺利坚老师的《C语言及程序设计》课程笔记!
꧁ꦿ信念ꦿ꧂
大鹏一日同风起,扶摇直上九万里。
展开
-
第84节 操作字符串数组
一.用数组存储多个字符串的方案1.用二维字符数组char name[5][10]={“Zhao”,“Qian”,“Sun”,“Li”,“Zhou”};2.用指针数组char* name[5]={“Zhao”,“Qian”,“Sun”,“Li”,“Zhou”};二.姓氏排序#include <stdio.h>#include <string.h>void sort(char* name[], int n);void print(char* name[], int n)原创 2021-06-03 00:24:34 · 388 阅读 · 1 评论 -
第83节 多维数组作函数参数
一.用多维数组名作函数参数1.写函数,求3×4矩阵中所有元素中的最大值#include <stdio.h>int max_value(int array[][4]);int main(){ int a[3][4] = { {11,32,45,67},{22,44,66,88},{15,72,43,37} }; printf("max value is %d \n", max_value(a)); return 0;}int max_value(int array[][4])原创 2021-06-01 01:05:44 · 683 阅读 · 0 评论 -
第82节 使用指针操作二维数组
一、使用“指向”二维数组“元素”的指针#include <stdio.h>int main(){ int a[3][4] = { 1,3,5,7,9,11,13,15,17,19,21,23 };//可看作: int a[3][4] = { a[0],a[1],a[2] }; 其中a[0]是首元素,且a[0]是一维数组名;//a[0]可看作: int a[0][4] = { a[0][0],a[0][1],a[0][2],a[0][3] };其中a[0]为数组名; int* p =原创 2021-05-30 23:43:53 · 1021 阅读 · 1 评论 -
第81节 二维数组的存储及地址表示
#include <stdio.h>int main(){ int a[3][4] = { {1,2,3,4}, {11,12,13,14}, {21,22,23,24}, }; //以下四种输出都是元素a[2][3]的地址 printf("%p\n", &a[2][3]); printf("%p\n", a[2] + 3); printf("%p\n", *(a + 2) + 3); // =>*((&a[0]+2)+3) =...原创 2021-05-26 23:12:55 · 1593 阅读 · 2 评论 -
第80节 二维数组元素的引用
一、二维数组元素由其行、列下标决定以float a[3][4];为例:1.引用a[2][3]—行、列下标均是整数2.引用a[2-1][2*2-1]—行、列下标可以是整型表达式3.a[1][2]=3.14/2;—数组元素作为赋值表达式的左值4.a[3][4]=15;—错误!最后一个元素是a[2][3],“越界”二、输入输出二维数组元素1.二维数组行序优先输出#include <stdio.h>int main(){ int a[3][5]; //定义3行5列的二维数组 in原创 2021-05-25 23:09:54 · 3306 阅读 · 0 评论 -
第79节 二维数组及其定义
一、体会二维数组1.概念: 具有两个下标的数组,多行、多列;2.举例: float a[3][4];3.含义: 数组存储类型均为float型,数组a共有3行、4列元素;4.元素:a01230a[0][0]a[0][1]a[0][2]a[0][3]1a[1][0]a[1][1]a[1][2]a[1][3]2a[2][0]a[2][1]a[2][2]a[2][3]二、初始化二维数组1.分行给二维数组赋初值,如(直观、方便)int原创 2021-05-24 23:52:19 · 955 阅读 · 0 评论 -
第78节 编写自己的字符串函数
一.编写字符串函数的意义1.借此学习文字处理的方法;2.C库函数功能,不能满足所有要求;3.你可以成为开发系统函数的人;二.字符串复制(下标法)#include <stdio.h>char* scopy(char* str1, const char* str2);int main(){ char s1[50]; scopy(s1, "I am happy."); printf("%s\n", s1); return 0;}char* scopy(char* str1,原创 2021-05-23 23:54:02 · 241 阅读 · 0 评论 -
第77节 字符和字符串处理函数
一.字符函数和字符串函数1.C语言中进行文字处理的方法①自编代码完成②利用库函数2.字符库函数include <ctype.h>3.串处理函数include <string.h>二.字符函数 include <ctype.h>实例: 利用库函数统计数字字符个数#include <stdio.h>int main(){ char str[50] = { 0 }; int i = 0, n = 0; printf("输入字符串: "原创 2021-05-23 12:32:57 · 141 阅读 · 2 评论 -
第76节 实战字符串处理四例
实战一: 字符串有多长#include <stdio.h>int main(){ char str[50] = { 0 }; //初始化 printf("输入字符串: "); gets(str); //输入回车结束 int i = 0; //用于下标和计数 while (str[i] != '\0') { ++i; } printf("字符串长度: %d", i);}运行结果:输入字符串: abc1234567890字符串长度: 13实战二:统计数字字符个数原创 2021-05-23 00:17:55 · 147 阅读 · 0 评论 -
第75节 字符串/字符数组/字符指针
一.字符串和字符串结束标志1.用双撇号括起来的部分就是字符串常量如:“abc”,“Hello!”,“a+b”,“He Lijian”2.字符串常量"abc"在内存中占4个字节,而不是3字节abc\09798990字符’\0’为"字符串结束标志"'\0’的ASCII值为0二.字符数组和字符串1.从存储机制上,字符串是以’/0’为结束标志的字符数组.2.用字符串常量来初始化字符数组.例如char str[]={“I am happy”};char str[原创 2021-05-22 19:21:06 · 210 阅读 · 0 评论 -
第74节 编写查找和排序函数
一.回顾: 有序表中的二分查找#include <stdio.h>#define SIZE 10int main(){ int d[SIZE] = { 1,3,9,12,32,41,45,62,75,77 }; int low, high, mid, key, index = -1; printf("Input a key you want to search: "); scanf_s("%d", &key); low = 0, high = SIZE - 1; wh原创 2021-05-14 23:08:06 · 212 阅读 · 0 评论 -
第73节 实现线性表基本操作的函数
一.数据结构与其基本操作1.四类数据结构: ①集合结构 ②线性结构 ③树型结构 ④图型结构2.基本操作:增加、删除、修改、查找、合并…3.数组是存储线性结构的一种方案二.删除指定位置上的数据#include <stdio.h>#define SIZE 100 //定义常量用大写int deleData(int[], int, int);//参数可省略名字int main(){ int n = 10; //数组中实际有用的元素 int d[SIZE] = { 1,3,9,12原创 2021-05-13 23:35:00 · 376 阅读 · 0 评论 -
第72节 指针作函数参数
一.回顾: 用数组名作函数的参数1.回顾:用数组名作函数的参数,传递的是数组首元素的地址。▲ 函数定义 void sort(int arr[], int n)▲ 函数调用 int score[20]; sort(score, 20);2.拓展:用指针变量作函数参数,传递的是数组首元素的地址。▲ 定义:void select_sort(int *p, int n)▲ 调用:int score[20]; select_sort(score, 20);二.冒泡排序函数的新写法#include &l原创 2021-05-09 12:32:13 · 183 阅读 · 0 评论 -
第71节 数组名作为函数参数
一.用数组元素作函数实参1.有两个数组: int a[8]={26,1007,956,705,574,371,416,517}; int b[8]={994,631,772,201,262,763,1000,781};2.请在数组c中存储a、b中对应数的最大公约数: c[8]={2,1,4,3,2,7,8,11}#include <stdio.h>int gcd(int m, int n){ int r; while (r = m % n) { m = n;原创 2021-05-08 00:28:08 · 482 阅读 · 2 评论 -
第70节 指针的运算
一.为什么要学指针1.用指针,直接操纵内存,这是C语言高效工作的原因2.指针是了解计算机工作的窗口二.指针的“算术”运算1.指针变量加/减一个整数例如:p++,p–,p+i,p-i,p+=i,p-=i等。for(p=a; p<a+5; p+=2)printf("%d", *p);2.两个指针变量相减,结果为两指针之间的元素个数 p2-p1=(a+4)-(a+1)=4-1=3指针相减 = (地址1-地址2) / sizeof(类型)#include <stdio.h>原创 2021-05-07 22:41:46 · 242 阅读 · 0 评论 -
第69节 用指针法访问数组元素
一.你将发现一个内幕!#include <stdio.h> #define n 5int main(){ unsigned int a[n] = { 123,5,9,11,33 }; printf("%x\n", a); printf("%x\n", &a[0]); printf("%d\n", a[0]); printf("%d\n", *a);}运行结果:135fd94135fd94123123结论: 数组名,即数组的地址!数组首元素的地址!原创 2021-05-07 00:30:56 · 645 阅读 · 1 评论 -
第68节 首尝排序—冒泡排序法
一.算法思想方法: 相邻两数比较,若前大后小,则交换(升序排列)二.算法实现n=6个数的排序n个数的排序需要5趟的扫描(0~4)需要n-1趟的扫描(0~n-2)第0趟扫描,从a[0]和a[1]比较开始,至a[4]和a[5]比较为止,最大的数保存在a[5]中第0趟扫描,从a[0]和a[1]比较开始,至a[n-2]和a[n-1]比较为止,最大的数保存在a[n-1]中第1趟扫描,从a[0]和a[1]比较开始,至a[3]和a[4]比较为止,最大的数保存在a[4]中第1趟原创 2021-05-05 23:47:46 · 116 阅读 · 0 评论 -
第67节 经典: 查找的艺术(二分法)
一.数组中的基本操作: 顺序查找元素任务: 输入关键字key,在数组中找出其位置.#include <stdio.h>#define SIZE 10 //定义常量,便于维护;int main(){ int d[SIZE] = { 34,43,98,72,12,47,31,1,78 };//数组全部初始化; int i; //用于循环计数和数组下标的传递; int key; //进行索引查找的数据; int index = -1; //保存数组的下标,赋初值便于判断; prin原创 2021-05-05 11:51:29 · 191 阅读 · 5 评论 -
第66节 数组越界访问的后果
一.数组只可以使用"授权"的空间例: int x,y,a[10]; //定义有10个整型元素的数组a允许访问的数组下标从0开始的10个元素:a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]访问a[10]就为越界!!!C语言允许越界访问,但a[10]存放数据未知,极可能导致结果出错。二.越界的后果以下程序将存放余数的数组设为a[100],确保转换后的进制数不越界;#include <stdio.h>int main(){ in原创 2021-05-04 23:44:13 · 539 阅读 · 2 评论 -
第65节 一维数组的应用
应用1: 利用数组求Fibonacci数列的前20项数列规律: 1,1,2,3,5,8,13,21,…Fn=Fn-1+Fn-2(n≥3);#include <stdio.h>int main(){ int i, f[20] = { 1,1 }; for (i = 2; i < 20; ++i) { f[i] = f[i - 1] + f[i - 2]; } for (i = 0; i < 20; ++i) { if (i % 5 == 0) prin原创 2021-05-04 23:08:32 · 159 阅读 · 0 评论 -
第64节 数组的引入和定义
一.定义一维数组1.定义语法: 类型标识符 数组名[常量表达式]; 例: int a[10];a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]2.数组长度: 下标从0开始到9结束,最后一个元素是a[9]不是a[10].3.动态定义:3.1 定义数组时,在C89中标准中,数组长度可以是常量、符号常量,但不能含变量;3.2 定义数组时,在C99中标准中,数组长度可以是变量,但在实际中不赞成这样用;3.3 注意: 使用数组时,数组下标可原创 2021-05-03 23:07:20 · 414 阅读 · 0 评论 -
第63节 银行储蓄系统再开发
整体框架/声明头文件及自定义函数;/#include <stdio.h>#include <Windows.h>int 函数_验证密码();void 函数_业务驱动();void 函数_显示菜单();double 函数_获得余额();double 函数_取款业务(double);double 函数_存款业务(double);void 函数_改密业务();void 函数_保存数据(double);/主函数内,写好基本框架;/int ma原创 2021-05-03 15:25:49 · 148 阅读 · 0 评论 -
第62节 应用系统设计思路
一.应用程序结构及开发方法1.设计方法: 自顶向下–>逐步细化–>模块化设计–>结构化编码2.常用结构: main–>菜单–>功能1,…功能n–>细化功能模块二.应用程序结构设计思路1.设计原则:高内聚、低耦合 函数高内聚: 代码相关性强,责任单一; 函数低耦合: 各模块间相互联系少(参数少,全局变量少);2.具体技术 提取出独立的功能,与通用的功能 慎用全局变量、静态局部变量 尽量使用值传递,慎用传地址/包含文件#include<原创 2021-05-02 23:17:55 · 388 阅读 · 0 评论 -
第61节 C语言的库函数
一.相关概念函数库(例:数学函数库)函数库是由系统建立的具有一定功能的函数的集合 库中存放函数的名称和对应的目标代码,以及连接过程中所需的重定位信息 用户也可以根据自己的需要建立自己的用户函数库库函数(例:sqrt函数) 存放在函数库中的函数 库函数明确定义了功能、参数和返回值 三种库函数: ①C标准规定的库函数②编译器特定的库函数③用户定义的库函数连接程序 将编译程序生成的目标文件连接在一起生成一个可执行文件。头文件(例:math.h) 在使用某一库函数时,都要在原创 2021-05-02 11:07:19 · 261 阅读 · 0 评论 -
第60节 变量的存储类别
一.程序运行中的内存分配1.程序运行时内存分区: 程序区/静态数据区/动态数据区1.1 程序区: 存放运行中的代码;1.2 静态数据区: 存放全局变量/静态变量;1.3 动态数据区: 存放局部变量.2.四种存储类别2.1.自动的(auto) [ˈɔːtəʊ]2.2 寄存器的(register) [ˈredʒɪstə®]2.3 外部的(extern) [ˈekstɜːn]2.4 静态的(static) [ˈstætɪk]二.自动变量(auto variable) [ˈveəriəbl]原创 2021-05-01 23:04:56 · 201 阅读 · 0 评论 -
第59节 全局变量和局部变量
一.体验局部变量和全局变量#include <stdio.h>void fun1();void fun2();int main(){ int x = 1; x++; printf("%d\n", x); //x=2; fun1(); printf("%d\n", x); //fun1()执行后,内存被释放; fun2(); printf("%d\n", x); //fun2()执行后,内存被释放; return 0;}void fun1(){ i原创 2021-04-30 23:45:51 · 399 阅读 · 2 评论 -
第58节 调试技术: 进入函数内部
一.调试程序#include <stdio.h>float max(float x, float y);int main(){ float a, b, c; a = 1; b = 2; c = max(a, b); printf("The max is %f\n", c); return 0;}float max(float x, float y){ float z; z = (x < y) ? x : y; return z;}二.在vs中调试F原创 2021-04-30 20:30:58 · 2650 阅读 · 1 评论 -
第57节 函数的嵌套调用
一.函数的嵌套调用: 函数内调用函数#include <stdio.h>int gcd(int n1, int n2);int lcm(int n1, int n2);int main(){ int num1, num2; int iGcd, iLcm; //最大公约数和最小公倍数 printf("please input two numbers: "); scanf_s("%d %d", &num1, &num2); iGcd = gcd(num1, nu原创 2021-04-23 22:35:22 · 932 阅读 · 0 评论 -
第56节 函数的声明、定义和调用
一.调用的条件—被调用的函数已存在1.自定义函数先定义,后调用#include <stdio.h>#include <math.h> //标准库函数double max(double x, double y) //函数定义{ double z; z = (x > y ? x : y); return z;}+int main(){ double a, b, c, s; scanf_s("%lf %lf", &a, &b); s =原创 2021-04-23 20:28:21 · 620 阅读 · 0 评论 -
第55节 返回指针的函数
一.返回指针的函数1.返回整型的函数#include <stdio.h>int max(int x, int y){ int t; if (x > y) t = x; else t = y; return t;}int main(){ int a, b, c; scanf_s("%d %d", &a, &b); c = max(a, b); printf("max = %d\n", c); return 0;}2.返回指针的函数原创 2021-04-23 00:41:23 · 173 阅读 · 0 评论 -
第54节 参数传递方式: 传值与传地址
一.函数调用时,实参向形参进行"传值"#include <stdio.h>void fun(int a, int b) //形参{ a *= 10; b += a; printf("%d\t%d\n", a, b);}int main(){ int a = 2, b = 3; fun(a, b); //实参 fun(2,3)一样; printf("%d\t%d\n", a, b); return 0;}运行结果:20 232 3二.原创 2021-04-22 22:00:43 · 229 阅读 · 0 评论 -
第53节 函数的参数
一.无参函数和有参函数1.无参函数:主调函数不必被调用函数提供参数void printstar(){ printf("*****\n");}int main(){ printstar(); ... ...}2.有参函数:由主调函数向被调用函数提供数据int max(int x,int y){ return (x>y)?x:y;}int main( ){ … … m=max(a,b); … …}二.形式参数和实际参数#include <stdio.原创 2021-04-21 23:01:45 · 115 阅读 · 0 评论 -
第52节 函数的返回值
一.无返回值和有返回值的函数 无返回值函数,其返回值为void类型,只完成某些操作. 有返回值的函数,还要计算出一个值.void printstars(int m) //void 代表返回值为空类型;{ for (int j=1; j<=m; ++j) printf("*"); return; //返回语句可省略;}int max(int x,int y) //int 代表返回值类型为整型;{ int z; if(x>y) z=x; else z=y; re原创 2021-04-21 22:23:35 · 514 阅读 · 0 评论 -
第51节 体验自定义函数
一.体验1:输出信息新办法#include <stdio.h>void printfstars();void printfmessage();int main(){ printfstars(); printfmessage(); printfstars();}void printfstars(){ printf("\n*****************\n");}void printfmessage(){ printf("Hello,world!");}运行原创 2021-04-19 22:27:23 · 1560 阅读 · 1 评论 -
第50节 模块化程序设计思维启蒙
一.我们写过这样的程序#include <stdio.h>int main(){ int 代号; do { printf("* 1.吃饭\n"); printf("* 2.睡觉\n"); printf("* 3.打豆豆\n"); printf("* 0.退出\n"); scanf_s("%d", &代号); if (代号 == 1) { printf("我吃吃吃...\n"); } else if (代号 == 2) {原创 2021-04-18 15:13:45 · 224 阅读 · 0 评论 -
第49节 我们要提高什么
一.C语言及程序设计初步原创 2021-04-18 12:45:25 · 86 阅读 · 0 评论 -
第48节 C语言课程总结与展望
一.C语言及程序设计初步1.导学1 人人学点程序设计2 程序设计语言4 C语言程序初体验7 分支结构程序体验2.数据表示及运算 9 变量10 标识符及其命名8 数值数据类型及表示11 算术运算符与算术表达式12 自增与自减13 数值型数据的存储14 指针及其运算17 赋值运算符与赋值表达式18 逗号运算符与逗号表达式19 字符数据及字符类型20 表达"条件"—条件表达式21 将条件"组合"起来—逻辑表达式27 条件运算符和条件表达式3.输入输出 15 数据的输入1原创 2021-04-17 19:04:03 · 686 阅读 · 1 评论 -
第47节 银行储蓄系统开发
/*说明: 本程序在学习者仅掌握了基本数据类型和控制结构的前提下设计,模拟银行储蓄系统的基本功能。 在运行前,请建立文件password.txt,其中存储一个整数,表示密码。 建立文件balance.dat,其中存储一个数,表示余额。 运行结束后,对数据所做的所有修改均可以利用文件保存下来。本程序进一步的改进: 1、银行应该是多用户,而绝不可以是单个的用户 2、应该要记录详细的业务过程 3、增加转帐、挂失等功能 4、密码的加密存储以及密码输入隐藏 5、在程序的结构方面,100多行程序放原创 2021-04-17 18:09:31 · 297 阅读 · 0 评论 -
第46节 小学生算术能力测试系统
一.产生随机数的方法函数功能includetime(0)给出自格林威治时间1970年1月1日凌晨至现在所经过的秒数<time.h>srand(long)初始化随机数发生器< stdlib.h>rand()产生一个0到RAND_MAX(很大的数)的整型随机数并返回<stdlib.h>#include <stdio.h>#include <time.h>#include <stdlib.h原创 2021-04-14 21:57:20 · 531 阅读 · 0 评论 -
第45节 OJ平台中的典型输入处理
一.简单输入#include <stdio.h>int main(){ int a,b; scanf("%d %d",&a, &b); printf("%d\n",a+b); return 0;}二.输入N组数据#include<stdio.h>int main(){ int n,i; int a,b; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d%d",&a,&a原创 2021-04-08 23:06:33 · 169 阅读 · 0 评论