《c语言程序设计》-谭浩强

本文详细介绍了C语言的基础知识,包括遍历、运算符、选择结构if switch、函数、指针等内容,涉及数据类型转换、类型转换、赋值运算、逻辑运算、循环结构、数组、字符串、函数调用、指针操作等多个方面,适合C语言初学者及进阶学习者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C语言基础学习内容

两个数交换
求一个整数每一位的值
求和
二重循环
一维数组的遍历

遍历:按照一定的顺序,不重不漏的将数组中的每一个元素“找一遍”。
求最大值(打擂台)
二维数组的遍历
字符串的遍历
函数的递归

++(自增运算符)和–(自减运算符)
a++:a = a+1
++a: a= a+1
a–:a = a- 1
–a: a = a-1

a++:先使用a的值,再将a的值加1.
++a: 先将a的值+1,然后再使用a的值

#include<stdio.h>
int main(){
int a = 10;
++a;//a++
printf(“a = %d\n”,a);
return 0;
}

#include<stdio.h> 
int main(){
   
   
	int a = 10;
	int b;
//	b = a++;//1.赋值 2.++
//	 1.b = 10
//	2.a =11
	b = ++a;//1.a = 11 2.b=11
	//a++:先使用a的值,再将a的值加1.
	//++a: 先将a的值+1,然后再使用a的值 
	printf("a = %d\n",a);
	printf("b = %d\n",b);
	return 0;
}

不同类型数据间的混合运算
(1)+ - * /运算时的两个数中有一个为float或double,运算结果为double类型。
4+3-int 4.3+3-double 3.2f+2double
(2)如果int类型与float或double类型进行运算,运算结果为double类型。

(3)字符型数据与整型数据进行运算,就是把字符的ascii码与整型数据进行运算。
‘a’+2 =99
例如:
int i=3;float f=2.5f;double d=7.5
10+’a’+if-d/3 (从左到右)
=107+ i
f-d/3
=107+7.5-d/3
=114.5-d/3
=114.5-2.5 =112.000 double
强制类型转换

#include<stdio.h> 
int main(){
   
   
  float a = 12.845f;
	int b;
	b = (int)a; //直接抹去小数点后面的值 
	printf("b = %d\n",b); 
	return 0;
}

赋值运算符 = 
结合顺序:从右向左

