C语言
一个main函数前面没有类型的声明,它的默认类型是int类型
一个程序可以由多个c文件构成,但只能有一个main()函数
多行注释也叫块注释 /* */
<string.h>它是一个字符串处理
<math.h>是一个数学函数,这个头文件里面包含了一些的关于数学函数的函数
# include<stdio.h>
#开头的是预处理指令,不是c语句的一部分
int main(){
// 单行注释
printf("hello c语言");
return 0;
}
#include <math.h> // 导入<math.h>
//不导入math,sqrt()就会报错
#include<stdio.h>
//不导入stdio.h,printf就不能用
int main(){
int num=9;
printf("%.2f",sqrt(num));
// .2 就是小数点后2位
return 0;
} //3.00
C语言本身并不提供输入和输出语句,输入和输出的操作是由函数来实现的
printf()函数和scanf()函数并不是C语言的关键字,只是函数的名字,不能误以为它们是C语言提供的"输入,输出语句"
----------------------------------------------------------第二节-----------------------------------------------------------------------------------------
字节是计算机的一种计量单位,通常情况下一字节等于八位,一个字节可以存放一个英文字母,一个汉字占两个字节
变量和常量的区别:变量是可读可写的,而常量是只读的,常量定义有两种,一种是宏定义的,称之为符号常量,符号常量操作系统不会给它开辟空间,因此常量不可以自增,另一种是常变量,如:const int a=123;
#include<stdio.h>
int main(){
3.14e3 = 3.14*10^3 //3.14 乘以10的三次方 这里的e不区分大小写
//e前边必须有数 e后边只能是整数
}
字符常量:一种是字符常量 ,字符常量只能是单引号,单引号内必须只有单个字符 ,字符常量可以对照ASCII
码对应 0的ASCII值为48 ,1为49 ,a为97,A为65 大小写字母的值相差32
#include<stdio.h>
int main(){
char c='a';
printf("%c",c); //a
printf("%d",c); //97
}
#include<stdio.h>
int main(){
char c='\'';
printf("%c",c); // 输出的为 ’ 单引号
}
#include<stdio.h>
int main(){
char c='\\';
printf("%c",c); // 输出的为 \ 反斜杠
}
#include<stdio.h>
int main(){
printf("%s","asd \t sads"); // 制表符
}
符号常量:也就是宏定义,仅仅是临时用用,不占内存
#include<stdio.h>
#define PI 3.14
int main(){
// printf("%f",PI); //3.140000
printf("%5.3f",PI); //3.140 小数点占用一个字节
}
#include<stdio.h>
#define f(x) x+x
int main(){
int x=2;
printf("%d",f(x)); //4
}
标识符:由字母,数字,下划线构成,而且起名字的时候不能是C语言保留的关键字,必须有字母或者下划线开头,不能以数字开头
驼峰命名法:除第一个单词之外,其他单词首字母大写 例如: int myStudentCount;
#include<stdio.h>
#define A "100"
int main(){
printf("%s",A); // 输出的为字符串100
}
#include<stdio.h>
#include<stdlib.h>
int main(){
int n=9;
int r=n>>2;
char string[100];
itoa(r,string,2); //方法函数
printf("%d右移2位\t二进制数=%08s\n",n,string);
return 0;
}
------------------------------------------------------剩余数据类型---------------------------------------------
long char float double 类型
long: 默认分配为4个字节
char: 不仅仅可以存放单个字符,而且还可以存放 -128~+127 和 0~255(有符号)之间的值
#include<stdio.h>
int main(){
char c='a';
printf("%c",a); // 输出字符a
}
#include<stdio.h>
int main(){
char c='word';
printf("%c",c); // 输出d
}
#include<stdio.h>
int main(){
char c='a';
printf("%c,%c",c,c); // 输出字符a,a
}
#include<stdio.h>
int main(){
char c='a';
printf("%c,",c,c); // 输出字符a,
}
-------------
#include<stdio.h>
int main(){
char c1='a';
char c2='b';
printf("%c,",c1,c2); // 输出字符a,
}
#include<stdio.h>
int main(){
char c1=128;
printf("c1=%d\n",c1); //-128
char c2=129;
printf("c2=%d\n",c2); // -127
char c3=1000;
printf("c3=%d\n",c3); //-24
return 0;
}
输出ASCII表的值:
#include<stdio.h>
int main(){
char c1='a';
char c2='b';
printf("%d,%d",c1,c2); // 输出97,98
}
signed 和 unsinged 修饰符 (有符号和无符号)
只有整型(包括字符型)数据可以加 signed 或 unsigned修饰符,实型数据(就是浮点类型)不能加
#include<stdio.h>
int main(){
//定义一个无符号的整型变量
unsigned int a=100;
int b=200;
signed int c=300;
printf("a=%d,b=%d,c=%d",a,b,c); //a=100 b=200 c=300
return 0;
}
#include<stdio.h>
int main(){
char c=-10;
printf("%d\n",c); // -10
printf("%u",c); //4294967286
return 0;
}
char 默认值是无符号的,如果 %u 输出为负数,结果异常
--------------------------浮点类型 float double 类型--------------------------------------------
单精度 float (4个字节) 可以得到6位有效数字,双精度 double(8个字节)可以得到15位有效数字 ,在c语言编译的时候,会默认先把float转化成double类型,然后进行运算
#include<stdio.h>
int main(){
float f = 3.17;
//printf("%f",f); //3.170000
//printf("%.2f",f); //3.17
printf("%.1f",f); //3.2
return 0;
}
#include<stdio.h>
int main(){
int a=5;
printf("%d",a/2); //2 (向下取整)
return 0;
}
#include<stdio.h>
int main(){
double d=500.7894613;
printf("%.8f",d);
return 0;
}
#include<stdio.h>
int main(){
int a;
scanf("%d",&a); //scanf()从键盘输入 &取地址的意思
printf("%d",a); //输入 3 得到3
return 0;
}
#include<stdio.h>
int main(){
float a;
scanf("%f",&a); //scanf()从键盘输入 &取地址的意思
printf("%f",a); //输入 3.14 得到3.140000
return 0;
}
注意:双精度 double 输入的时候使用 %lf , 输出的时候使用 %f
#include<stdio.h>
int main(){
double a;
scanf("%f",&a); //scanf()从键盘输入 &取地址的意思
printf("%f",a); //输入 3.14 得到 0.000000
//双精度就不能用 %f 需要使用 %lf
double c;
scanf("%lf",&c);
printf("%lf",c); //输入3.14 得到3.140000
return 0;
}
-------------------------------强制类型转换------------------------------------------
#include<stdio.h>
int main(){
float a=7/2;
printf("%f",a); //3.000000
return 0;
}
#include<stdio.h>
int main(){
float a=7;
printf("%d",int(a/2)); //3
return 0;
}
当自动类型转换不能实现目的时,可以用强制类型转换
(类型名)(表达式)
(double)a 将a转换成 double型
(int) (x+y) 将x+y的值转换成 int型
(float)(5%3) 将5%3的值转换为 float型
(int)x+y 只将x转换为整型,然后与y相加
#include<stdio.h>
int main(){
int a=3.14/2;
printf("%d",a); // 1
return 0;
}
#include<stdio.h>
int main(){
int a=5;
printf("%f",double(a)); // 5.000000
return 0;
}
模运算里不能有小数
#include<stdio.h>
int main(){
printf("%d\n",(1%3)); //1
printf("%d\n",(1%-3)); //1
printf("%d\n",(2%3)); //2
printf("%d\n",(-1%3)); //-1
printf("%d\n",(-1%-3)); //-1
//printf("%d\n",(9.9%3)); //会报错,模运算里面不能有小数
return 0;
}
前置++ 和后置++
#include<stdio.h>
int main(){
int i=10;
++i;
printf("++i的值是:%d\n",i);
//11
int b=10;
printf("%d\n",b++); //10
printf("%d",b); //11
return 0;
}
C语句:一般学习五种语句
1.控制语句:它是c语言自带的,比如 if()…else
2.函数调用语句: printf(“hello”);
3.表达式语句: a=3;如果是 a=3 没有分号,不算语句
4.空语句:就是一个分号
// 空语句
#include<stdio.h>
int main(){
for(;;);
}
5.复合语句:
#include<stdio.h>
int main(){
int a=100;
if(a>0){
printf("hello\n"); // hello
a+=1;
}
printf("%d",a);
return 0; // 101
}
#include<stdio.h>
#define f(a) a+a
int main(){
int a=10;
int b= f(a)*f(a); // a+a*a+a
printf("%d",b);
return 0; //120
}
逗号表达式:优先级最低,它将两个及其以上的式子连接起来,从左到右逐个计算表达式,整个表达式的值位最后一个表达式的值,如:( 3+5,6+8 ) 称为逗号表达式,其求解过程先表达式1,后表达式2,整个表达式值是表达式2的值,如:(3+5,6+8)的值是14;
#include<stdio.h>
#define f(a) a+a
int main(){
int a= (3+5,6+8);
printf("%d",a);
return 0; //14
}
#include<stdio.h>
#define f(a) a+a
int main(){
int i=1;
int a=(i+100,i++,i);
printf("%d",a); //2
return 0;
}
#include<stdio.h>
#define f(a) a+a
int main(){
int i=1;
int a=(i=i+100,i++,i);
printf("%d",a); //102
return 0;
}
#include<stdio.h>
int main(){
int a=3+'a';
printf("%d\n",a); //100
printf("%c\n",a); // d
return 0;
}
printf (格式控制,输出列表)
格式控制是用双引号括起来的一个字符串,称为格式控制字符串,简称格式字符串 例如“%d”,“%c”,“%f”
输出列表是程序需要输出的一些数据,可以是常量,变量 或者 表
#include<stdio.h>
int main(){
// printf("asdsad"); // 原样输出的意思
int a=100;
printf("%d\tasdsad",a); //100 asdsad asdsad
return 0;
}
#include<stdio.h>
int main(){
int a=100;
// printf("%d,%d,%d",a,a,++a);//101 101 101
printf("%d,%d,%d",++a,++a,++a); //103 103 103
return 0;
}
% 附加字符 格式字符
**scanf 函数中的格式控制后面应当是 变量地址,而不是变量名,**英语上述格式说明匹配,否则将会出现错误,注意的是,如果输入double类型的数据,应该是 scanf ("% lf ",地址变量)
#include<stdio.h>
int main(){
double a,b;
scanf("%lf%lf",&a,&b);
printf("%lf,%lf",a,b);
}
getchar() 和 putchar() 单个字符的输入和输出:
#include<stdio.h>
int main(){
char ch;
int i=0; //小写字符
int b=0; //大写字符
int d=0;
for(ch=getchar();ch!='\n';){
if(ch>='a'&&ch<='z')
i++;
else if(ch>='A'&& ch<='Z')
b++;
ch=getchar();
d++;
printf("第%d次循环\n",d);
}
printf("小写:%d\t大写:%d\t:",i,b);
return 0;
}
在C语言逻辑中 非0为真 0为假
逻辑量:可以是变量,常量,参与逻辑运算的,比如3就是一个逻辑两,那么3的逻辑值是1,-1的逻辑值是1,可以说非0的元素,逻辑值就是1
if… else if 语句:
#include<stdio.h>
int main(){
int a=10;
if(a>100){
printf("a>100\n");
}
else if(a>200){
printf("a>200\n");
}
else if(a>30){
printf("a>30\n");
}
else{
printf(".....");
}
}
bool (boolean)值只能是真或者假:
优先级的排序
算术运算符>关系运算符>赋值运算符
例如: c>a+b 等价 c>(a+b) a>b==c 等价 (a>b)==c
逻辑与或非
// 逻辑与 &&(都真才为真)
#include<stdio.h>
int main(){
int a=4;
int b=4;
printf("%d",a&&b); //1
return 0;
}
#include<stdio.h>
int main(){
int a=0;
int b=1;
printf("%d\n",a&&(++b)); //0 因为a已经为0 就不需要看后面的表达式
printf("%d\n",b); //1
return 0;
}
//逻辑或 || (有真就为真)
#include<stdio.h>
int main(){
int a=0;
int b=1;
printf("%d\n",a||b); //1
return 0;
}
//逻辑非 ! (真为假 假为真)
#include<stdio.h>
int main(){
int a=0;
printf("%d\n",!a); //1
return 0;
}
三目运算符: ?: 表达式1 ?表达式2:表达式3;
#include<stdio.h>
int main(){
int a=100;
int b=200;
int c=a>b? 666:a==b?20:50;
printf("%d",c);
return 0;
}
switch语句:
break 可以理解为停止,break只能用于 switch 和循环语句
#include<stdio.h>
int main(){
int a=100;
switch(a){
case 1:
printf("a的值为1\n");
case 100:
printf("a的值为:100\n");
break;
default:printf("other\n");
}
return 0;
}
题一:判断年份例子:
#include<stdio.h>
int main(){
int year;
printf("如果输入的是 -1,将会直接退出程序!\n");
while(1){
printf("请输入一个年份:");
scanf("%d",&year);
if(year==-1){
break;
}
if((year%4==0&&year%100!=0)||(year%400==0)){
printf("%d年为润年\n",year);
}else{
printf("%d年为平年\n",year);
}
}
}
题二:1-100的和
#include<stdio.h>
int main(){
int i=1,sum=0;
while(i<=100){
sum+=i;
i++;
}
printf("1-100的和为:%d",sum);
return 0;
} // 5050
程序=算法+数据结构
for循环:
其中 表达式1 可以零个,一个,多个参数,只执行 一次
表达式2 作为逻辑判断,符合逻辑,循环执行,反之
表达式3 一般作为控制循环的参数零个,一个,或多个,循环体执行完,执行表达式3
#include<stdio.h>
int main(){
int i=0;
for(i;i<10;i++){
printf("%d\n",i);
}
return 0;
}
#include<stdio.h>
int main(){
for(int i=10,j=20;i<=j;i++,j--){
printf("%d\n",i-10+1);
}
return 0;
}
题三:1000个同学捐款10万元例子
// 1000个同学捐款10万元例子
#include<stdio.h>
#define SUM 100000
int main(){
float allMoney=0,everyMoney;
for(int i=1;i<=1000;i++){
printf("请第%d个同学输入你的捐款金额:\n",i);
scanf("%f",&everyMoney);
allMoney=allMoney+everyMoney;
if(allMoney>SUM){
printf("捐款已达标!,这是到了第%d个同学捐齐的",i);
break;
}
printf("当前的总金额为%.2f\n",allMoney);
}
return 0;
}
题四:字母大小写转换
#include<stdio.h>
int main(){
char c;
printf("请输入一个字母:\n");
c=getchar();
if(c>='a'&&c<='z'){
putchar(c-32);
putchar('\n');
}
else if(c>='A'&&c<='Z'){
putchar(c+32);
putchar('\n');
}
return 0;
}
数组和指针
数组有地址,&a[0] 就是数组的首地址,数组名也是数组的首地址,a和 &a[0] 相等.
#include<stdio.h>
int main(){
int a[3]={1,2,3};
printf("%x\t%x",a,&a[0]); // 62fe10 62fe10
return 0;
}
二维数组的赋值
二维数组一定有列常量
第一种:int [2][3]={{1,2,3},{4,5,6}}; 其中最里面的 {} 表示的是行, {1,2,3}里面3个值,我们定义的是 2行3列
第二种:int [2][3] ={1,2,3,4,5,6}; 这样直接系统把 1-3 归到第一行
第三种:int [2][3] ={{1},{2,3}}; 当然 int[2][3] ={{},{2,3}}; 也可以
第四种: int[][3]={1,2,3,4,5,6}; int[] [3]={{1,2},{3}}也是可以的
#include<stdio.h>
#include<string.h>
int main(){
char c[10]={'a','b','\0','c','d'}; // '\0'表示 字符串的结尾标志
// strlen 求字符串的长度 使用strlen函数必须导入<string.h>
printf("%d\n",strlen(c)); //2
// sizeof 表示占用内存 开辟的空间
printf("%d\n",sizeof(c)); // 10
return 0;
}
#include<stdio.h>
#include<string.h>
int main(){
int c[10];
printf("%d\n",sizeof(c)); // 40 因为一个int类型占用4个字节
return 0;
}
#include<stdio.h>
#include<string.h>
int main(){
char c[]="hello";
printf("%s\n",c); // hello
printf("%d\n",strlen(c)); //5
printf("%d\n",sizeof(c)); // 6 会在默认的后面添加 '\0'表示结尾,也占用1个位置
return 0;
}
字符串处理函数:
字符串使用函数的时候 记得导入 <string.h>
输入 gets(字符数组) 输出 puts(字符数组)
#include<stdio.h>
#include<string.h>
int main(){
char c[50];
gets(c);
puts(c);
return 0;
}
字符串连接函数 strcat(字符数组1,字符数组2)
#include<stdio.h>
#include<string.h>
int main(){
char c1[20]="study";
char c2[10]="hard!!";
strcat(c1,c2);
puts(c1); // studyhard!!
return 0;
}
字符串复制 strcpy(字符数组1,字符串2或字符数组2)
#include<stdio.h>
#include<string.h>
int main(){
char c1[20]="study";
char c2[10]="hard!!";
strcpy(c1,c2);
puts(c1); // hard!!
return 0;
}
#include<stdio.h>
#include<string.h>
int main(){
char c1[100]="study";
strcpy(c1+1,"Good"); //c1+1 代表从上面的t开始
printf("%s",c1); // sGood
return 0;
}
strncpy(字符数组1,字符串2或字符数组2,常量n)是把字符串2 或字符数组2 从前几个字符复制到字符数组1中,前几个就用常量 n表示
#include<stdio.h>
#include<string.h>
int main(){
char c1[100]="study";
strncpy(c1,"Good",2); // 2 代表将前两个字符换到上面
printf("%s",c1); // Goudy
return 0;
}
strcmp 字符串比较函数 strcmp(字符串1,字符串2)
是将两个字符串从左到右,字符逐个对比,是 ASCII码大小的比较,如果字符都相等,那么两个字符串相等 例如: these和 that比较 ,th是一样的, e和 a不同,e的ASCII码比a大,所以 these>that
#include<stdio.h>
#include<string.h>
int main(){
char c1[]="ABC";
char c2[]="ABC";
char c3[]="AAC";
// printf("%d",strcmp(c1,c2)); // 一模一样输出显示0
//printf("%d",strcmp(c2,c3)); // 大于的话输出显示1
printf("%d",strcmp(c3,c2)); //小于的话输出显示 -1
return 0;
}
指针:
* 取值运算符 *指针变量
& 取地址运算符 &变量名