黑马软件工程师——C语言总结之篇
数据类型、运算符
C语言中的数据类型:
运算符:
流程控制
顺序结构:
#include <stdio.h> int main() { //顺序结构演示 int a;//①分配内存空间 printf("输入:");//②打印提示信息 scanf("%d",&a);//③输入一个整数,存到内存中 printf("输出:%d\n",a);//④将内存中的数据进行打印输出 return 0;//⑤退出程序 //以上5步,严格按照先后顺序执行 }
输入:4 输出:4
选择结构:
选择结构用于判断给定的条件,根据判断的结果判断某些条件,根据判断的结果来控制程序的流程。控制语句有如下两种:
if语句:if、if....else....、if.....else if...else
switch...case语句:switch..case
详细请看代码注释。
实例示范:<pre name="code" class="objc"><pre name="code" class="objc">#include <stdio.h> int main() { //顺序结构演示 int a;//①分配内存空间 printf("输入:");//②打印提示信息 scanf("%d",&a);//③输入一个整数,存到内存中 //通过a的值,来判断要进哪个分支执行 if (a>0) { printf("输出:a>0\n"); }else if(a==0){ printf("输出:a=0\n"); }else{ printf("输出:a<0\n"); } return 0; }
<pre name="code" class="objc">输入:1 输出:a>0 输入:0 输出:a=0 输入:-1 输出:a<0
#include <stdio.h> int main() { //顺序结构演示 int a;//①分配内存空间 printf("输入:");//②打印提示信息 scanf("%d",&a);//③输入一个整数,存到内存中 //通过a的值,来判断要进哪个分支执行 switch (a) { case 1://case后面只能跟常量或者常量表达式 printf("输出:a=1\n"); break; case 2://每句case结束要加个break printf("输出:a=2\n"); break; case 3://如果case里面有很多语句,请用大括号“{}”括起来。 printf("输出:a=3\n"); break; default: printf("输出:a!=1且a!=2且a!=3\n"); break; } return 0; }
输入:1 输出:a=1 输入:2 输出:a=2 输入:3 输出:a=3 输入:4 输出:a!=1且a!=2且a!=3
循环结构:
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构 。该结构控制语句如下:
for语句:for(表达式1;条件表达式2;表达式3){.....},表达式2一定是条件表达式,3个表达式中间用分号隔开
do....while语句:do {.....}while(条件表达式);
while语句:while(条件表达式){......}
goto语句:先标记一个跳转的点A:.....,要跳转的位置写上goto A;
实例示范:#include <stdio.h> int main() { //循环结构演示 int a;//分配内存空间 system("clear");//演示前先清屏 //--------------------------------- //演示do..while的使用,验证输入合法性,先输入一次,后判断 do { printf("请输入一个5~8的正整数:"); scanf("%d",&a); system("clear"); if(a<5||a>8) printf("输入错误,"); }while(a<5||a>8); printf("输入的数为:%d\n",a);//验证通过 //--------------------------------- //演示for循环的使用,求1~a的整数和。 int sum = 0; int i = 1; for (i=0; i < a; i++) { sum +=i; } printf("1+2+..+%d = %d\n",a,sum); //--------------------------------- //演示while循环的使用,求a!(a的阶乘) sum = 1; i = 1; while (i<=a) { sum *=i; i++; } printf("1*2*...*%d = %d\n",a,sum); //--------------------------------- //演示goto语句的使用 printf("演示goto语句\n"); goto A; //可以注释这句,看看效果 printf(" * \n"); printf(" * * \n"); printf(" * * \n"); printf(" * * \n"); printf(" * \n"); A: printf("标记goto跳转点,是否跳过图案打印\n"); return 0; }
输入的数为:5 1+2+..+5 = 10 1*2*...*5 = 120 演示goto语句 * * * * * * * * 标记goto跳转点,是否跳过图案打印不注释goto A得到的结果:
输入的数为:6 1+2+..+6 = 15 1*2*...*6 = 720 演示goto语句 标记goto跳转点,是否跳过图案打印输入的数不是5~8得到的结果:(可以继续输入值)
输入错误,请输入一个5~8的正整数:
数组与指针
数组:
所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。
定义:指针:
在计算机科学中,指针是编程语言中的一个对象,用于存储变量单元的地址,将存储变量单元地址的对象形象化的称为“指针”。
int a;//a是一个变量,其在内存中有一个对应的存储单元,而内存中每个存储单元都有对应的地址,所以a所在内存单元中也有对应的地址。
&a//就是查看a所在内存单元的地址
int *p = &a;//将a所在内存单元的地址保存到p中,p就称为指针。因为p存储a在内存单元的地址,所以可以通过p去内存中查找a。
int a[10];// a存储了a[0]的地址,(a=&a[0];)所以a也是一个指针。
实例示范:
#include <stdio.h> int main() { int a[10];//定义一个数组 //利用for循环给这10个数进行赋值 for (int i =0; i <10; i++) { a[i] = i+10; } //打印这10个数看看 for (int i =0; i <10; i++) { printf("a[%d] = %d\n",i,a[i]); } int *p;//定义一个指针 int b = 100;//定义一个变量 p = &b;//获取变量单元地址,并且保存到指针p中 printf("p = %p存储的值为:%d\n",p,*p);//同过p存储的地址,找到b变量单元,取出b变量单元的值 return 0; }
a[0] = 10 a[1] = 11 a[2] = 12 a[3] = 13 a[4] = 14 a[5] = 15 a[6] = 16 a[7] = 17 a[8] = 18 a[9] = 19 p = 0x7fff5fbff7b4存储的值为:100
函数
许多程序设计语言中,可以将一段经常需要使用的代码封装起来,在需要使用时可以直接调用,这就是程序中的函数。
指针函数:
函数指针:
#include <stdio.h> //判断一个数是不是素素,将代码封装成一个函数,等下多次调用 BOOL isSuSu(int n) { if(n<2) return false; else if(n==2||n==3) return true; else { int temp = sqrt(n); for (int i = 2; i <=temp; i++) { if(n%i==0) return false; } return true; } } int main() { //我们查找1~30里面的所有素素,我们遍历每一个数,判断他是不是素素 for (int i = 1; i<=30; i++) { if(isSuSu(i))//每个数都要判断一次,直接调用函数判断就可以,这样写代码可读性高 printf("%3d",i); } return 0; }
2 3 5 7 11 13 17 19 23 29
#include <stdio.h> #include <stdlib.h> int *array(int a,int b)//定义了指针函数,本质是一个函数,返回值为指针 { int temp = b-a; int *number = (int *) malloc(sizeof(int)*(temp));//动态分配内存,创建一个大小为b-a的数组 for (int i = 0; i <temp; i++) { number[i] = b; b++; } return number; } int main() { int *n = array(5, 10);//定义一个指针,接收array函数返回的指针 for (int i = 0 ; i <5; i++) {//打印接受到的值 printf("n[%d] = %d\n",i,n[i]); } return 0; }
n[0] = 10 n[1] = 11 n[2] = 12 n[3] = 13 n[4] = 14
#include <stdio.h> typedef int (*Number) (int,int);//声明一个函数指针,是一个指向函数的指针 int Sum(int a,int b) { return a+b; } int Min(int a,int b) { return a<b?a:b; } int Max(int a,int b) { return a>b?a:b; } int main() { Number p1 = Sum;//定义一个函数指针变量p1,p1指向函数Sum;既然是指针,那么保存的应该是地址 Number p2 = Min;//定义一个函数指针变量p2,p2指向函数Min;保存Min的地址 Number p3 = Max;//定义一个函数指针变量p3,p3指向函数Max;保存Max的地址 int a =10,b=15; printf("通过p1指针调用Sum函数,p1(%d,%d) = %d\n",a,b,p1(a,b)); printf("通过p2指针调用Min函数,p2(%d,%d) = %d\n",a,b,p2(a,b)); printf("通过p3指针调用Max函数,p3(%d,%d) = %d\n",a,b,p3(a,b)); return 0; }
通过p1指针调用Sum函数,p1(10,15) = 25 通过p2指针调用Min函数,p2(10,15) = 10 通过p3指针调用Max函数,p3(10,15) = 15
文件操作
①对于path,默认为相对路径。若需绝对路径,则注意转义字符'\',比如有文件test.txt存放在C盘根目录下,则文件路径参数值应为C:\\test.txt。
②对于mode,主要由r,w,a,+,b,t六个字符组合而成。
r:只读方式,文件必须存在
w:只写方式,若文件存在,则原有内容会被清除;若文件不存在,则会建立文件
a:追加方式打开只写文件,只允许进行写操作,若文件存在,则添加的内容放在文件末尾;若不存在,则建立文件
+:可读可写
b:以二进制方式打开文件
t:以文本方式打开文件(默认方式下以文本方式打开文件)
实例示范:#include <string.h> int main() { FILE *file = fopen("test.txt","r+w");//本文件采用相对路径存储 char *name = "My name is Hua_san"; fwrite(name ,1, strlen(name), file);//将name写入文件,文件不存在,创建文件,文件存在,覆盖原内容 fputs("\nHua_san\nLi_si", file);//在文件末尾增加内容,原来内容保留 char str[100];//定义一个读取出来的缓冲 rewind(file);//将文件内部的位置指针重新指向一个流(数据流/文件)的开头 while (fgets(str, 100, file)!=NULL)//循环读取文件内容,如果读到文件末尾,读取内容为NULL时候,结束。 { printf("%s",str);//打印出来每次读取的内容 } printf("\n");//最后输出一个回车,不干扰源文件数据 fclose(file);//关闭文件指针 return 0;//退出程序 }结果输出:
My name is Hua_san Hua_san Li_si