谭浩强C语言程序设计(1-3章代码学习)

谭浩强C语言程序设计 参考书

C语言学习笔记记录,学习为主,新手小白入门

我所用的C语言在线编译器:lightly在线编译工具

可新建工程

谭浩强C语言程序设计书籍所包含的代码示例加注释说明如下:


/*笔记记录者:xy;学习教材 谭浩强C语言程序设计*/
/*时间:2022年11月15日14:40:36*/
/*使用本代码测试将 #if 0 ------> #if 1 即可*/
/*代码未必全部理解正确,欢迎萌新大佬对其修正*/
#include <stdio.h>	//输入输出头文件
/*--------------------(第一章 C语言教程)--------------------*/
#if 1
/*例1.1,p14*/
int main(void)
{
	printf("hello world!\n");
	return 0;
}
#endif

#if 0
/*例1.2,p15*/
#include <math.h>
int main(void)
{
	double x,s;
	printf("请输入任意一个整数:");
	scanf("%lf",&x);
	s = sin(x);
	printf("%lf",s);
	return 0;
}
#endif

#if 0
/*比较两个数的大小*/
//#include "math.h"
int max(int a,int b);//函数声明
int main(void)//主函数
{
	int x,y,z;
	//int max(int a,int b);/*可有可无,无影响*/
	printf("Input two number:\n");
	scanf("%d%d",&x,&y);
	z=max(x,y);//----------------调用比较函数max---------------
	printf("maxnum = %d\n",z);
}
int max(int a,int b)//自定义比较函数
{
	if(a>b)
		return a;
	else
	 	return b;
}
#endif

/*--------------------(第二章 程序的灵魂——算法)--------------------*/
#if 0
/*数据结构+算法=程序*/
/*
算法分类:
	1)数值运算算法:求解数值.
	2)非数值运算算法:事务管理领域.
*/
/*例2.1 求1*2*3*4*5,p32*/
#if 0
int main()
{
	int i,s = 1;
	for(i = 1;i <= 5;i++){
		s = s*i;
	}
	printf("s = %d\n",s);
}
#else
/*例2.1.1 求1*3*5*7*9*11*/
int main()
{
	int n,m;
	printf("输入相乘的个数m:");
	scanf("%d",&m);
	int i = 1,s = 1;
	for(n = 1;n <= m;n++){
		s = s*i;
		i = i+2;
	}
	printf("输出m(%d)个数相乘1*3*5*...*%d*%d的值:",m,i-2,i);
	printf("s = %d\n",s);
}
#endif
#endif

#if 0
/*例2.2,输出50(或m)个学生中,分数在80分以上的,p33*/
int main()
{
    int m,i = 0;
    int n[50] = {0};//学号(输入的学号不能以0开头如:001,在十进制中以0开头不合法,0无法输出出来,第三章会有介绍)
    int g[50] = {0};//分数
	printf("一共需要录入成绩的人数有m:");
	scanf("%d",&m);
    for(i=1;i<=m;i++)//循环输入50个人的成绩
    {
        printf("请输入第%d个学生的学号和成绩\n",i);
        scanf("%d%d",&n[i-1],&g[i-1]);
    }
    printf("\n\n 成绩大于80的学生的学号和成绩为\n\n");
    for(i=1;i<=m;i++)//有几人则循环几次
    {
        if(g[i-1]>=80)
        {
            printf("学号:%d   成绩:%d\n",n[i-1],g[i-1]);
        }
    }
    return 0;
}
#endif

#if 0
/*例2.3,判断2000——2500年中的闰年,并输出,p33*/
/*在此基础上修改判断任意时间段中的闰年*/
#if 0
int main(void)
{
	int i;
	for(i=2000;i<=2500;i++){
		if(i%4==0&&i%100!=0){
			printf("%d是闰年\n",i);
		}
		else if(i%100==0&&i%400==0){
			printf("%d是闰年\n",i);
		}
	}
	return 0;
}
#else
int main(void)
{
	int i,m,n;
	printf("输入任意两段年限,判断是否为闰年:");
	scanf("%d%d",&m,&n);
	for(i=m;i<=n;i++){
		if(i%4==0&&i%100!=0){
			printf("%d是闰年\n",i);
		}
		else if(i%100==0&&i%400==0){
			printf("%d是闰年\n",i);
		}
	}
	return 0;
}
#endif
#endif

#if 0
/*例2.4,求1-1/2+1/3-1/4+....+1/99-1/100,p34*/
int main(void)
{
	int i;
	double a = 1.0,s = 1.0;
	for(i=2;i<=100;i++){
		a = (-1) * a;
		s = s + a/i;
	}
	printf("输出1-1/2+1/3-1/4+....+1/99-1/100的值s = %f",s);
	return 0;
}
#endif

