C基础第五天

第一题

有一分数序列:2/1 3/2 5/3 8/5 13/8 21/13...求出这个数列的前20项之和。

解析:后一个的分子是前一个的分子+分母,分母是上一个的分子

#include <stdio.h>
int main(int argc, const char *argv[])
{  
	int fenmu=1;
	int fenzi=2;
	float sum=0;
	int a;
	for(int i=1;i<=20;i++){
		printf("%d/%d\n",fenzi,fenmu);
		sum=sum+(fenzi/fenmu);
		a=fenmu;//本次的分母
		fenmu=fenzi;//下一次的分母=本次分子
		fenzi=a+fenzi;//下一次的分子=本次分母+本次分子
	}
	printf("前二十项的和为%g\n",sum);
	return 0;
}

运行结果:

第二题

有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

解析:使用多层循环,每层循环进行值的判断

每一层循环为一位数字,每层循环的值不能相同

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int sum=0;
	for(int i=1;i<=4;i++){ //百位
		for(int j=1;j<=4;j++){ //十位
			for(int k=1;k<=4;k++){ //个位
					if(i!=j&&j!=k&&k!=i){
						printf("%d%d%d  ",i,j,k);
						sum++;
				}
			}
		}
	}
	printf("\n");
	printf("共%d个数\n",sum);
	return 0;
}

运行结果:

第三题

使用嵌套循环产生下列图案,要求用for嵌套循环

F
_FE

__FED

___FEDC

____FEDCB

_____FEDCBA

解析:使用双重循环嵌套

外层控制行数,内层有两个循环,一个控制横线,一个控制字母

字母使用ASCII码字母表来控制(A~F:65~70)

#include <stdio.h>
int main(int argc, const char *argv[])
{
	for(int i=1;i<=6;i++){ //控制行数
		for(int j=0;j<i-1;j++){ //控制横线
			printf("_");
		}
		for(int k=1;k<=i;k++){ //控制打印出的字母个数
			printf("%c",71-k); //控制打印的内容
		}
		printf("\n");
	}
	return 0;
}

运行结果:

第四题

打印以下图形

*

***

*****

*******

解析:使用双重for循环

每一行打印的个数都是奇数(2n-1)

#include <stdio.h>
int main(int argc, const char *argv[])
{
	for(int i=1;i<=4;i++){
		for(int j=1;j<=(2*i)-1;j++){
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

运行结果:

第五题

打印以下图形。在以下图形的基础上修改,要求从终端输入金字塔层数,打印出对应层数金字塔

   *

  ***

 *****

*******

解析:使用双重 for 循环

共 data 行,空格 = 总行数 - 当前行数

每行打印的个数是奇数,为(2n-1)

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int data;
	printf("请输入需要打印的金字塔层数\n");
	scanf("%d",&data);
	for(int i=1;i<=data;i++){
		for(int j=0;j<=data-i;j++){
			printf(" ");
		}
		for(int k=1;k<=(2*i)-1;k++){
			printf("*");
		}
		printf("\n");
	}
	return 0;
}

运行结果:

第六题(附加题)

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

若翻转后超出取值范围,则输出0即可。

输入: 123 输出 321

输入: -123 输出-321

解析:32位有符号的整数,为int类型

运行结果:

第七题

定义一个整型数组,容量为5。要求从终端获取5个整形数,存储到该数组中。然后将数组的整型数据输出到终端上

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int a[5];
	printf("请输入5个整型数字\n");
	for(int i=0;i<5;i++){
		int data;
		scanf("%d",&a[i]);
	}
	printf("生成的数组为:\n");
	for(int i=0;i<5;i++){
		printf("%d ",a[i]);
	}
	printf("\n");
	return 0;
}

运行结果:

第八题

从终端输入5个数据,然后再输入一个数据n,判断n是否在5个数据中

解析:基于第七题然后循环中用 if 判断

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int a[5];
	printf("请输入5个整型数字\n");
	for(int i=0;i<5;i++){
		int data;
		scanf("%d",&a[i]);
	}
	printf("生成的数组为:\n");
	for(int i=0;i<5;i++){
		printf("%d ",a[i]);
	}
	printf("\n");

	int data;
	int flag=0;
	printf("输入一个数判断是否在数组内已存在\n");
	scanf("%d",&data);
	for(int i=0;i<5;i++){
		if(data==a[i]){
			flag=1;
            break;
		}	
	}
	if(flag){
		printf("%d已存在\n",data);
	}else{
		printf("%d不存在\n",data);
	}
	printf("\n");
	return 0;
}

运行结果:

第九题

输入5个正整数,求5个数据中的最大值,及5个数据的和

解析:使用 for 循环生成数组 ,然后使用 for 循环完成累加,寻找最大值,遍历

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int a[5];
	for(int i=0;i<5;i++){
		scanf("%d",&a[i]);
	}
	
	printf("形成的数组是:");
	int max=a[0];
	int temp;
	int sum=0;
	for(int i=0;i<5;i++){
		if(max<a[i]){
			max=a[i];
		}
		sum=sum+a[i];
		printf("%d ",a[i]);
	}
	printf("\n");
	printf("最大值是%d\n",max);
	printf("5个数据相加等于:%d\n",sum);

	return 0;
}

运行结果:

第十题

求斐波那契数列的第20项......,

n=1和n=2的时候都是输出1、1、2、3、5、8、13、21、34、公式: f(n) = f(n-1)+f(n-2);

