C语言笔记

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;
} 

指针:

 * 取值运算符  *指针变量
 & 取地址运算符  &变量名
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值