XJTU大计基第十周编程作业

1.
小明的加减法【用函数实现】

________________________________________
叛逆期的小明什么都喜欢反着做,连看数字也是如此(负号除外),比如:
小明会把1234它看成4321;把-1234看成-4321;把230看成032 (032=32);把-230看成-032(-032=-32)。
现在,小明做了一些a+b和a-b的题目(a, b为整数且不含前导0),如果给你这些题目正确的答案,你能猜出小明会做得到什么答案吗?
输入:
两个整数x,y(-1000000 < = x, y < =1000000), x表示a+b的正确答案,y表示a-b的正确答案。
输入保证合法,且不需考虑a或b是小数的情况。
输出:
输出两个整数s t,之间用一个空格分开,其中s表示小明将得到的a+b答案,t表示小明将得到的a-b答案。
________________________________________
样例输入:
20 6
样例输出:
38 24

#include<stdio.h>
int resum(int a);//先声明函数,后面再定义;
int main()
{
	int a, b, x, y, s, t;
	scanf_s("%d %d", &x, &y);
	a = resum((x + y) / 2);
	b = resum((x - y) / 2);
	s = a + b;
	t = a - b;
	printf("%d %d", s, t);
	return 0;
}
int resum(int a)
{
	int m;
	int o = 0, i = 1;
	if (a < 0)
	{
		a = -a;
		i = -1;
	}
	while (a >= 1)//o从0开始,逐个接受a中的数,实现翻转;
	{
		m = a % 10;
		a = a / 10;
		o = o * 10 + m;
	}
	a = i * (o + a);//保持符号不改变;
}

2.
递归问题

________________________________________
Ackermann函数ack(m,n)采用以下递归式定义:
ack(0,n)=n+1
ack(m,0)=ack(m-1,1)
ack(m,n)=ack(m-1,ack(m,n-1))
其中,m>0,n>0
编写一个计算此函数的递归函数.
测试用例:
如输入:
1,1
则输出:
3
________________________________________
样例输入:
3,2
样例输出:
29

#include<stdio.h>
int ack(int m, int n);
int main()
{
	int m, n, A;
	scanf_s("%d,%d", &m, &n);
	A = ack(m, n);
	printf("%d", A);
}

int ack(int m, int n)
{
	if (m == 0)
		return (n+1);//递归定义函数,m==0作为调节条件;
	else if (n == 0)
		return (ack(m - 1, 1));
	else
		return  (ack(m - 1, ack(m, n - 1)));
}

3.
分数序列求和【选做】

________________________________________
题目描述:
有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。
输入输出格式:
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)
样例:
6
10.0071
________________________________________
样例输入:
6
样例输出:
10.0071

#include<stdio.h>
int main()
{
	int n, i;
	float a=2,b=1,c;//这里的a b c 也都要是浮点数,否则在计算过程中数值会折损;
	float sum=0;
	scanf_s("%d", &n);
	for (i = 1; i <= n; i++)
	{
		sum = sum + a / b;
		c = b;
		b = a;
		a = c + a;
	}
	printf("%.4f", sum);//输出四位小数
	return 0;
}


4.
求单词的最大和最小

________________________________________
题目描述:
定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。
________________________________________
样例输入:
this
is
a
book
end
样例输出:
max:this
min:a

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{ 
	char word[5][10];//定义一个五行十列的数组,表示5个单词(10个字母以内);
	char min[10],max[10]; 
	int i; 
	for(i=0;i<5;i++) 
	{ 
		gets(word[i]);//用gets来赋值,可以无视空格;
	} 
	strcpy(min,word[0]);//word[0]就表示word的第一行,即第一个函数;
	strcpy(max,word[0]); 
	for(i=1;i<5;i++) 
	{
		if(strcmp(max,word[i])<=0)//用strcmp函数来比较(引用<string.h>文件),直接将两个单词按词典顺序比较,>则输出正数,<则输出负数,完全相同输出0;
		{ 
			strcpy(max,word[i]);//把word[i]赋给max时,不可以直接用=,必须用strcpy函数;
		} 
		else if(strcmp(min,word[i])>0)
		{ 
			strcpy(min,word[i]);
		}
	}
	printf("max:%s\nmin:%s\n",max,min);
	return 0; 
}

