BFU 2020级程序设计基础 实验题整理

目录

实验一

实验二

实验三

实验四


实验一:

 

1.编写程序,实现如下功能:求之值。

思考:注意分数之前的符号,什么时候为正什么时候为负?

2.编写程序,实现如下功能:求出200到300之间的数,且满足条件:它们三个数字之积为42,三个数字之和为12。

思考:如何求出一个三位数的百位、十位和个位?

 

思路:

1.该程序通过for循环即可实现,其关键在于奇加偶减,求和输出即可。

#include<stdio.h>

int main()
{
	double dsum = 0.; // 用于存储最终答案的数值
	int i;

	for(i = 1; i <= 100; i++) // 通过for循环实现对1~100的操作
	{
		if (1 == i % 2)// int强制类型转换 以满足取模的参数要求 
		{	// 通过取模操作判断当前的i是奇还是偶,若奇则加
			dsum += 1. / i;
		}
		else
		{	// 若偶则减
			dsum -= 1. / i;
		}
	}

	printf("ans = %f", dsum);

	return 0;
}

 

2.该程序通过对数字的拆解,并分别进行求积及求和的操作,之后判断结果是否与题目要求相符合即可。

#include<stdio.h>

int main()
{
	int i;
	int cnt = 0; // 对答案进行编码并计数

	for (i = 200; i <= 300; i++)
	{
		int a = i % 10; // 取出个位数字
		int b = (i / 10) % 10; // 取出十位数字
		int c = i / 100; // 取出百位数字

		if ( (42 == a * b * c) && (12 == a + b + c) ) 
		{ // 如若满足题述条件
			printf("ans%d = %d\n", ++cnt, i);
		}
	}

	return 0;
}

 

 

实验二:

编写程序,实现如下任务:从键盘输入若干个整数,输入整数的个数小于100,其值在0~100范围内,用-1作为输入结束的标志。统计每个整数的个数并从大到小排序,输出排序后的结果。

提示:定义两个数组,一个用来存放输入整数,另一个用来存放统计信息。

 

思路:

该程序开设了一个acnt数组,用于记录索引所对应的数字的出现次数,首先通过获取用户输入,来初始化acnt数组。

代码从17行开始是实现按照出现次数从大到小输出的功能,其中i用来做出现次数的比对,其变化从大到小,以实现按出现次数的降序输出,j用来遍历数组,判断每一个数出现的次数是否与 比对变量i 相同 。通过该过程即可实现要求的功能。

#include<stdio.h>

int acnt[101];// 该数组用于记录 索引所对应的数字 的出现次数

int main()
{
	while(1)
	{ // 通过while循环进行对数据的持续输入
		int t;
		scanf("%d", &t);
		if (-1 == t) break; // 如果输入是-1则跳出循环 即停止输入
		acnt[t]++; // 对数字t的出现次数进行+1
	}

	int i, j;

	for (i = 100; i > 0; i--)
	{ // i用来做出现次数的比对,从大到小,以实现按次数的降序输出
		for (j = 100; j >= 0 ; j--)
		{ // j用来遍历数组,判断每一个数出现的次数是否与 比对变量i 相同
			if(acnt[j] == i) // 数字j出现的次数为i
			{
				printf("出现:%d次的是数字:%d\n", i, j);
			}
		}
	}


	return 0;
}

 

实验三:

编写函数,从标准输入中读取字符,直到遇到EOF。程序要输出每个字符是否是字母。如果是,还要求输出该字母在字母表中的数值位置。

 

思路:

该程序通过在主函数中读取字符,将字符作为实参传入CheckAlpha函数中,通过该函数的返回值,可以得知当前字符是否为字母,及其在字母表中的顺序。

CheckAlpha函数的实现方法为:通过判断该字符的ascii值是否介于字母a/A 与 z/Z之间,若是,则与a/A做差加1 即为字母表顺序。若非字母或为换行,则返回相应的标识数值,用以main函数中的处理操作。

#include<stdio.h>

int CheckAlpha (char a)
{
	if ( a >= 'A' && a <= 'Z')
	{ // 返回字母所在字母表中的位置
		return a - 'A' + 1;
	}
	if ( a >= 'a' && a <= 'z')
	{ // 返回字母所在字母表中的位置
		return a - 'a' + 1;
	}
	if (10 == a) 
	{ // 如果是换行符(ascii对应10)
		return -1;
	}
	else 
	{ // 如果是非字母
		return 0;
	}
}

int main()
{
	char t;// 用于临时存储当前输入的字符

	while ((t = getchar()) != EOF)
	{
		int re = CheckAlpha(t); // re用于存储check函数的返回值,以减少重复调用

		if (0 == re)
		{ // 若非字母
			printf("该字符不是字母\n");
		}
		else if (-1 == re)
		{ // 若为回车键 则不进行操作
			continue;
		}
		else
		{ // 若为字母
			printf("该字符是字母,其位置是%d\n", re);
		}
	}

	return 0;
}

 

实验四:

定义函数 void  mystrcat(char *s1,char *s2,char *new_s) 实现对两个字符串进行交叉连接。

例如:有两个字符串“abcd”、“1234”,交叉连接后结果为“a4b3c2d1”。

 

思路:
首先对该程序的核心函数进行需求分析,其需要将字符串s1与字符串s2进行交叉连接,并将交叉连接的结果存于new_s字符串中,故根据数学分析,可得出表达通项,并根据该通项公式设计for循环即可得出答案,参数的传递则通过指针实现。

但是,在考虑特殊的情况下(s1,s2长度不一样)需要将余项接在字符串后

 

全部代码:

#include<stdio.h>
#include<string.h>
#define LEN 100

void mystrcat (char *s1, char *s2, char *new_s);

int main()
{
	char a[LEN], b[LEN], c[LEN * 2];
	
	printf("pleas input two strings, separated by ENTER\n");
	scanf("%s", a);
	scanf("%s", b);


	mystrcat(a, b, c); // 进行处理 

	printf("After merged: %s\n", c);

	return 0;
}

void mystrcat (char *s1, char *s2, char *new_s)
{
	int l1=strlen(s1),l2=strlen(s2), i;
	
	if(l1 == l2)
	{
		for(i = 0; i < l1; i++)
		{
			new_s[2 * i] = s1[i];
			new_s[2 * i + 1] = s2[l2 - i - 1];
		}
		new_s[l1 + l2]= '\0'; 
	}
	
	if (l1 > l2)
	{
		for (i = 0; i < l2; i++)
		{ // 把能正常弄得先弄上 
			new_s[2 * i] = s1[i];
			new_s[2 * i + 1] = s2[l2 - i - 1];
		} 
		// now i = l2  
		// new should start from 
		for (; i < l1; i++)
		{
			// 根据算法推导可知 从l2 + i 开始记录新数 
			new_s[l2 + i] = s1[i];
		}
		new_s[l1 + l2]= '\0'; 
		
	}
	
	if (l1 < l2)
	{
		for (i = 0; i < l1; i++)
		{ // 把能正常弄得先弄上 
			new_s[2 * i] = s1[i];
			new_s[2 * i + 1] = s2[l2 - i - 1];
		} 
		// now i = l1 
		// new should start from 
		for (; i < l2; i++)
		{
			// 根据算法推导可知 从l2 + i 开始记录新数 
			new_s[l1 + i] = s2[l2 - i - 1];
		}
		new_s[l1 + l2]= '\0'; 
		
	}
}

 

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值