C语言程序设计-谭浩强
文章目录
- 1 C语言
- 2 算法
- 3 顺序程序设计
- 3.1 数据的表示形式
- 3.2 输入和输出
- 4 选择程序结构
- 5 循环程序结构
- 6 数组
- 7 函数模块化
- 8 指针
- 8.1 动态内存分配
- 9 结构类型
- 9.1 链表
- 9.2 共用体 union
- 9.3 枚举 enum
- 9.4 typedef
- 10 对文件的输入输出
- 10.1 顺序读写
- 10.2 随机读写
1 C语言
1.1 计算机语言发展史
机器语言 ,二进制,计算机发展早期一般计算机指令长度为 16,即以 16 个二进制数组成一条指令
符号语言,用一些字母和数字表示一条指令,计算机通过汇编程序将其转换为机器指令。
高级语言,1950s出现了第一个高级语言 — Fortran。计算机通过编译程序将源程序转为机器指令的目标程序。
1.2 C语言简介
1972年,贝尔在 B 语言的基础上设计了 C 语言。C语言有两个标准,美国国家标准协会ANSI 和 国家标准化组织 ISO。
C 语言是面向过程的编程语言,有下面一些特点:
- 允许直接访问物理地址,进行位操作,能实现汇编语言的大部分功能,可以直接对硬件进行操作
- C 程序的可移植性好,编译系统简洁
- 生成的目标代码质量高,程序执行效率高。广泛运用于编写嵌入式程序
#include <stdio.h> // 编译预处理指令 — 包含头文件
int main(){ // 主函数printf("Hello World!\n");return 0;
}
1.3 运行 C 程序的步骤
1、编辑源程序文件,如 test.c
2、编译源程序。分为预编译和正式编译,对源文件首部的预处理指令,如#include<stdio.h> ,将头文件的内容读进来合并,代替预处理指令。
编译的作用:Ⅰ,语法检查;Ⅱ,生成二进制的目标文件,如 test.obj
一次编译只能生成一个源程序的目标文件
3、链接处理。目标文件不可执行,且一个程序可能包含多个源程序文件,编译后需要将所有的目标文件链接装配起来,得到一个整体的可执行程序。
4、运行可执行程序。
2 算法
程序 = 算法 + 数据结构 程序 = 算法 + 数据结构 程序=算法+数据结构
算法,解决问题的方法和步骤;数据结构,数据及其类型和组织形式
算法的特性:
- 有穷性,不会陷入死循环
- 确定性,没有歧义,每个步骤明确无误
- 输入和输出
- 有效性,没有bug,能够得到确定的结果
算法表示方式:流程图、伪代码,伪代码写算法并无固定严格的语法规则
3 顺序程序设计
例. 华氏温度转为摄氏温度
#include<stdio.h>
int main(){float f, c; scanf("%f", &f);printf("%f", (5.0/9) * (f-32));
}
3.1 数据的表示形式
#define Pi 3.14159 // 符号常量, 预处理时直接代替, 不分配存储单元
const float Pi = 3.14159; // 常变量, 分配存储单元
标识符,只允许字母、数字和下划线,且数字不打头
| 类型 | 字节数 | 范围 | 其他 | |
|---|---|---|---|---|
| char | 1 | -128~127 | %c | |
| short | 2 | -32768~32767 | %hd | − 2 15 ∼ 2 15 − 1 -2^{15}\sim2^{15}-1 −215∼215−1 |
| int | 4 | − 2.15 × 1 0 9 ∼ 2.15 × 1 0 9 -2.15×10^9\sim 2.15×10^9 −2.15×109∼2.15×109 | %d | − 2 31 ∼ 2 31 − 1 -2^{31}\sim2^{31}-1 −231∼231−1 |
| long long | 8 | − 9.2 × 1 0 18 ∼ 9.2 × 1 0 18 -9.2×10^{18}\sim 9.2×10^{18} −9.2×1018∼9.2×1018 | %lld | − 2 63 ∼ 2 63 − 1 -2^{63}\sim2^{63}-1 −263∼263−1 |
| unsigned int | 4 | 0 ∼ 4.3 × 1 0 9 0\sim 4.3×10^9 0∼4.3×109 | %u | 0 ∼ 2 32 − 1 0\sim 2^{32}-1 0∼232−1 |
| float | 4 | 3.4 × 1 0 38 3.4×10^{38} 3.4×1038 | %f | 有效数字 6位 |
| double | 8 | 1.7 × 1 0 308 1.7×10^{308} 1.7×10308 | %lf | 15 |
基本整型 int,一般是 4 个字节,在存储单元中的存储方式是用整数的补码形式存放
负数的补码:其绝对值的二进制,对所有位取反,然后加一
对无符号整型赋值 -1,并不会报错,而是取表示范围内的最大值,以 unsigned short 为例,1 的原码为 0000 0000 0000 0001,则 -1 的补码为 1111 1111 1111 1111(取反加一),表示 2 16 − 1 2^{16}-1 216−1 .
#include<stdio.h>
int main(){float a = 2.0/3; double b = 20.0/3;// float, double 默认都显示6位printf("%f\t%f", a, b); // 0.666667 6.666667printf("%.10f", a); // 0.6666666865 精度丢失printf("%.10lf", b); // 6.6666666667
}
3.2 输入和输出
#include "test.h"
#include "C:/temp/test.h"
- 尖括号表示的头文件,编译器从自己的根目录下去找所要的文件,如各种C库文件;
- 双引号,用于包含用户自己编写的文件,先在当前目录下找,找不到再在编译器目录下找
printf(格式控制, 参数)
-
字符串类型 %s
-
浮点型指定宽度和小数位数
%m.nf,宽度m右对齐,保留n位小数,float的有效位是 6,double的有效位是 15(不是小数位,是全部数字位)。- 左对齐
%-m.nf
- 左对齐
谭浩强《C语言程序设计》 3.5.3 用printf函数输出数据,格式控制这里写的还算不错
char ch = getchar(); // 接收一个字符, 从输入缓冲区
putchar(ch); // 打印一个字符
4 选择程序结构
控制语句
-
if … else
-
switch() case
-
break, return
-
逻辑运算符:与(&&),或(||),非(!)
-
条件运算符:
a>b?(max=a):(max=b);或max = (a>b)?a:b;
switch(grade){ // switch case只支持整型数, 字符串或其他类型不支持
case 'A': printf("85~100\n"); break;
case 'B': printf("70~84\n"); break;
default : printf("other\n"); break;
}
5 循环程序结构
for(;;);while() ;do.. while();
continue, 结束本轮循环,开始下一轮循环;break,退出循环
6 数组
数组是一组有序数据的集合,所有元素属于同一个数据类型
int a[ ] = {1,2,3,4,5,6}; // 自动判断数组长度 6
int a[10] = {1,2,3,4,5,6}; // 系统自动给后4个元素赋值0
int a[10] = {0}; // 全部赋初值 0
二维数组
int a[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; // 自动判断行数int a[3][4] = {{1}, {}, {9,10,11}};
int a[3][4] = {{1}, {5,6}, {9,10,11}}; //其他置0
字符数组
char c[] = "helloworld";
'\0' 代表 ASCII 码值为 0 的字符,并不是可见字符,是字符数组表示的字符串或字符常量的结束标志。
字符串处理函数
gets(char *); // 输入
puts(char *); // 打印
strcat(char [], char []);
char str1[30] = "Hello "; char str2[] = "World";
strcat(str1, str2); // 合并后的结果存入str1, 因此str1需要足够大
printf("%s", str1); // Hello World
strcpy(char[], const char *);
char str1[10], str2[]="hello";
strcpy(str1, str2); // strcpy(str1, "hello");
strncpy(str1, str2, 3); // str2的前3个字符拷贝到str1, 不影响str1其他元素
strcmp()
strlen()
strlwr()
strupr()
7 函数模块化
C程序的执行是从main函数开始的,期间可能调用其他函数,最终回到main函数,结束程序运行
主要分为系统提供的库函数和用户自定义函数
函数调用之前需要先声明或者定义,函数的首行称为函数原型(function prototype)
7.1 函数递归 — 汉诺塔问题
void hanoi(char a, char b, char c, int n){if(n==1)cout<<a<<"->"<<c<<endl;else{hanoi(a, c, b, n-1);cout<<a<<"->"<<c<<endl;hanoi(b, a, c, n-1);}
}
int main(){int n; cin>>n; // 移动 n 个盘子需要经历 2^n-1 步hanoi('A', 'B', 'C', n);
}
7.2 数组作为函数参数
float average(float array[]);
float average(float array[][4]); // 列数不可省(第二维)
数组名为函数实参时,是将实参数组的首元素的地址传给形参数组。改变形参数组会导致实参数组元素的值同时发生变化。
- 静态存储区:全局变量,静态变量 (static)
- 动态存储区:局部变量,函数形参,函数调用时的返回地址。
一般情况下,变量存储在内存中,使用时控制器会发出指令读取,再由运算器计算;对于使用频繁的变量,C提供 register关键字声明,直接将其存放到CPU中的寄存器,省去了从内存读取的过程。现在,编译器性能好,register基本弃用deprecated
extern
8 指针
指针就是地址
int a[] = {1,3,5,7,9};
int *p = a; // &a[0] 指向数组首元素
cout<< *p << " " << *(p+1) << " " << *(a+2);
指针运算
-
p+1 并不是将p值简单加 1,而是加上一个数组元素的字节数,这里是int 4字节,故指向数组下一个元素,即
a[1] -
指针减法
p2-p1= 两个元素的下标相减,而不是地址相减 -
两个地址不能想加
二维数组的指针
int a[][4] = { // 3 × 4{0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11}
};
int (*p)[4] = a;
for(int i=0; i<3; i++){for(int j=0; j<4; j++)cout<< *(*(p+i) + j)<<'\t';cout<<endl;
}
指针数组(元素为指针类型的数组)
int* p[4]; // 该数组存放 4 个指针变量
指向指针的指针
char* name[] = { "Alice", "Bob", "Carle", "Daniel" };
char **p = name;
cout<< *(p+1);
8.1 动态内存分配
函数执行成功,返回新内存首地址;内存分配失败会返回一个空指针(NULL)
void *malloc(unsigned size); // 开辟 size 个字节的连续空间
void *calloc(unsigned n, unsigned size); // 开辟 n 个长size的连续空间
void *realloc(void *p, unsigned size); // 给指针p指向的空间重新分配void free(void *p);
9 结构类型
struct Student{char name[10];char sex;int age;
};struct Student stu1; stu1.name = "Tom";struct Student stu2 = {"Kitty", 'w', 18};
9.1 链表
头指针head,指向第一个元素结点的地址
struct ListNode{int data;struct ListNode * next;
};
struct ListNode* create(){ // 尾插int n; cin>>n;ListNode* p, *rear, *head;p = new ListNode; cin>>p->data; // 头结点head = p; rear = p; // 首尾指针均指向头结点 while(n-- -1){p = new ListNode;cin>> p->data; rear->next = p;rear = p;}rear->next = NULL;return head;
}
void print(ListNode* head){ListNode * p = head;while(p!=NULL){cout<< p-> data<<'\t';p = p->next;}
}
9.2 共用体 union
同一段内存单元,存放不同类型的变量,但一个时刻只有其中一个变量有效。
union Data{int i; char j; float k;
};
9.3 枚举 enum
每个枚举元素代表一个整数常量,默认 0,1,2,…
enum Weekday{sun, mon, tue, wed, thu, fri, sat
};
9.4 typedef
typedef long long ll;
10 对文件的输入输出
// 文件类型 FILE
FILE * fp;
fp = fopen("test.txt", "r");
if(fp == NULL) cout<<"cannot open this file\n";
fclose(fp);
| mode | 文件打开模式 | 文件不存在 |
|---|---|---|
| r(默认) | 只读方式打开,文件指针指向文件头 | ❌ |
| r+ | 读写模式,文件指针指向文件头 | ❌ |
| w | 写入模式。文件指针指向文件头,原有内容清空。 | 创建 |
| a | 打开文件以写入,如果文件存在则在末尾追加 | ❌ |
| b | 二进制模式 | ❌ |
10.1 顺序读写
1、fputc
FILE *in = fopen("src.dat", "r");
FILE *out= fopen("dest.dat", "w");char ch = fgetc(in);
while(!feof(in)){ // 文件复制 in to outfputc(ch, out);putchar(ch);ch = fgetc(in);
}
fclose(in); fclose(out);
2、fputs
char str[3][10];
for(int i=0; i<3; i++) cin>>str[i];
FILE * fp = fopen("test.txt", "w");
for(int i=0; i<3; i++) {fputs(str[i], fp);fputs("\n", fp);}
3、fprintf / fscanf 效果相同,都是写入文件
char s[] = "world";
FILE * fp = fopen("test.txt", "w");
fscanf(fp, "%d, %d", &i, &j);
fprintf(fp, "hello %s", s);
这种方法不适合频繁读写 ,ASCII <—> 二进制,下面介绍二进制读写 fread 和 fwrite
4、fread 和 fwrite
10.2 随机读写
rewind(),reseek()
相关文章:
C语言程序设计-谭浩强
文章目录 1 C语言2 算法3 顺序程序设计3.1 数据的表示形式3.2 输入和输出 4 选择程序结构5 循环程序结构6 数组7 函数模块化8 指针8.1 动态内存分配 9 结构类型9.1 链表9.2 共用体 union9.3 枚举 enum9.4 typedef 10 对文件的输入输出10.1 顺序读写10.2 随机读写 1 C语言 1.1 …...
将OpenCV与gdb驱动的IDE结合使用
返回:OpenCV系列文章目录(持续更新中......) 上一篇:OpenCV4.9.0开源计算机视觉库在 Linux 中安装 下一篇:将OpenCV与gcc和CMake结合使用 能力 这个漂亮的打印机可以显示元素类型、、标志is_continuous和is_subm…...
Java毕业设计-基于springboot开发的Java时间管理系统-毕业论文+答辩PPT(附源代码+演示视频)
文章目录 前言一、毕设成果演示(源代码在文末)二、毕设摘要展示1、开发说明2、需求分析3、系统功能结构 三、系统实现展示1、管理员功能模块2、用户功能模块 四、毕设内容和源代码获取总结 Java毕业设计-基于springboot开发的Java时间管理系统-毕业论文答…...
AI原生安全 亚信安全首个“人工智能安全实用手册”开放阅览
不断涌现的AI技术新应用和大模型技术革新,让我们感叹从没有像今天这样,离人工智能的未来如此之近。 追逐AI原生?企业组织基于并利用大模型技术探索和开发AI应用的无限可能,迎接生产与业务模式的全面的革新。 我们更应关心AI安全原…...
Vue3 大量赋值导致reactive响应丢失问题
问题阐述 如上图所示,我定义了响应式对象arrreactive({data:[]}),尝试将indexedDB两千条数据一口气赋值给arr.data。但事与愿违,页面上的{{}}在展示先前数组的三秒后变为空。 问题探究 vue3的响应应该与console.log有异曲同工之妙࿰…...
1236 - 二分查找
代码 #include<bits/stdc.h> using namespace std; int a[1100000]; int main() {int n,x,l,r,p,mid,i;cin>>n;for(i1;i<n;i)cin>>a[i];cin>>x;l1;rn;p-1;while(l<r){mid(rl)/2;if(a[mid]x){pmid;break;}else if(x<a[mid]) rmid-1;else if(x…...
CPP容器vector和list,priority_queue定义比较器
#include <iostream> #include <bits/stdc.h> using namespace std; struct VecCmp{bool operator()(int& a,int& b){return a>b;/*** 对于vector和list容器,这里写了>就是从大到小* 对于priority_queue容器,这里写…...
How to install PyAlink on Ubuntu 22.04
How to install PyAlink on Ubuntu 22.04 环境准备准备conda python环境创建项目虚拟环境激活虚拟环境 安装脚本细节 环境准备 准备conda python环境 关于如何安装conda环境,可以参阅我此前整理的如下文章: How to install Miniconda on ubuntu 22.04…...
Java部署运维
1.docker Docker(一):安装、命令、应用Docker(二):数据卷、Dockefile、Docker-composeDocker(三) 通过gitlab部署CICD Docker超详细教程——入门篇实战 Docker教程 2.nginx 3.keepalived 4.k8s 5.jekenis...
0-Flume(1.11.0版本)在Linux(Centos7.9版本)的安装(含Flume的安装包)
环境检查 #首先确认自己的Linux是Centos版本,运行命令 cat /etc/centos-release结果:CentOS Linux release 7.9.2009 (Core) 安装 Flume本身是由Java开发的,所以需要服务器上安装好JDK1.8(注意区分Linux还是Windows系统的JDk&a…...
cad vba 打开excel并弹窗打开指定文件
CAD vba 代码实现打开excel,并通过对话框选择xls文件,并打开此文件进行下一步操作。代码如下: excel.activeworkbook.sheets(1) excel对象下activeworkbook,再往下是sheets对象,(1)为第一个表, thisworkbook是vba代码所在的工作簿。 Opti…...
应急救援装备无人机是否必要?无人机在应急救援中的具体应用案例有哪些?
无人机(Drone)是一种能够飞行并自主控制或远程操控的无人驾驶飞行器。它们通常由航空器、控制系统、通讯链路和电源系统组成,并可以根据任务需求搭载不同类型的传感器、摄像头、货物投放装置等设备。 无人机的种类繁多,从大小、形…...
模态框被div class=modal-backdrop fade in覆盖的问题
模态框被<div class"modal-backdrop fade in">覆盖的问题 起因:在导入模态框时页面被一层灰色的标签覆盖住 F12查看后发现是一个<div class"modal-backdrop fade in"> 一开始以为是z-index的问题,但经过挨个修改后感觉…...
关于msvcp140.dll丢失的解决方法详情介绍,修复dll文件的安全注意事项
在使用电脑的过程中,是否有遇到过关于msvcp140.dll丢失的问题,遇到这样的问题你是怎么解决的,都有哪些msvcp140.dll丢失的解决方法是能够完美解决msvcp140.dll丢失问题的,今天小编将带大家去了解msvcp140.dll文件以及分析完美解决…...
AJAX-Promise
定义 Promise对象用于表示(管理)一个异步操作的最终完成(或失败)及其结果值。 好处:1)成功和失败状态,可以关联对应处理程序 2)了解axios函数内部运作机制 3)能解决回调函数地狱问题 语法&…...
[Spark SQL]Spark SQL读取Kudu,写入Hive
SparkUnit Function:用于获取Spark Session package com.example.unitlimport org.apache.spark.sql.SparkSessionobject SparkUnit {def getLocal(appName: String): SparkSession {SparkSession.builder().appName(appName).master("local[*]").getO…...
python统计分析——t分布、卡方分布、F分布
参考资料:python统计分析【托马斯】 一些常见的连续型分布和正态分布分布关系紧密。 t分布:正态分布的总体中,样本均值的分布。通常用于小样本数且真实的均值/标准差不知道的情况。 卡方分布:用于描述正态分布数据的变异程度。 F分…...
onlyoffice创建excel文档
前提 安装好onlyoffice然后尝试api开发入门 编写代码 <html> <head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width, user-scalableno, initial-scale1.0, maximum-scale1.0, minimum-scale1.0"&…...
交通事故档案管理系统|基于JSP技术+ Mysql+Java+Tomcat的交通事故档案管理系统设计与实现(可运行源码+数据库+设计文档)
推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 2024年56套包含java,ssm,springboot的平台设计与实现项目系统开发资源(可…...
Chrome 114 带着侧边栏扩展来了
效果展示 manifest.json {"manifest_version": 3,"name": "ChatGPT学习","version": "0.0.2","description": "ChatGPT,GPT-4,Claude3,Midjourney,Stable Diffusion,AI,人工智能,AI","icons"…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...
rknn toolkit2搭建和推理
安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...
