【C语言】试题

        目录

#数组试题

#指针试题


#数组试题

①统计单词的平均长度

输入:若干个单词,每个单词的前后都有若干个空格隔开

输出:单词的平均长度,保留到小数点后两位

解题思路如下:

第一步:解决空格+单词共同输入的问题;既然每个单词都可能前后有若干空格如何判断输入停止?

用gets()进行输入即可,gets()表示的是一行的输入,遇到回车就结束

第二步:解决计算单词个数问题;用多重判断条件就好了,前面是空格后面不是空格单词数+1

int main() {
	char arr[1000] = { 0 };
	int i = 0;
	gets(arr);
	int num = 0;
	float ret = 0.0;
	float c = 0.0;
	while (arr[i] != 0)
	{
		if (i != 0) 
		{
			if (arr[i] == ' '){}
			else if (arr[i] != ' ' && arr[i - 1] == ' ')
			{
				num++;
				c++;
			}
			else 
				c++;
		}
		else 
		{
			if (arr[i] == ' ') {}
			else 
			{
				c++;
				num++;
			}
		}
		i++;
	}
	ret = c / num;
	printf("%.2f", ret);
}

出现的问题:

Ⅰ:若gets()输入,因为把数组元素全部初始化为0了,是否就无法用arr[i] = '\0'来作为终止判断条件?

答:有可能,所以就直接arr[i] = 0作条件。

②绝对值排序

输入:若干个整数

输出:按照绝对值降序输出整数,每个整数输出后都换行

解题思路:

第一步:解决多个整数输入进数组的问题;在未知输入数字的个数条件下,如何实现想输入多少个数就多少个?

用EOF实现。

第二步:比较绝对值的大小

第三步:排序 -> 冒泡

第四步:按顺序打印

int fab(int n)
{
	int ret = 0;
	if (n < 0)
		return (0 - n);
	return n;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int arr[1000] = { 0 };
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		scanf("%d", &arr[i]);
	}
	int tmp = 0;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n - 1 - i; j++)
		{
			if (fab(arr[j]) > fab(arr[j + 1]))
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
	for (i = n - 1; i >= 0; i--)
	{
		printf("%d\n", arr[i]);
	}
	return 0;
}

出现的问题:

Ⅰ:math.h库函数无法使用

答:自己写一个绝对值函数就好

③13号星期几

1900年1月1日是星期一,判断n年后的每个月13号是周一到周日周日的次数都有多少

输入:整数n,表示经过了n年  // 如1 

输出:七个整数,表示是周一...周日的次数  //如1 3 1 2 2 2 4

解题思路:

第一步:判断是否是闰年 ,闰年二月多一天 //写一个闰年judge函数 

第二步:判断是哪个月  // 提前设定好每个月的天数

第三步:判断当月的13号是星期几  //当月天数==13时候,总天数%7看看是多少来判断星期几

int leapYear(int n)
{
	n += 1900;
	if (n % 400 == 0 ||( n % 4 == 0 && n % 100 != 0))
		return 1;
	return 0;
}
int main()
{
	int n = 0;
	scanf("%d", &n);
	int month[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
	int cnt[7] = { 0 };
	int i = 0;
	int monthday = 0;
	int day = 6;
	int year = 0;

	if (n >= 1 && n <= 100)
	{
		for (year = 0; year < n; year++)
		{
			month[1] += leapYear(n);
			for (i = 0; i < 12; i++)
			{
				for (monthday = 0; monthday <= month[i]; monthday++)
				{
					monthday = 13;
					day += 13;
					cnt[day % 7]++;
					monthday += (month[i] - 13);
					day += (month[i] - 13);
				}
			}
			month[1] = 28;
		}
	}
	i = 0;
	for (i = 0; i < 7; i++)
	{
		if (i < 6)
			printf("%d ", cnt[i]);
		else
			printf("%d", cnt[i]);
	}
	return 0;
}

④字符串的最小周期

输入:一个字符串

输出:字符串的最小周期

解题步骤:

#指针试题

①在数组中按顺序插入一个数字

输入:一串整型数字 / 要插入的数字

输出:插入数字后顺序排序的字符串

解题步骤:

第一步:对已有的数字进行排序  //冒泡

第二步:看看插入的数字可以拍到哪个指针位置

第三步:把位置交给插入的数字,其他数字按位后移

int main()
{
	int arr[11] = { 0 };
	int tmp = 0, i = 0, j = 0;
	int flg = 1;
	int m = 0;
	int* p = arr;
//数据输入
	for (i = 0; i < 10; i++)
	{
		scanf("%d", &arr[i]);
	}
	scanf("%d", &m);
//冒泡排序
	for (i = 0; i < 10; i++)
	{	
		flg = 1;
		for (j = 0; j < 9 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				flg = 0;
			}
		}
		if (flg)
			break;
	}
//查找合适的位置	
	i = 0;
	while (i < 11)
	{
		if (m > *p)
			p++;
		else
			break;
		i++;
	}
//整体后移
	for (j = 10; j > (p - arr); j--)
	{
		arr[j] = arr[j - 1];
	}
//输出
	for (i = 0; i < 11; i++)
	{
		printf("%d", arr[i]);
		if (i != 10)
			printf(" ");
		else
			printf("\n");
	}

	return 0;
}

出现的问题:

Ⅰ:平时习惯了用tmp来进行数组的数据交换,后移的突然就不会了

答:倒序赋值,从后往前,避免了中间值的产生

②指针与一维动态数组B

        定义指向float类型的指针变量ptr,并根据输入的数组元素个数N从堆中申请内存,使得该动态分配的内存可以存储N个float类型的元素;然后使用如下公式给数组各个元素赋值:

        x[i] = 100 * cos(i * 0.01)
        数组元素赋值后,计算并输出数组元素之和。小数点后必须保留2位有效数字(四舍五入),不足补零。另外,请不要忘记释放该内存

输入:一个整数N(1~10000)

输出:数组元素之和,保留两位小数点

解题步骤:

第一步:

第二步:

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值