注解:本文章按照c语言(谭浩强版)课本,梳理。仅仅应对考试知识框架梳理,不能提供深入学习使用
程序设计和c语言:
1.1970年代 c语言 由贝尔开发的高效可移植的编程语言
2.1980年代 由一些国家对c语言对不同编译器进行国标准化
3.1990年代 c语言进一步升级,增加面向对象的特性
4.至今,进一步优化
主要知识点:
5.一个c语言程序是由一个或多个源程序文件组成
预指令:预处理指令对源代码进行处理,并不是真正的c语句
全局声明:在函数外声明函数或变量;使函数可以在其他地方使用
函数定义:实现某些重复的方法,提高复用性.
6.函数是c程序的主要组成部分,程序从main函数开始执行
7. 函数包括两部分:函数头部 和 函数体
8.程序要求计算机的操作由c语句实现
9.数据声明和语句结束后面需要添加分号
程序化程序设计方法的思想:
1.模块化:程序分成多个函数,每个函数程序不同功能,便于维护,结构清晰
2.自上而下:从整体到局部,设计整体结构程序,再逐一细化功能。
3.循序,选择和循环程序
4.数据抽象和封装:数据封装在函数体内,只暴露接口给外面调用;
5.模块间的通信:通过传递参数和返回值,进项交换。
数据类型和数据的输入输出
算法+数据结构=程序
算法特点:
1.有穷性 操作有限 2.确定性:每一步都是正确的 3.有0或多个输入
4.有一个或多个输出 5.有效性:每一步都可以执行,并且得到确定结果
常量:值不能改变的量
1.整型常量 eg.1000 ,0
2.实型常量(实数,浮点数) eg. 12.5
3.字符常量 eg:‘5’,‘e’,‘?’
4.字符串常量: “hello”
5.符号常量:用#define指令 ,指定一个符号 ,指定一个常量
#define PI 3.1415
ASCII表常用: A-65 a-97 0-48
转义字符:\n 换行 \t 缩进 \\ 一个 \0 空字符
变量:值可以改变的量;使用前需要声明数据类型和名称
常变量:定义的变量前面加 const
表识符:表示程序实体(变量,函数等)的名字
规则:
1.可以大小写,下划线
2.不能数字开头
3.区分大小写
4.不能关键字
关键字:有特定含义的保留字
数据类型:
整型数据:
int 4字节
short int 2字节
long int 4字节
long long int 8字节
不带符号:
unsigned
字符数据:
char 1字节
字符有时可以表示整型
浮点型数据:
float 4字节
double 8字节
数据类型的转换:
- 图中横向箭头表示必定的转换,如 char 型、short 型数据必定先转换为 int 型,float 型数据在运算时将先转换成 double 型,以提高运算精度(即使是两个 float 型数据相加,也要转换成 double 型,然后再相加)
- 图中纵向箭头表示当经过横向的转换后,进行运算的数据类型仍然不同时的转换方式。在不同数据类型的转换过程中,类型转换顺序并不是按箭头方向一步一步的转换,可以没有中间类型转换。例,in t型与 double 型数据进行运算,先将 int 型的数据直接转换成 double 型,然后再进行两个同类型(double型)数据的运算
- 转换只会影响表达式的运算结果类型,并不改变原变量的定义类型,并且其数据值也不会发生任何改变 (声明左值类型需要与右值类型保持一致)
- 当赋值运算符两边的运算对象类型不同时,也要发生类型转换,转换的规则是:把赋值运算符右边表达式的类型转换为左边变量的类型(如果声明左边数据类型比右边表达式数据类型还要大)
- 原文链接:https://blog.csdn.net/m0_74102736/article/details/129890527
强制数据类型转化:(数据类型)表达式
数据的输入输出:
printf格式化输出数据
1.格式字符:d,i表示有符合的十进制整数
2.u格式符:用于输出无符号的十进制整数
3.f格式符:用于输出浮点数
- %m.nf:m表示数据占几位,n表示输出几位小数,四舍五入,-表示左对齐,+表示右对齐。
4.c格式符:输出字符
5.s格式符:输出字符串0000000000000000000000000000000000000000000000000000
6.p格式符:输出指针地址
scanf格式化输入数据:
注意输入规范:
如果一个scanf输入多个数据:
分隔方式:1.输入时,给定特定的东西,结束前一个读取
2.输入时,使用空格,enter,tab结束前一个读取
一个%结束:1.读取空格,tab,enter
2.读取指定长度
#include<stdio.h>
int main() {
int a,b,c,d,e,f,g,h;
scanf("%d,%d",&a,&b); //输入时用逗号(,)分隔
scanf("%d %d".&a,&b);
scanf("%d%d",&c,&d); //输入时用空格分隔
scanf("%d%d",&e,&f); //输入时用回车分隔
scanf("%d%d",&g,&h); //输入时用tab键分隔
printf("a=%d,b=%d\n",a,b);
printf("a=%d,b=%d\n",c,d);
printf("a=%d,b=%d\n",e,f);
printf("a=%d,b=%d\n",g,h);
return 0;
}
字符输入输出函数:
putchar 输出一个字符
eg.putchar(65) putchar(a) getchar 输入一个字符 eg. char a;
a=getchar();
数组:
数组定义:长度必须为常量
数组初始化
数组访问
一维数组
二维数组
字符数组:
字符数组定义:
字符数组初始化:
字符数组访问:
char str1[]="hello";
//访问单个字符
char firstchar=str1[0];
//修改单个字符
str[0]='h';
printf("%s",str);
//遍历字符
int len=sizeof(str)/sizeof(str[0]);
for(int n=0;n<len-1;n++){
printf("%c",str[i]);
}
字符数组结束标志:
c语言以 '\0' 结束。
字符数组输入输出:
用%c %s
//逐个输入
char str[20];
int i;
printf("请输入字符串");
for(i=0;i<20;i++){
scanf("%c",str+i);
if(str[i]=='\n'){
str[i]='\0';//将换行字符换成空字符
break;
}
}
//整个输入
char str1[20];
printf("请输入字符串");
scanf("%s",str1);
//整个输出
printf("%s",str);
//逐个输出
for(i=0;str[i]!='\0';i++){
printf("%c",str[i]);
}
处理字符数组的函数
puts函数------输出字符串函数:将字符串以\0结束的输出
gets函数------输入字符串函数:从终端输入一个字符串到字符数组,并得到一个返回值,错误为null;成功为字符串
char str[]="hello \n China";
puts(str);
char str[100];
gets(str);
strcat(字符数组1,字符数组2);// 把字符串2连接到字符串1的后面 strcpy,strncpy函数----字符串复制
strcpy(字符串1,字符串2)
strncpy(字符串1,字符串2,复制的字符数)结尾没有\0
char destination[20]='hello';
char source[]="world";
strcat(destination,source);
char str1[10],str2[]="china";
strcpy(str1,str2);
strcmp(字符串1,字符串2) 比较字符串;相同则返回0
strlen函数:测字符串长度的函数 不包括("\0")
函数:
C语⾔要求,在程序中⽤到的所有函数,必须“先定义,后使⽤”
值传递:实参和形参间的数据传递 再调⽤函数过程中,系统会把实参的值传递给被调⽤函数的形参。 或者说,形参从实参得到⼀个值。该值再函数调⽤期间有效,可以参加该函数中的运算
地址传递:地址作为参数
static变量:静态变量,使变量作用到整个程序结束;即函数内改变会持续到别的函数内
指针:
指针赋值:
int a = 5;
int *p = &a;
指针作为函数参数传递地址
#include <stdio.h>
// 函数原型,参数为指针变量
void changeValue(int *ptr);
int main() {
int a = 5;
printf("函数调⽤前的值:%d\n", a);
// 调⽤函数,传⼊指针变量a的地址
changeValue(&a);
printf("函数调⽤后的值:%d\n", a);
return 0;
}
// 函数定义,通过指针修改变量的值
void changeValue(int *ptr) {
// 解引⽤指针,修改变量的值
*ptr = 10;
}-----
指针引用数组:区别 指针可以改变指向来改变地址,数组名不能改变。
用法:指针可以通过++和--来指向数组的位置
指针引用字符数组
结构体:
关键词:struct
struct 结构体名
{
成员列表;
};
struct Student
{
char name[50];
int age;
float gpa;
};
结构体调用和修改:
#include <stdio.h>
struct Student {
char name[50];
int age;
float gpa;
};
int main() {
struct Student student1;
// 设置学⽣的信息
strcpy(student1.name, "Tom");
student1.age = 20;
student1.gpa = 3.5;
// 打印学⽣的信息
printf("姓名:%s\n", student1.name);
printf("年龄:%d\n", student1.age);
printf("平均成绩:%f\n", student1.gpa);
return 0;
}
结构体数组:
struct 结构体名
{
成员列表
} 数组名 [数组⻓度];
struct Point {
int x;
int y;
} points[3];
结构体指针:
typedef struct {
int x;
int y;
} Point;
Point p1;
Point *ptr = &p1;
ptr->x = 3;
ptr->y = 5;
指针调用:箭头 或 (*指针名)
文件操作:
文件:在C语⾔中,⽂件是⼀种⽤于存储和读取数据的抽象概念。
文件表示组成:1、⽂件路径 2、⽂件名主⼲ 3、⽂件后缀
D:\CC\temp\file.dat ⽂件路径:D:\CC\temp ⽂件名主⼲:file ⽂件后缀:.dat
文件缓冲区:
从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才⼀起送到 磁盘去。 如果从磁盘向计算机读⼊数据,则⼀次从磁盘⽂件将⼀批数据输⼊到内存缓冲区中(充满缓冲区) 然后再从缓冲区逐个地将数据送到程序数据区(给程序变量
文件指针类型:
以指向⼀个已经打开的⽂件,通过该指针可以对⽂件进⾏读取、写⼊、移动指针位置
声明: File *fp;
使用:fp=fopen("文件名","使用方式")
fopen函数打开文件
fclose函数关闭文件:
1.释放资源 2.保存文件 3.刷新缓冲区
#include <stdio.h>
int main() {
FILE *fp;
// 使⽤ "r" 模式打开⽂件,以只读⽅式打开
fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("⽆法打开⽂件 example.txt\n");
return 1;
}
// ⽂件操作...
// 关闭⽂件
fclose(fp);
// 使⽤ "w" 模式打开⽂件,以写⼊⽅式打开
fp = fopen("output.txt", "w");
if (fp == NULL) {
printf("⽆法打开⽂件 output.txt\n");
return 1;
}
// ⽂件操作...
// 关闭⽂件
fclose(fp);
// 使⽤ "a" 模式打开⽂件,以追加⽅式打开
fp = fopen("log.txt", "a");
if (fp == NULL) {
printf("⽆法打开⽂件 log.txt\n");
return 1;
}
// ⽂件操作...
// 关闭⽂件
fclose(fp);
return 0;
}
文件字符读写:
1.fgetc函数
调用:fgetc(fp)从fp指向的文件读入一个字符
返回值:成功,返回读取字符,失败EOF 即 -1
2.fputc函数
调用:fputc(ch,fp)把字符ch写到fp所指向的文件夹种
返回值:成功,返回输出字符,失败返回EOF 即-1
文件字符串读写:
1.fgets函数
调用:fgets(str,n,fp)从fp指向的文件读入一个长度为n-1的字符串存放道字符数组str种
返回值:读成功,返回地址str,失败返回null
2.fputs函数
调用:fputs(str,fp)把str的字符串写道fp指向的文件中
返回值:成功,返回0;失败返回非0值
#include <stdio.h>
#include <stdlib.h>
// 函数:写⼊⽂件
void writeFile(const char* filename, const char* content) {
FILE* file = fopen(filename, "w");
if (file == NULL) {
printf("⽆法打开⽂件\n");
return;
}
fputs(content, file);
fclose(file);
}
// 函数:读取⽂件
void readFile(const char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
printf("⽆法打开⽂件\n");
return;
}
char buffer[100];
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
fclose(file);
}
int main() {
const char* filename = "example.txt";
const char* content = "你好,世界!";
writeFile(filename, content);
printf("成功写⼊⽂件\n");
printf("读取到的⽂件内容:\n");
readFile(filename);
return 0;
}