当用两个浮点型做除法时,因为浮点型无法精确表示,所以判断整数除以0时,用fabs(x)<=1e-6这种形式判断。
遇见’输入\
遇见\0认为是’\0’因此字符串结束
关于break
break只能跳出它所在的那层循环。多层嵌套循环的话,跳不出外层循环!
1.关于double型变量输入输出
CodeBlocks中,double型输入用 lf ,输出用 f 。float型输入用 f ,输出用 f 。
double score[10]={0};
for(int i=0;i<N;i++){
scanf("%lf",&score[i]);
printf("%f\n",score[i]);
}
2.指针
(1)易混淆知识:
int a=0;
int *pa=&a;//pa存放a的地址,*pa是指pa指向的数据,
//同时pa指向的数据是int类型的,a是pa的别名。
//指针必须初始化。
//想让指针变量指向哪个存储单元,就让其保存哪个单元的地址
//指针可以保存一个变量的地址、数组的首地址、字符串的首地址、函数的入口地址。
*pa=1;//将1写入pa所指的内存单元,即令a=1;
printf("pa=%p\n",pa);//输出a的地址
printf("*p=%d\n",*pa);//输出1
int *pb=NULL;//pb指向NULL
int *pc,*pd;//同时定义两个指针变量,不能写成int *pc, pd;//表示pc是指针型,pd是int型。
(2)错误案例:
(3)众所周知,函数只能有一个返回值,那么当想返回两个变量的值时,该怎么办呢?
比如一个例子,计算学生成绩最大值并返回学生最大成绩的数组下标。
解决方案:返回一个,用指针传一个。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#define N 5
int GetMax(int a[],int n,int *maxPos);
int main(){
int maxPos=0;
int a[N]={1,2,3,4,5};
printf("maxPos=%d,maxValue=%d\n",maxPos,GetMax(a,N,&maxPos));
return 0;
}
//用此函数实现既返回maxValue又用指针传回maxPos
int GetMax(int a[],int n,int *maxPos){
int maxValue=a[0];
int i;
for (i=0; i<n; i++)
{
if (a[i] > maxValue)
{
maxValue = a[i];
*maxPos = i;
}
}
return maxValue;
}
/*
5
1 2 3 4 5
*/
(4)函数指针的定义及用途
定义:
#include <stdio.h>
#include <stdlib.h>
int Fun(int a,int b);
int main()
{
int (*f)(int,int);//定义函数指针f
f=Fun;//将Fun函数赋值给f
int test=f(1,3);
printf("test=%d",test);
return 0;
}
int Fun(int a,int b){
return a+b;
}
用途:编写通用性更强的函数。
(5)数组指针:先学3.字符串后再学它
一维数组:
则下面两个均能表示a[i]
二维数组:
*(a+i)是第 i 行第0列的地址。
*(a+i)+j 是第 i 行第 j 列的地址。
定义及初始化:
定义二维数组指针后(p能表示的和a相同,将a替换为p即可)
二维数组指针定义及初始化有两种形式:
①
②
11.3讨论区习题:计算每个学生课程总分和平均分 没做。
3.字符串
C语言没有字符串类型。用字符数组存放字符串。
(1)字符数组初始化:
(2)字符串的输入,三种形式:
char str[N+1];//加的1是字符串结束标志'\0'
char str2[N+1];
char str3[N+1];
printf("请输入第一个字符串:");
scanf("%s",str);//不能输入带空格的字符串
printf("字符串一为:");
for(int i=0;str[i]!='\0';i++){
putchar(str[i]);
}
printf("\n");
printf("请输入第二个字符串:");
scanf("%s",str2);//不能输入带空格的字符串,因为输入空格,scanf认为输入结束了
printf("字符串二为:");
printf("%s",str2);
printf("\n");
fflush(stdin);//必须加上,因为scanf读不走回车符,gets()能读走回车符。
//前面输入字符结束的回车会被gets()读走,从而输出空白
printf("请输入第三个字符串:");
gets(str3);//可以输入带空格的字符串
printf("字符串三为:");
puts(str3);
char ch=getchar();//读一个字符。
(3)字符串处理函数
strlen(str1):输出str1的实际长度,不算’\0’。
strbcpy(str2,str1,n):复制str1的前n个字符到str2。
strcmpy(str1,str2):当str1=str2:返回0
当前<后:返回负数
当前>后:返回正数
strncmp(str1,str2,n):只比较str1和str2的前n个字符。
缓冲区溢出防范
用fgets(),不用get()和scanf()。
因为fgets()会限制输入长度,不会覆盖到其他数据上。
fgets()缺点是不会把回车符(也叫换行符)转为’\0’。而gets()会。
因此比较password时候需要把输入的字符串结尾的’\n’替换成’\0’。
结构体
直接赋值不行,用结构体可以。
枚举enum类型
公用体Union
例如
union test{
int a[2];
int b;
int c;
}
则union长度为8,为a[2]的总长,处在0-7地址。b长度4,处在0-3。c长度4,处在0-3。
模拟洗牌
动态内存分配