#if 0
/*例2.5,对于一个大于或等于3的正整数,判断它是不是一个素数,p34*/
int main(void)
{
	int i;//要判断的数字
	int m;//用于辅助判断 
	int k;//k用作除数
	printf("输入一个大于或等于3的正整数i:");
	scanf("%d",&i);
	for(k=2;k<=i;k++){  //k用作除数,用于判断是否为素数 
		m=i%k;
		if(m==0) break;
	}
	if(k>=i){
		printf("%d是素数\n",i);
	}else{
		printf("%d不是素数\n",i);
	}
	return 0;
}
#endif

/*--------------------(第三章 数据类型、运算符与表达式)--------------------*/
/************************************************************************
3.1数据类型分类:
	(1)基本数据类型:
			1)整型:
					1.基本型:int(2 byte(字节))
					2.短整型:short int或short(2 byte)
					3.长整型:long int或long(4 byte)
					4.无符号型:unsigned
							*无符号基本型:unsigned int
							*无符号短整型:unsigned short int
							*无符号长整型:unsigned long int
							**无符号型数据,所占空间不变,正数最大范围变为原来的2倍,但无法表示负数(p48)**
			2)字符型:char(1 byte)
			3)实型(浮点型)
					1.单精度型:float(4 byte)
					2.双精度型:double(8 byte)
			4)枚举类型
	(2)构造数据类型
			1)数组类型
			2)结构体类型
			3)共用体(联合)类型
	(3)指针类型
	(4)空类型
***************************************************************************/
#if 0
/*例3.1,符号常量的使用,p45*/
#define PRICE 30 //宏定义全局变量
int main(void)
{
	int num,total;
	num = 10;
	total = num*PRICE;
	printf("total = %d\n",total);
	return 0;
}
#endif

#if 0
/*例3.2,整型变量的定义与使用,p49*/
int main(void)
{
	int a,b,c,d;	//a,b,c,d为整型变量
	unsigned u;		//u为无符号整型变量
	a = 12;b = -24;u = 10;//对各个变量赋值
	c = a + u;
	d = b + u;
	printf("a+u = %d,b+u = %d\n",c,d);
	return 0;
}
#endif

#if 0
/*例3.3整型数据的溢出,p49*/
#if 0
int main(void)
{	/*在我的编译器中定义int被默认为了long int(4 byte),正常情况下应为基本类型int(2 byte)*/
	int a,b;
	a = 2147483647;//在此处为long int(4 byte) 数值范围-2147483648~2147483647,查看p62
	b = a + 1;
	printf("%d,%d\n",a,b);
	return 0;
}
#else
int main(void)
{
	short int a,b;
	a = 32767;//此处为short int (2 byte)数值范围-32768~32767,查看p62
	b = a + 1;
	printf("%d,%d\n",a,b);
	return 0;
}
#endif
#endif

#if 0
/*例3.4,类型转换,p50*/
int main(void)
{
	long x,y;
	int a,b,c,d;
	x = 5,y = 6;
	a = 7,b = 8;
	c = x + a;
	d = y + b;
	printf("c=x+a= %d,d=y+b= %d\n",c,d);
	return 0;
}
#endif

#if 0
/*eg3.5,c允许浮点型使用后缀,p51*/
int main(void)
{
	printf("%f\n",356.);
	printf("%f\n",356);
	printf("%f\n",356f);
	return 0;
}
#endif

#if 0
/*eg3.6,实行数据的舍入误差,p51*/
int main(void)
{
	float a,b;
	a = 123456.789e5;
	b = a + 20;
	printf("%f\n",a);
	printf("%f\n",b);
}
#endif

#if 0
/*eg3.7,实行数据的舍入误差,p52*/
int main(void)
{
	float a;//单精度有效位为7位,所以小数点后2位以后无效
	double b;//双精度有效位16位,但C规定小数后最多保留六位,其余部分四舍五入
	a=33333.33333;
	b=33333.33333333333333;
	printf("%f\n%f\n",a,b);
	return 0;
}
#endif

#if 0
/*****************************************************************************
转义字符:
	1)\n 回车换行			2)\t 横向跳到下一制表位置
	3)\b 退格			    4)\r 回车
	5)\f 走纸换页			6)\\ 反斜线符"\"
	7)\' 单引号符			8)\" 双引号符
	9)\a 鸣铃				10)\add 1~3位八进制所代表的字符
	11)\xhh 1~2位十六进制所代表的字符
******************************************************************************/
/*eg3.8,转义字符的使用,p53*/
int main(void)
{
	int a,b,c;
	a = 5;b = 6;c = 7;
	printf("  ab  c\tde\rf\n");
	printf("hijk\tL\bM\n");
	return 0;
}
#endif