```c
#include<stdio.h> 
int main(){
//    int a,b,c;
//    a= b =c =10;
    //int a = b =c =10; error 
    int a=10,b=10,c=10;
	//如果没有给变量赋初值,变量的值是未知的 
	printf("a=%d\n",a); 
	printf("b=%d\n",b); 
	printf("c=%d\n",c); 
	return 0;
}

复合运算符:
+= -= *= /= %=

#include<stdio.h> 
int main(){
   
   
    int a = 10;
    //a+=3;//a = a +3;
    //a-=3;//a = a-3;
    //a*=3;//a = a*3;
    //a/=3;//a = a/3
    a%=3;//a = a%3;
    printf("a –[= %d\n",a); 
	return 0;
}

练习:
int x = 15,求X-=X+X的值()
X = X-(X+X)=15-30=-15
赋值过程中的类型转换
(1)浮点型数据赋值给整型变量,直接舍弃小数部分。
(2)将整型数据赋值给浮点型变量,数值不变。
(3)将double型数据赋值给float变量时,注意数值范围不能溢出。
(4)字符型数据赋值给整型变量,直接将字符的ASCII赋值给整型变量。

#include<stdio.h> 
int main(){
   
   
	//1.浮点型--->整型
	float a = 12.35f;
	int b;
	b = a; 
	printf("b = %d\n",b);
	//2.整型---->浮点型
	int c = 12;
	double d;
	d = c; 
	printf("d = %f\n",d);
	//3.double -float
	double e = 12.235678123;
	printf("e = %.9f\n",e);
	float f;
	f = e;
	printf("f = %.9f\n",f);
	//4.char -->int
	char g = 97;
	int h;
	h = g;
	printf("h = %d\n",h);
	//5.int-->char
	int i = 289;
	char j;
	j = i;
	printf("j = %d\n",j);
	return 0;
}

总结printf()

scanf() //输入

#include<stdio.h> 
int main(){
   
   
	//
	int a;
	scanf(",a=%d",&a);//输入格式 ,变量的地址 
	//&取地址符 
	//通过键盘输入数据到变量地址对应的空间 
	//输入的时候必须严格按照输入格式输入 
	printf("a = %d\n",a); 
	return 0;
}

特例1

#include<stdio.h> 
int main(){
   
   
	int a,b,c;
	//输入数值   format: "%d%d%d"
	//加:空格 回车 tab 
	scanf("%d%d%d",&a,&b,&c);
	printf("a = %d\n",a);
	printf("b = %d\n",b);
	printf("c = %d\n",c);
	return 0;
}

特例2

#include<stdio.h> 
int main(){
   
   
	char a,b,c;
	//输入字符   format: "%c%c%c"
	//字符和字符直接要紧紧的挨在一起输入。 
	scanf("%c%c%c",&a,&b,&c);
	printf("a = %c\n",a);
	printf("b = %c\n",b);
	printf("c = %c\n",c);
	return 0;
}

特例3

#include<stdio.h> 
int main(){
   
   
	double a;
	//输入格式 float--->%f
	//输入格式 double--->%lf 
	scanf("%lf",&a);
	printf("a = %f",a); 
	return 0;
}

特例4

#include<stdio.h> 
int main(){
   
   
	int x,y;
	scanf("%d%3d",&x,&y);//1234 56789
	printf("x = %d,y=%d",x,y); 
	return 0;
}

字符输入输出函数putchar() getchar()
1.putchar();-输出

#include<stdio.h> //01
int main(){
   
   
	int a = '\101';
	printf("a = %c\n",a);
	putchar(a);
	putchar('\n');
	putchar('\x41');
	putchar('a'+3);
	return 0;
}

2.getchar()

#include<stdio.h> //01
int main(){
   
   
	char a,b,c;
//	scanf("%c",&a);
    a = getchar();
    b = getchar();
    c = getchar();
	printf("%c%c%c",a,b,c);
	return 0;
}

例题:
输入三角形的三条边,求三角形的面积。

#include<stdio.h>
#include<math.h>
int main(){
   
   
	double a,b,c;
	scanf("%lf%lf%lf",&a,&b,&c);
	double s = (a+b+c)/2;
	double area;
	area = sqrt(s*(s-a)*(s-b)*(s-c));
	printf("area = %f",area);
	return 0;
}

2.求解一元二次方程。

#include<stdio.h>
#include<math.h>
int main(){
   
   
	float a,b,c;
	scanf("%f%f%f",&a,&b,&c);
	float x1,x2;
	x1 = (-b+sqrt(b*b-4*a*c))/(2*a);
	x2 = (-b-sqrt(b*b-4*a*c))/(2*a);
	printf("x1 = %f,x2 = %f",x1,x2); 
	return 0;
}
输入一个大写字母,将大写字母转换为小写字母。

A-65 a-97 ‘A’+32=’a’

#include<stdio.h>
#include<math.h>
int main(){
   
   
	char c1;//大写 
	char c2;//小写 
	c1=getchar();
	c2 = c1+32;
	putchar(c2);
	return 0;
}

第四章 选择结构if switch

1.关系运算 > < >= <= == !=
作用:判断关系运算符左右两边的表达式是否满足条件。
5>6–否(0)
5>=5-是(1)
优先级:
算术运算符>关系运算符>赋值运算符
关系运算内部:
(> < >= <=)>(== !=)

#include<stdio.h>
int main(){
   
   
    int a=5,b=6,c=2;
    printf("%d\n",a+b>b);//1.11>b 
    printf("%d\n",a+b!=b+'a');//1.11!=103
    printf("%d\n",a+b>b>a==b-a);
    //1.11>b>a==1
	//2.1>a==1
	//3.0==1
    printf("%d\n",b>a+b>a!=b-a>1);
	//1.b>11>a!=1>1
	//2.0>a!=1>1
	//3.0!=0
	return 0;
}

逻辑运算符:&&(与)||(或) !(非)
与运算:a&&b-如果a和b同时为真(满足),结果为真(是),如果有一个为假(不是)结果为假。
1&&1=1 1&&0=0 0&&1=0 0&&0=0
5&&-2=1
注意:C语言中,非0数表示真,0表示假。
或运算:a||b-如果a或b为真(满足),结果为真(是),如果a和b同时为假,结果为假。
1||1=1 1||0=1 0||1=1 0||0=0
-9||7=1
非运算:!a-如果a为真,!a为假;如果a
为假,!a为真。
!1=0 !0=1 !-1=0
优先级:
!(非)>算术运算符>关系运算符>&&和||>赋值运算符
赋值运算符:从右向左
算术运算符 关系运算符 逻辑运算符:从左到右

1.!(2)+2-1&&4+2/2
2.0+2-1&&4+1
3.1&&5=1

#include<stdio.h>
int main(){
   
   
    int a=1,b=2,c=5,d=-1;
	printf("%d\n",a>b+1||b+d==a&&c-5);
	//1. 1>3||1==1&&0
	//2.0||1&&0
	//3.1&&0=0
	printf("%d\n",5>3&&8<4-!0);
	//1.5>3&&8<4-1
	//2.5>3&&8<3
	//3.1&&0=0
	return 0;
}

逻辑运算特性:

b =9;
注意:存在a&&b,a如果为0(假),&&号后面的b,不执行。
存在a||b,a如果为1(真),||号后面的b,不执行。

if语句
if(只要是能返回1或0){//判断是否满足条件

}

例:定义两个整数,按照由小到大的顺序输出。

#include<stdio.h> 
int main(){
   
   
	//1.小 大  按原样输出
	//2.大 小  交换输出
	int a,b,t;
	scanf("%d%d",&a,&b); 
	if(a>b){
   
   //10>2
	//a和b交换
	 t = a;
	 a = b;
	 b = t;	
	}
	printf("%d %d",a,b);
	return 0;
}

例题:输入一个年份,判断这个年份是否是闰年?
int year
能被4整除并且不能被100整除或能被400整除
(year%40&&year%100!=0)||year%4000

#include<stdio.h> 
int main(){
   
   
	int year;
	scanf("%d",&year);
	if((year%4==0&&year%100!=0)||year%400==0){
   
   
		printf("是闰年!");
	} else{
   
   
		printf("不是闰年!"); 
	}
	return 0;
}

#include<stdio.h> 
int main(){
   
   
	int year;
	scanf("%d",&year);
	if((year%4==0&&year%100!=0)||year%400==0)
		printf("是闰年!");
	else
		printf("不是闰年!"); 
	return 0;
}

注意:如果if或else后只有一句话或一个不可分割的整体,{}可以省略。

#include<stdio.h> 
int main(){
   
   
	int a = 10;
	int b = 5;
	if(a<5)
	b = a+2;
	a = b+1;
	printf("%d,%d",a,b);
	return 0;
}
#include<stdio.h> 
int main(){
   
   
	double x,y;
	scanf("%lf",&x);
	if(x<1)
		y = x;
	else if(x>=1&&x<10)
		y = 2*x-1;
	else if(x>=10)
		y = 3*x-11;
	printf("y = %f",y);
	return 0;
}

条件表达式(三目运算)
形式:表达式1?表达式2:表达式3
简洁的if…else语句
步骤:如果表达式1为真,执行表达式2;如果表达式1为假,执行表达式3.
例如:给定两个整数,输出最大值。

#include<stdio.h> 
int main(){
   
   
	int a =10;
	int b = 20;
	int max;
	//方法一 
//	if(a>b){
   
   
//		max = a;
//	} else{
   
   
//		max = b;
//	}
	//方法二 
//	max=a>b?a:b;
	//方法三
//	a>b?max=a:max=b; 
//	printf("max=%d",max);
//方法四
	a>b?printf("%d",a):printf("%d",b); 
	return 0;
}

例题:输入一个字符,判断它是否为大写字母,如果是大写字母,转换为小写,如果不是大写字母,则不转换。

#include<stdio.h> 
int main(){
   
   
//输入一个字符,判断它是否为大写字母,
//如果是大写字母,转换为小写,
//如果不是大写字母,则不转换。
	char ch;
	ch = getchar();//scanf("%c",&ch);
//	if(ch>='A'&&ch<='Z'){
   
   
//		ch = ch +32; 
//	}
   // ch = ch>='A'&&ch<='Z'?ch+32:ch; 
   ch>='A'&&ch<='Z'?putchar(ch+32):putchar(ch); 
	//putchar(ch); 
	return 0;
}

switch语句
switch(表达式(整型char)){
case 常量:语句
case 常量:语句
case 常量:语句
case 常量:语句

default:语句 //可以省略
}
语句结构中的“表达式”的类型为整型(包括char);default语句可以省略;各case标号出现的次序不影响程序的结果每个case后的标号应不相同。多个case标号后可以共用一组执行语句。
例题:用户输入成绩的等级,输出相应的成绩范围。如:输入A,输出85-100;输入B输出70-84;输入C输出60-69;输入D输出59-0.

#include<stdio.h> 
int main(){
   
   
	//
	char grade;
	grade = getchar();
	//如果switch中省略掉break;就会从第一个符合条件
	//的语句开始执行,直到switch语句执行完成。 
	switch(grade){
   
   //整型 
		case 'A':printf("100-85\n");break;//跳出 
		case 'B':printf("84-70\n");break ;
		case 'C':printf("69-60\n");break ;
		case 'D':printf("59-0\n");break ;
		default:printf("输入成绩错误!");	
	} 
	return 0;
}

典型例题:
输入一个5位数,求出每一位数的值。

#include<stdio.h> 
int main(){
   
   
	int a;
	scanf("%d",&a);
	int ten_thou,thou,hun,ten,indiv;
	ten_thou = a/10000;//万
	thou = a%10000/1000;//千
	hun = a%10000%1000/100;//百
	ten = a%10000%1000%100/10;//十
	indiv = a%10000%1000%100%10;//个
	printf("ten_thou=%d\n",ten_thou);
	printf("thou=%d\n",thou);
	printf("hun=%d\n",hun);
	printf("ten=%d\n",ten);
	printf("indiv =%d\n",indiv); 
	return 0;
}

输入一个三位整数,判断这个三位数是否是水仙花数。如果153=111+555+333,就是水仙花数。

#include<stdio.h> 
int main(){
   
   
	int num;
	scanf("%d",&num);
	int b,s,g;
	b = num/100;
	s = num%100/10;
	g = num%100%10;
	if(num==b*b*b+s*s*s+g*g*g) printf("yes!");
	else printf("No!"); 
	return 0;
}

例题:求一元二次方程的解。
注意:两个整数比较是否相等是可以用==,;例如22 a3.
两个浮点数比较是否相等时,千万别使用==。

#include<stdio.h> 
#include<math.h> 
int main(){
   
   
	double a,b,c;
	scanf("%lf%lf%lf",&a,&b,&c);
	double disc = b*b-4*a*c;//double 0.0000001
	double x1,x2;
	if(fabs(disc)<=1e-6){
   
   //0.00000001   0.00000000000001
		printf("有两个相等的解:%f\n",-b/(2*a));
	} 
	else if(disc>0){
   
   
		 x1 = (-b+sqrt(disc))/(2*a);
		 x2 = (-b-sqrt(disc))/(2*a);
		 printf("x1=%f,x2=%f\n",x1,x2);
	}else{
   
   
		 double p,q;
		 p = -b/(2*a);
		 q = sqrt(-disc)/(2*a);
		 printf("x1=%f+%fi\n",p,q);
		 printf("x2=%f-%fi\n",p,q);
	}
	return 0;
}

输入一个百分制成绩,要求输出‘A’,‘B’,‘C’,‘D’,‘E’。例如:100-90分输出A,89-80输出B,70-79输出C,60-69输出D,59-0输出E。(int)78.5/10=7 (int)75.3/10
switch结构 与 if…else if…else if…else结构等价。

#include<stdio.h> 
int main(){
   
   
	float score;
	scanf("%f",&score);
	if(score>=90&&score<=100)printf("A");
	else if(score>=80&&score<=89)printf("B");
	else if(score>=70&&score<=79)printf("C");
	else if(score>=60&&score<=69)printf("D");
	else printf("E");
	return 0;
}
#include<stdio.h> 
int main(){
   
   
	float score;
	scanf("%f",&score);
	switch((int)score/10){
   
   //100-0
		case 10:
		case 9:printf("A");break;
		case 8:printf("B");break;
		case 7:printf("C");break;
		case 6:printf("D");break;
		case 5:
		case 4:
		case 3:
		case 2:
		case 1:
		case 0:printf("E");break;
	} 
	return 0;
}

第五章 循环结构
知识点:while for break continue 双重循环
while循环
循环:做重复的事情。
while(循环条件:返回0或1的表达式){
//循环体
}
循环条件为真,就执行循环体,循环条件为假,跳出循环体。

#include<stdio.h> 
int main(){
   
   
	int i =1;//循环次数 
	while(i<=20){
   
   
		//循环体 		
	printf("helloword\n");
	i++;
	}
	return 0;
}

例如:1+2+3+4+….+100

#include<stdio.h> 
int main(){
   
   
	int sum = 0;//空瓶子
	int i=1;
	while(i<=100){
   
   
		sum = sum +i; 
		i++;
	} 
	printf("%d",sum);
	return 0;
}

注意:循环体中如果只有一句话或一个整体,{}可以省略。
do….while循环
do{
//循环体
}while(循环条件);

#include<stdio.h> 
int main(){
   
   
	int sum = 0;
	int i=1;
	do{
   
   
		sum = sum +i;
		i++;
	}while(i<=100); 
	printf("%d",sum);
	return 0;
}
注意:whiledowhile是等价的。
注意:whiledowhile的区别:while语句是先进行循环条件的判断,再执行循环体。dowhile先无条件执行一次循环体,再进行循环条件的判断。
#include<stdio.h> 
int main(){
   
   
	int i =1;
	int a=10;
	while(i<1){
   
   //1<1--->0 
		a = 20;
		i++;
	}
	printf("a=%d",a);
	return 0;
}

练习:

for语句

一般形式:
for(初始值;循环条件;循环增(减)量)
{
//循环体
}
例题:1+2+3++….100
注意:while和for等价的。
如果明确了循环的范围,使用for语句。
如果循环范围不明确,使用while语句。

#include<stdio.h> 
int main(){
   
   
	int sum;
	int i; 
	for(sum=0,i=1;i<=100;++i)
	{
   
   
		sum = sum+i;//sum+=i
	}
	printf("%d",sum);
	return 0;
}

注意:循环体中如果只有一句话或一个整体,{}可以省略。
for循环的几种形式:
初值表达式可以为空,但;不能省略。
for(;i<=100;++i)
条件语句可以为空,如果条件语句为空,此循环会无限的执行下去(死循环)。
for(;;++i)
循环增量也可以省略,如果省略,程序有可能会无限执行下去。for(;i<=100;)
初值,循环条件,循环增量可以同时省略。
for(;;)相当于while(1){}
初值表达式可以是多个表达式。
for(sum=0,i=1,;i<=100;)
在C99中,初值表达式可以定义变量。C89不可以。for(int i=1;i<=100;)

#include<stdio.h> 
int main(){
   
    
    int b,s,g;
	for(int i=100;i<=500;i++){
   
   
		b = i/100;
		s = i%100/10;
		g = i%10;//个位 g = i%10 
		if(i==b*b*b+s*s*s+g*g*g)
		printf("%d是水仙花数\n",i);
	} 
	return 0;
}

求斐波那契数列(Fi-bo-na-cci)的前30项。

#include<stdio.h> 
int main(){
   
    
    int f1 = 1;
    int f2 = 1;
    int f3,f4;
    printf("%d\n",f1);
	printf("%d\n",f2);
	for(int i=3;i<=30;i++){
   
   
		f3 = f1 +f2;
		printf("%d\n",f3);
		f1 = f2;
		f2 = f3;
	} 
	return 0;
}
break关键字和continue关键字

break关键字:在循环结构中,遇到break关键字跳出整个循环。

#include<stdio.h> 
int main(){
   
   
	for(int i=1;i<=10;i++){
   
   
		if(i%3==0)break;
		printf("%d\n",i);
	} 
	return 0;
}

continue关键字:在循环结构中,遇到continue关键字跳出本次循环。

#include<stdio.h> 
int main(){
   
   
	for(int i=1;i<=10;i++){
   
   
		if(i%2==0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值