例如第20项,6765

解析:需要将前两个数据存起来,用于下一次循环

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int First=1; //前一项
	int Two=1; //前两项
	int num;
	for(int i=0;i<20;i++){
		if(i==0||i==1){
			num=1;
		}else{
			num=First+Two;
			Two=First; //前两项=前一项
			First=num; //前一项=当前数
		}
		printf("第%d项:%d\n",i+1,num);
	}
	return 0;
}

运行结果:

第十一题

先从终端输入一串字符以"n"结尾,然后将这一串字符倒叙输出,同时求出这一串字符的空格个数。

解析:定义一个 char 数组,判断输入 “\n”(回车) 的时候结束输入

输入时累计数组长度,用于后面遍历

将数组遍历翻转输出,同时判断其中是否有 “ ” ,并累加空格个数,输出

#include <stdio.h>
int main(int argc, const char *argv[])
{
	char a[100];
	int length;
	for(int i=0;i<100;i++){
		scanf("%c",&a[i]);
		length++;
		printf("%c",a[i]);

		if(a[i]=='\n'){
			printf("输入完毕\n");
			break;
		}
	}


	int sum=0;
	printf("倒序输出:\n");
	for(int i=0;i<=length-1;i++){
		printf("%c",a[length-1-i]);
		if(' '==a[i]){
			sum++;
		}
	}
	printf("\n");
	printf("空格有%d个\n",sum);

	return 0;
}

运行结果:

第十二题

从终端输入一串字符以"n'结尾,求出小写字母的个数,大写字母的个数,数字的个数

解析:小写字母a~z(97~122),大写字母A~Z(65~90),数字 0~9(48~57)

参考第十一题的做法,循环找出小写字母的个数,大写字母的个数,数字的个数

#include <stdio.h>
int main(int argc, const char *argv[])
{
	char a[100];
	int length=0;
	for(int i=0;i<100;i++){
		scanf("%c",&a[i]);
		length++; //对数组长度计算

		if(a[i]=='n'){
			printf("输入完毕\n");
			break;
		}
	}
	printf("length=%d\n",length);


	int sumNum=0;
	int sumA=0;
	int suma=0;
	for(int i=0;i<=length-1;i++){

		if(a[i]<=122&&a[i]>=97){ //
			suma++;
		}
		if(a[i]<=90&&a[i]>=65){ //
			sumA++;
		}
		if(a[i]<=57&&a[i]>=48){ //
			sumNum++;
		}
	}

	printf("大写字母有%d个\n",sumA);
	printf("小写字母有%d个\n",suma);
	printf("数字有%d个\n",sumNum);

	return 0;
}

 运行结果:

第十三题

输入5个正整数,求5个数据中的第二大的值

解析:先求出最大值,挑出最大值,再找出第二大值

#include <stdio.h>
int main(int argc, const char *argv[])
{
	int a[5];
	printf("输入5个正整数:\n");
	for(int i=0;i<5;i++){
		scanf("%d",&a[i]);
	}
	int max=a[0];
	int sec=a[0];
	int maxIndx;
	for(int i=0;i<5;i++){  //找出最大值
		if(max<a[i]){
			max=a[i];
			maxIndx=i;
		}
	}
	for(int i=0;i<5;i++){ // 找出第二大的值
		if(sec<a[i]&&i!=maxIndx){ //最大的但是脚标不等于最大值的脚标
			sec=a[i];
	    }
	}
	printf("第二大的值为:%d\n",sec);

	return 0;
}

运行结果:

第十四题

从终端输入一串字符以 ‘\n’ 结尾,求出小写字母个数分别多少个?

例如输入: aabcabd换行,得到a有多少个,b有多少个,c有多少个,d有多少个

解析:小写字母a~z(97~122)

用一个数组来表示a~z,每个字母的数量

#include <stdio.h>
int main(int argc, const char *argv[])
{
	char a[100];
	int letter[26]={0}; //必须初始化值,不然没有输入的字母就会变成随机数
	for(int i=0;i<100;i++){
		scanf("%c",&a[i]);
		if('\n'==a[i]){
			break;
		}
	}

	int asum=0;
	int j=0; //记录26个字母的顺序
	for(int i=0;a[i]!='\n';i++){
		if(a[i]<=122&&a[i]>=97){
			asum++;
			j=a[i]-97; //代表第几个字母 例如:a=97-97=0 letter[0]
			letter[j]++; //第j个字母的累加
		}
	}
	for(int k=0;k<26;k++){
		printf("字母%c有%d个\n",97+k,letter[k]);
	}
	printf("有%d个字母\n",asum);
	return 0;
}

运行结果:

第十五题(附加题)

从终端输入一串字符以"n'结尾,实现一个 atoi 函数,使其能将获取到的一串字符转换成整数。要求如下

1) 丢弃开头的空格字符,直到寻找到第一个非空格字符为止

2)如果第一个字符为+-,则将改符号与之后面的数字字符组合起来,形成一个有符号的整数

3)假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。
4)该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。

5)假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时则你的函数不需要进行转换,即无法进行有效转换

6)在任何情况下,若函数不能进行有效的转换时,请返回 0例子:
输出 42输入“42”
输出-42输入“ -42”
输入“1234 abcd”输出 1234
输入“abcd 1234”输出 返回0
输入“-9999999999”输出-2147483648      //超出int的范围

解析:

运行:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值