#if 0
/*eg3.9,向字符变量赋以整数,p54*/
int main(void)
{
	char a,b;
	a = 120;
	b = 121;
	printf("%c,%c\n",a,b);//输出字符型数据
	printf("%d,%d\n",a,b);//输出整型数据
	return 0;
}
#endif

#if 0
/*eg3.10,字母大小写转换,p54*/
int main(void)
{
	char a,b;
	a = 'a';
	b = 'b';
	a = a - 32;//字母大小写的ASSCII码相差32
	b = b - 32;
	printf("%c,%c\n%d,%d\n",a,b,a,b);//输出转换字符,和相应的ASCII码值
	return 0;
}
#endif

#if 0
/*eg3.11,变量赋初值操作,p55*/
int main(void)
{
	int a = 3,b,c = 5;
	b = a + c;
	printf("a=%d,b=%d,c=%d\n",a,b,c);
	return 0;
}
#endif

#if 0
/*
数据类型自动转换规则:
	char,short——>int——>unsigned——>long——>double
	将char转为int用atoi()进行转换(该函数包含在stdlib.h头文件中)
*/
/*eg3.12,数据类型转换,p56*/
#include <stdlib.h>		//目的调用atoi函数进行数据转换
int main(void)
{
	char PI[8] = "3.14159";
	int s,r = 5;
	s = r*r*atoi(PI);
	printf("s=%d\n",s);
	return 0;
}
#endif

#if 0
/*eg3.13,强制类型转换,p57*/
int main(void)
{
	float f = 5.75;
	printf("(int)f=%d,f=%f\n",(int)f,f);//将float强制转换为int
	return 0;
}
#endif

#if 0
/*eg3.14,基本的算术运算符,p58*/
int main(void)
{
	printf("\n\n%d,%d\n",20/7,-20/7);
	printf("%f,%f\n",20.0/7,-20.0/7);
	return 0;
}
#endif

#if 0
/*eg3.15,%取余运算符的使用,p58*/
int main(void)
{	/*100除以3取余数*/
	printf("%d\n",100%3);//本例输出 100 除以 3 所得的余数 1。
	return 0;
}
#endif

#if 0
/*eg3.16,自增自减运算符操作,p59*/
int main(void)
{
	int i = 8;
	printf("%d\n",++i);//9,++i先自加,后运算
	//printf("%d\n",i);//9
	printf("%d\n",--i);//8,--i先自减,后运算
	//printf("%d\n",i);//8
	printf("%d\n",i++);//8,i++先运算,后自加
	//printf("%d\n",i);//9
	printf("%d\n",i--);//9,i--先运算,后自减
	//printf("%d\n",i);//8
	printf("%d\n",-i++);//-8,
	//printf("%d\n",i);//9
	printf("%d\n",-i--);//-9
	//printf("%d\n",i);//8
	return 0;
}
#endif

#if 0
/*eg3.17,自加运算分析,p60*/
/*可运行出结果,会有报错,解决报错需将p,q分行写即可*/
#if 1 
int main(void)
{	/*报错(Multiple unsequenced modifications to 'i'clang(-Wunsequenced))但可运行*/
	int i = 5,j = 5,p,q;
	p = (i++) + (i++) + (i++);//5+6+7 = 18
	q = (++j) + (++j) + (++j);//6+7+8 = 21
	printf("p=%d,q=%d,i=%d,j=%d\n",p,q,i,j);//18,21,7,8
	return 0;
}
#else
int main(void)
{	/*解决报错*/
	int i = 5,j = 5,p,q;
	p = i++;//5
	p = p + (i++);//5+6 = 11
	p = p + (i++);//11+7 =18
	q = ++j;//6
	q = q + (++j);//6+7 = 13
	q = q + (++j);//13+8 = 21
	printf("p=%d,q=%d,i=%d,j=%d\n",p,q,i,j);//18,21,7,8
	return 0;
}
#endif
#endif

#if 0
/*eg3.19,逗号运算符的使用,p62*/
int main(void)
{
	int a = 2,b = 4,c = 6,x,y;
	y = (x=a+b),c=(b+c);
	printf("y=%d,x=%d,c=%d",y,x,c);//6,6,10
	return 0;
}
#endif

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值