5.
编写一个求数组中最小值元素及该元素位置的函数

________________________________________
题目描述:
编写一个求数组中最小值元素及该元素位置的函数,并编写主函数调用。要求:由键盘输入10个数,并存放于整型数组中。
提示:需要定义含整型数组,最小元素值和该元素位置的结构体变量。以保证函数能同时返回最小元素值和该元素位置两个变量。

输入输出格式:
输入:用户输入的10个数
输出:第一个数字为数组中的最小元素值 第二个数字为该元素在数组中的下标位置(两个数用空格分开)
样例:
________________________________________
样例输入:
11 22 33 4 5 66 7 8 9 10
样例输出:
4 3

/*没有采用函数!!!
不太会定义新的数组*/😥
#include<stdio.h>
#include<string.h>
int main()
{
    int a[10];
    for (int i = 0; i < 10; i++)
        scanf_s("%d", &a[i]);
    int min = a[0];
    int num = 0;
    for (int i = 1; i < 10; i++)
    {
        if (min >a[i])
        {
            min = a[i];
            num = i;
        }
    }
    printf("%d %d", min, num+1);
    return 0;
}

6.
编写函数实现数字逆序排列

________________________________________
编写函数,函数原型如下:
void fun(int n,char res[]);
函数功能是将整数n的各位数字逆序排列,存放到res字符数组中。
例如整数1035,逆序后为5301
程序测试举例,如输入:
9680200
则输出:
0020869

________________________________________
样例输入:
123456
样例输出:
654321

#include<stdio.h>
void fun(int n, char res[]);//先声明fun函数,后面再进行定义;
int main()
{
	int n;
	char res[10] = "";
	scanf_s("%d", &n);
	fun(n,res);
	printf("%s", res);//可以一次性打印
	return 0;
}
void fun(int n, char res[])
{
	for (int i = 0; i < 10; i++)
	{
		if (n/10== 0)//当n除以10等于0时,说明n此时是个位数,这个个位数还需要被res[i]接收;
		{
			res[i] = n+'0';//res[i]是字符串,而n是整数,采用+'0',使左右形式一致;
			break;
		}
		else
		{
			res[i] = n % 10+'0';
			n = n / 10;
		}
	}
}

7.
编写进制转换函数
________________________________________

编写进制转换函数,函数原型如下:
void dtoboh(int n,int t,char res[]);
功能是将十进制整数n(n>=0)转换为t进制数(即2、8及16进制),结果存放在res字符数组中。
并编写测试用的主函数。
如输入:
248,2
则输出:
11111000

如输入:
248,8
则输出:
370

如输入:
248,16
则输出:
F8
________________________________________
样例输入:
2018,2
样例输出:
11111100010

#include<stdio.h>
#include<string.h>
void dtoboh(int n, int t, char res[]);
int main()
{
	int n, t,m;
	char res[16] = "";
	scanf_s("%d,%d", &n, &t);
	dtoboh(n, t, res);
	m = strlen(res)-1;//这里要减去1,否则结尾处的一个空格会被打印在最前面(but why?);
	for(m;m>=0;m--)
		printf("%c",res[m]);
	return 0;
}
void dtoboh(int n, int t, char res[])
{
	int i;
	if (t <10)
	{
		for (i = 0;; i++)
		{
			if (n == 0)
			{
					break;
			}
			res[i] = n % t+'0';
			n = n / t;
		}
	}
	else
	{
		for (i = 0; ; i++, n = n / t)
		{
			if (n == 0)
			{
				break;
			}
			else if (n % t < 10)
				res[i] = n % t + '0';//res[i]是一个字符!
			else
				res[i] = n % t- 10+'A'; //对于16进制,这里的方法是:res[i]是一个字符,'A'-10表示将这个数字转换为16进制的字母表示;
		}
	}
}

Q:
1.第七题无论如何都有一个试例不能通过😭😭
2.第七题为什么总是会有一个空格挡在在前面?为什么对strlen减去一就可以省区呢?😨🙁
3.第五题如何用函数方式解决?为什么我在做的时候总是说:“形参和实参 2 的类型不同”,应该如何定义和使用一个新的数组?

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值