c语言基础学习(2)

文章详细介绍了C语言中循环结构(如while,do-while,for),以及在实际编程中的应用,包括猜数游戏、计算平均数、整数逆序和阶乘的求解。还讨论了循环嵌套、素数判断和求和问题,以及处理特殊情况如整数分解的方法。

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

一、循环(数一个数字它是几位数)

65f9abd149c84936b5e5a79bf2f35267.png

e6ee1ec1699c44a48382da00a6a10640.png

 14c6044cb5e74da1b01b2a454f3c9c56.jpeg

#include <stdio.h>
int main()
{
	int n=0;
	int number;
	scanf("%d",&number);
	n++;
	number/=10;
	while (number>0){
		n++;
		number/=10;
	}
	printf("%d",n);
	return 0;
}

31c9d3f549c7445e99ee777b7b79cd76.png

 如果没有外面的运算,结果会咋样呢?可以自己在纸上写上各个变量的值,随着程序往下走,而不断改变变量的值。一开始我写了几个数试了试都可以,然后我就以为这个程序比第一个更简单,但是忽略了0的存在(当然了题目说的是正整数不包含0,但是第一个式子更具有一般性)

118089f20af8400484f8ceeb9f3baa8c.png

4b4674f899274e188fff7b0dc126d596.png

如果把这个语句放在里面,那么对于0来说实现不了目的,当然题目说的是正整数不包含0,但是作为扩展来说的话,把这个式子放在外面更好。

 4a214e79c03d4e8bbfaae63cbfa58b21.png

也可以在里面加一个if的判断语句,对x=0这种情况单独拿出来。

二、do-while循环 

c768fe4478ba4d0d8f5de2a5575b5445.png

6e59e7b694e34f76becbe25db9b5232b.png

d015932f8de149d1b21e4d3131aaab58.png

三、猜数游戏 

8a463fc1bfe54ef1a0f8ddf780562554.png

6d6192a3fc1143c0a892815271752b15.png

 计算机要随机生成一个数,这个数需要一个变量来接收。

统计一共数了多少次也需要一个变量,并且这个变量的初始值是0。

然后用户需要输入一个变量,所以一共三个变量需要进行初始化。

edc0b5bbdd014714a2dd4569ad619227.png

 个人感觉do-while循环不太好用,完全可以转变为外面的几行代码加while循环,这样感觉更好理解,下面自己敲一下

#include <stdio.h>
int main(){
	srand(time(0));
	int number=rand()%100+1; //因为要生成1到100之间的数
	int count=0;
	int a=0;
	printf("请输入你要猜的数\n");
	scanf("%d",&a);
	while(a!=number){
		if(a>number){
			printf("你输入的大了");	
			count++;
			scanf("%d",&a);
		}else{
			printf("你输入的小了");
			count++;
			scanf("%d",&a);
		}
	if(a==number){
		if(count==0){
			printf("恭喜你第一次就猜对了");
		}else{
			printf("恭喜你第%d次猜对了",count+1);
		}	
	}		
	}
	return 0;
}

为啥我自己写的这么麻烦 ,而且count为啥要加一?

 四、算平均数 

dab1d60dd6574f51a01a5234b5646ae3.png

6763063aae6a4a4b8fc32e2919d644df.png

fd1131e0d44840179a0a8a23efe7f18a.png

#include <stdio.h>
int main()
{
	int count=0;
	int number;
	int sum=0;
	scanf("%d",&number);
	while(number!=-1){
		count++;
		sum+=number;
		scanf("%d",&number);
	}	
	printf("%f",sum*1.0/count);	
	return 0;
}

五、整数求逆 (不知道这个整数是几位数)

d3fd2e32b3b545c7ab71ec9017ae0c6f.png

第一步进行%10运算,先得到它最后一位的数字,然后再进行/10运算,去掉最后一位的数字。以此类推

57c72cf1e5cb424f9751097e178c3aee.png

2d748607dc074998bd0c32058da41e8c.png

#include <stdio.h>
int main()
{
	int x,a;
	int num=0;
	scanf("%d",&x);
	while(x>0){
		a=x%10;
		num=num*10+a;
		x/=10;	
	}
	printf("%d",num);
	return 0;
}

 第12行的意思是取出来给定整数的尾数

然后第14行的意思是把尾数向前进一位,并且加上新的尾数(比如把8变成80,然后再加某个数)

第16行的意思是把取出来的尾数去掉,从而进入下一步循环。

但是对于700这种以0结尾的数,最后的输出结果会是7,而不是007,这是因为第14行,0*10之后结果仍然0。

那么我们怎么输出007呢?只需要把700进行倒序,然后挨个printf(),同时注意在printf()里面不要加换行符。 (第9和14行没用,不用看)

3e69cabd53e846d7a8ad9f7074a9cb20.png

#include <stdio.h>
int main()
{
	int x,a;
	scanf("%d",&x);
	while(x>0){
		a=x%10;
		printf("%d",a);
		x/=10;	
	}
	return 0;
}

六、for循环求阶乘 

 i等于1是初始条件(也可以令i不等于外面初始化所规定的数值,对i进行重新赋值),i<=n是循环继续的条件,i++是每一轮循环要进行的事

自己敲一下(困死了,中午觉着早上起的早就没睡觉,后悔了,现在一直打哈欠,真困死了。)

第一次写的,写错了(前后差距在第六行),忘记对i进行初始化了,以为在括号里写了i=1就不用初始化了。

#include <stdio.h>
int main()
{	
	int n;
	int fact=1;
	scanf("%d",&n);  
	for(i=1;i<=n;i++){
		fact*=i;
	}
	printf("%d",fact);
	return 0;
}
#include <stdio.h>
int main()
{	
	int n;
	int fact=1;
	int i=1;
	scanf("%d",&n);  
	for(i=1;i<=n;i++){
		fact*=i;
	}
	printf("%d",fact);
	return 0;
}

或者这样也行,因为i只在循环里面用到了,在循环外面没有用到,所以我们直接把关于i的初始化语句放到for循环的括号里面就可以了 

但是弄完发现报错了

因为这样写只能在C99里面用。

 我们发现上面所写的代码实际上执行为1*1*2*3*.........,所以实际上多进行了一步1*1,所以要考虑怎么简化掉那一步

#include <stdio.h>
int main()
{
	int n;
	int i=2; //这里定义i等于1也可以,因为for循环里面对i进行重新赋值了 
	int fact=1;
	scanf("%d",&n);
	for(i=2;i<=n;i++){
		fact*=i;
	}
	printf("%d",fact);
	return 0;
}

只需要将i的初始值从1变成2即可,即使输入的n等于1,导致n不会进入for循环,但是最后的结果仍然是1。

#include <stdio.h>
int main()
{
	int n;
	int i; 
	int fact=1;
	scanf("%d",&n);
	for(i=n;i>1;i--){
		fact*=i;
	}
	printf("%d",fact);
	return 0;
}

这样写也行,就是把for循环语句里面的i=n省略了,直接对n的值进行递减

至于为什么前面初始化的时候还要引入i这个变量,是因为n通过for循环之后,n的值已经变成了1,printf()里面的内容将会是1!=什么什么,而不是n!=什么什么

#include <stdio.h>
int main()
{
	int n;
	int i=n; 
	int fact=1;
	scanf("%d",&n);
	for(;n>1;n--){
		fact*=n;
	}
	printf("%d",fact);
	return 0;
}

 注意for循环括号里面的语句,即使第一句不需要再写了,但是;仍然不能省略

或者写成这样

for(n;n>1;n--){


七、for循环和while循环的选择  

 但是注意for()里面的表达式可以省略,但是不能省略。

 八、如何利用for或者while循环判断一个数是不是素数?

1不是素数  

我们只需判断一个数能不能被除了1和他本身以外的数整除即可。所以可以一个个遍历这些数(从2到x-1)

或者下面这种做法,但是这种做法有一个缺点就是会判断为1也是素数,所以我们可以在最后面再加一句, 

九、循环的嵌套 

 现在考虑一下怎么输出前五十个素数?

或者这样也可以:

如果我们想要让他在找到一个结果之后就直接跳出循环,那么我们应该怎么做呢?

十、前n项求和 

注意必须是1.0/i,因为如果是1/i的话,那么无论n等于几,ret的值将始终为1,因为俩整数相除结果一定为整数,并且由于i是大于等于1的,所以结论易知。

并且由于是1.0/i,那么ret一定就不是int类型了,所以初始化时应该是  double ret=0.0 ;

但是这个为啥不对啊?

#include <stdio.h>
int main()
{
	double sum=0.0;
	int n;
	scanf("%d",&n);
	for(;n>0;n--){
		sum+=1.0/n;
	}
	printf("%d",sum);
}

十一、整数分解(就听了第一个方法,后面的都没听)

我们看目录中的大标题五 ,这个题目和那个题目有点类似。

我们只需要先对给定的整数进行逆序输出,然后再从尾到头把数字拿出来就行了,很简单。

下面的第16行之所以要让x=t,是因为此时已经跳出了循环,所以x=0,要对x进行重新赋值(通过第15行可以看出来)

注意第19行printf(“%d”,d)的括号里面%d后面是没有空格的。如果有空格的话会令5后面多一个空格。

第20行和第21行是想要去掉1 3 4 2 5中5后面的空格。

或者也可以不重新赋值,直接把t拿过来用也是可以的。

f 

这个我们发现当输入700的时候,输出的是7,这是由于结尾0的存在所导致的,所以一开始我想到了用这种方法(之前在标题五提到过的) 

#include <stdio.h>
int main()
{
	int x,d;
	scanf("%d",&x);
	int t=0;
	while(x>0){
		d=x%10;
		printf("%d",d);//输出x的倒序数字 
		x/10;
	}
	while
	return 0;
}

但是我一开始想当然的以为可以这么做,但是敲着敲着就发现这种方法根本行不通,因为我虽然能够解决前导0的问题,但是输出的这个数字没法用变量去接收,因为我是把一个整数分解成一个个数字来输出的,所以我没法用一个变量来接收倒序输出后的整数,也就没法进行下一步运算。

十二、c语言有哪些基础数据类型,sizeof可以用来做什么?

 在定义变量的值的时候必须要指明变量的类型,不能直接赋值

 

c语言一共有这五种数据类型,其中逻辑类型也可以归结到整数类型里面去。

 

 不同的数据类型,所占用的内存大小是不同的

 sizeof()给出某个类型或者变量在内存中所占据的字节数,如果sizeo()括号里面的是某个变量的值而不是数据类型的话,它会判断这个值是属于哪一种数据类型,然后根据这一数据类型所占的字节数输出结果。

不要在sizeof的括号里做运算(如果做了运算并不会报错,做不做运算都不会改变变量的值,但是会影响sizeof的结果,sizeof并不会真的去做运算) 

 a++之后,a仍然是整数,所以sizeof的结果不变。同时由于a++是在sizeof()括号里面做的运算,所以a的值并不会改变,仍然是6

 a+1.0之后,数据类型发生了变化,变成了double,所以sizeof()的结果发生了改变,但是变量的值是不变的。

十三、整数类型有多少种

double和float,它们是什么,如何输入输出?

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力学习的小白。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值