函数的基本知识:
在C语言中,函数是执行特定任务的一段代码块。它允许你模块化代码,提高代码的可读性和可重用性。以下是C语言中函数的基本知识:
函数定义:
return_type function_name(parameter list) {
body of the function
}
* `return_type`:函数返回的数据类型。如果函数不返回任何值,则使用`void`。
* `function_name`:函数的名称。
* `parameter list`:函数的参数列表,用逗号分隔。如果函数不接受任何参数,则使用`void`。
* `body of the function`:函数的主体,包含执行特定任务的代码。
函数声明:
在调用函数之前,你需要声明它。声明告诉编译器函数的名称、返回类型和参数。
return_type function_name(parameter list);
函数调用:
使用函数名和参数列表来调用函数。
return_type result = function_name(parameter_list);
函数参数:
- 形式参数(或简称形参):在函数定义中声明的参数。
- 实际参数(或简称实参):在函数调用时传递的参数。
函数返回值:
函数可以返回一个值,该值可以是任何数据类型。如果函数声明为void
,则不返回任何值。
函数原型:
函数原型是函数的声明,它告诉编译器函数的名称、返回类型和参数。这有助于编译器在编译时检查函数调用的正确性。
函数作用域:
函数的作用域从函数定义的开始到结束。在函数内部定义的变量具有局部作用域,这意味着它们只能在函数内部访问。
递归函数:
递归函数是调用自身的函数。递归函数通常用于解决可以分解为更小子问题的问题。
内联函数:
内联函数是一种优化技术,通过在调用点插入函数体的复制品来避免函数调用的开销。内联函数通过inline
关键字声明。
函数重载:
虽然C语言本身不支持函数重载(即多个函数具有相同的名称但参数列表不同),但你可以通过不同的函数名或使用不同的参数类型来实现类似的功能。
6-1 不一样的A-B
参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法运算。(当然,大家都知道集合的定义,就是同一个集合中不会有两个相同的元素,这里还是提醒大家一下)只需要完成cn函数,呵呵,很简单吧?
输入格式:
每组输入数据占1行,每行数据的开始是2个整数n(0<n<=100)和m(0<m<=100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B. 每个元素为不超出int范围的整数,元素之间有一个空格隔开.
输出格式:
针对每组数据输出一行数据,表示A-B的结果,如果结果为空集合,则输出“NULL”,否则从小到大输出结果,为了简化问题,每个元素后面跟一个空格.
输入样例:
在这里给出一组输入。例如:
3 3 1 2 3 1 4 7
输出样例:
在这里给出相应的输出。例如:
2 3
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
void cn(int n,int m);
int main()
{
int n,m;
scanf("%d%d",&n,&m);
cn(n,m);
return 0;
}
/* 请在这里填写答案 */
void cn(int n,int m){
int i,j,a[100],b[100];
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<m;i++){
scanf("%d",&b[i]);
}
int c[100],k=0;
int flag=0;
//定义数组c[]用于存放数组a中存在b中不存在的元素,
//k用于记录数组c的当前长度flag 用于标记是否找到元素。
for(i=0;i<n;i++){
for(j=0;j<m;j++){ //遍历数组 b,查找与当前 a[i] 相同的元素
if(a[i]==b[j]){
flag=0;
break; //如果找到相同元素,设置 flag 为 0 并跳出内层循环
}
else{
flag=1; //否则,设置 flag 为 1
}
}
if(flag){
c[k]=a[i];
k++;
}
//如果循环结束后flag仍为1,说明a[i]在b中没有找到相同元素
//将其添加到c数组中,并增加k的值
}
if(k>0){
for(i=0;i<k;i++){
for(j=i+1;j<k;j++){
if(c[i]>c[j]){
int temp=c[i];
c[i]=c[j];
c[j]=temp;
}
}
}
for(i=0;i<k;i++){
printf("%d ",c[i]);
}
}
else{ //如果k等于0说明数组a和b完全相同,打印"NULL"
printf("NULL");
}
}
6-2 不一样的斐波那契数列
有另一种斐波那契数列:F(0)=7,F(1)=11,F(n)=F(n-1)+F(n-2) (n>=2)
用递归求第n项。
输入格式:
输入一个正整数n(1<=n<=20)
输出格式:
输出斐波那契数列的第n项
输入样例:
在这里给出一组输入。例如:
2
输出样例:
在这里给出相应的输出。例如:
18
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
int cn(int n);
int main()
{
int n;
long long c;
while(~scanf("%d",&n))
{
c=cn(n);
printf("%lld\n",c);
}
return 0;
}
/* 请在这里填写答案 */
int cn(int n){
int a[20]={0};
int i;
a[0]=7,a[1]=11;
for(i=2;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
return a[n];
}
6-3 反素数
反素数就是满足对于任意i(0<i<x),都有g(i)<g(x),(g(x)是x的因子个数),则x为一个反素数。现在给你一个整数区间[a,b],请你求出该区间的x使g(x)最大。
输入格式:
输入包括a,b, 1<=a<=b<=5000,表示闭区间[a,b].
输出格式:
输出为一个整数,为该区间因子最多的数.如果满足条件有多个,则输出其中最小的数.
输入样例:
在这里给出一组输入。例如:
40 43
输出样例:
在这里给出相应的输出。例如:
40
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
int cn(int a,int b);
int main()
{
int a,b,s;
scanf("%d%d",&a,&b);
s=cn(a,b);
printf("%d\n",s);
return 0;
}
/* 请在这里填写答案 */
/*素数:是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
反素数:在一个区间内,因子最多的数(并且因子个数相同的时候值最小)。
题目意思:就是在一个区间里面 找到谁的因子最多然后不断迭代。*/
int cn(int a,int b){
int i,j,num=-1,max=b,count;
//num 用于记录当前找到的最大因数数量(初始化为 -1)
//max 用于记录具有最多因数的整数(初始化为 b)
//count 用于临时存储当前整数 i 的因数数量
for(i=a;i<b;i++){
count=0;
//在每次外层循环开始时,将 count 重置为 0,用于计算当前整数 i 的因数数量
for(j=2;j<i;j++){
if(i%j==0){
count++;
}
}
if(count>num){
//如果当前整数 i 的因数数量 count 大于之前找到的最大因数数量 num,则:
num=count;
max=i; //更新 max 为当前的整数 i 值
}
}
return max; //返回具有最多因数的整数
}
6-4 范围水仙花数
春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
现在要求输出所有在m和n范围内的水仙花数。
输入格式:
输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。
输出格式:
对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
如果给定的范围内不存在水仙花数,则输出no;
每个测试实例的输出占一行。
输入样例:
在这里给出一组输入。例如:
100 400
输出样例:
在这里给出相应的输出。例如:
153 370 371
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
int cn(int n,int m);
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int flog=cn(n,m);
if(flog==0)
printf("no\n");
else printf("\n");
}
return 0;
}
/* 请在这里填写答案 */
int cn(int n,int m){
int temp,flag=0,count=0;
for(int i=n;i<=m;i++){
temp=i;
int a=i%10;
int b=i/10%10;
int c=i/100;
if(temp==a*a*a+b*b*b+c*c*c && flag==1){
printf(" %d",temp);
count++;
}
else if(temp==a*a*a+b*b*b+c*c*c){
printf("%d",temp);
flag=1;
count++;
}
}
return count;
}
6-5 公约数和公倍数
输入两个整形数字,求其最大公约数和最小公倍数,写两个调用函数。
输入格式:
输入在一行中给出2个不超过的10000整数A和B。
输出格式:
对每一组输入,在一行中输出A和B的最小公倍数和最大公约数值。
输入样例:
在这里给出一组输入。例如:
1320 7156
输出样例:
在这里给出相应的输出。例如:
2361480 4
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
long long cn(long long a,long long b);
int main()
{
long long b,a;
scanf("%lld%lld",&a,&b);
long long ans=cn(a,b);
long long sum=a*b/ans;
printf("%lld %lld\n",sum,ans);
return 0;
}
/* 请在这里填写答案 */
long long cn(long long a,long long b){
long long r;
while((r=b%a)!=0){
b=a;
a=r;
}
return a;
}
6-6 进制转换
输入一个十进制数N,将它转换成R进制数输出。
输入格式:
每行输入一个正整数n(1<=n<=1000)和正整数r(1<=r<=16)
输出格式:
每行输出一个由十进制转化而成的R进制数字。
输入样例:
在这里给出一组输入。例如:
3 2
输出样例:
在这里给出相应的输出。例如:
11
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<math.h>
char s[32];
int cn(int n,int r);
int main()
{
int n,r,i;
while(~scanf("%d%d",&n,&r))
{
if(n<0)
printf("-");
n=fabs(n);
i=cn(n,r);
while(i--)
printf("%c",s[i]);
printf("\n");
}
return 0;
}
/* 请在这里填写答案 */
int cn(int n,int r){
int i=0,temp;
while(n>0){
int temp=n%r;
s[i]=(temp<10)?(temp+'0'):(temp-10+'A');
n/=r;
i++;
}
return i;
}
6-7 绝对值排序
输入格式:
每行输入一个n,然后下一行输入n个整形数字,(所有数据范围<=100)
输出格式:
输出n个绝对值从大到小排序的整型数字,每两个数字之间有一个空格。
输入样例:
在这里给出一组输入。例如:
5
1 8 4 3 2
输出样例:
在这里给出相应的输出。例如:
8 4 3 2 1
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
#include<math.h>
void cn(int a[],int n);
int main()
{
int n;
while(~scanf("%d",&n)&&n!=0)
{
int a[100];
cn(a,n);
printf("\n");
}
return 0;
}
/* 请在这里填写答案 */
void cn(int a[], int n){
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
// 创建一个临时数组用于存储原数组元素及其绝对值
int temp[n][2];
// 将原数组元素与其绝对值存入临时数组
for(int i=0;i<n;i++){
temp[i][0]=a[i];
temp[i][1]=abs(a[i]);
}
// 对临时数组按绝对值从大到小排序
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(temp[j][1]>temp[i][1]){
int t1=temp[i][0];
int t2=temp[i][1];
temp[i][0]=temp[j][0];
temp[i][1]=temp[j][1];
temp[j][0]=t1;
temp[j][1]=t2;
}
}
}
// 输出排序后的原数组元素
for(int i=0;i<n;i++) {
if(i==n-1){
printf("%d", temp[i][0]);
}
else{
printf("%d ", temp[i][0]);
}
}
}
6-8 连接字符串
写一个函数使得两个字符串数组连接。
输入格式:
输入两个长度小于1000的字符串,将两个字符串连接。
输出格式:
输出两个字符串连接之后的结果
输入样例:
在这里给出一组输入。例如:
program design
输出样例:
在这里给出相应的输出。例如:
programdesign
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
void cn(char s[],char b[]);
int main()
{
char s[1010];
char b[1010];
while(~scanf("%s %s",s,b))
{
cn(s,b);
printf("%s\n",s);
}
return 0;
}
/* 请在这里填写答案 */
//1
void cn(char s[],char b[]){
int i=0,j=0;
while(s[i]){
i++; //先把s数组本身的字符 走到末尾
}
while(b[j]){
s[i++]=b[j++]; //加入新的字符
}
//下面这个 ’\0‘ 一定要重视 printf函数以 %s 打印是以 \0 进行停止的
s[i]='\0';
}
//2
#include<string.h>
void cn(char s[],char b[]){
strcat(s,b);
}
6-9 求次方
玩一个好玩的游戏,求一个数字n的m次方,数字n的范围1到50,数字m的范围1到10。
请你完成这样的程序。
输入格式:
每行输入两个整形数字n和m,1<=n<=50,1<=m<=10。
输出格式:
输出一个整形数字表型n的m次方。
输入样例:
在这里给出一组输入。例如:
2 4
输出样例:
在这里给出相应的输出。例如:
16
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
long long cn(long long x,long long y);
int main()
{
long long n,m;
while(~scanf("%lld%lld",&n,&m))
{
long long zz=cn(n,m);
printf("%lld\n",zz);
}
return 0;
}
/* 请在这里填写答案 */
long long cn(long long x,long long y){
long long sum=1;
for(int i=1;i<=y;i++){
sum*=x;
}
return sum;
}
6-10 求阶乘
用递归的方法求整数x的阶乘。
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
6
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
long long cn(int x);
int main()
{
long long x;
while(~scanf("%d",&x))
{
long long sum;
sum=cn(x);
printf("%lld\n",sum);
}
return 0;
}
/* 请在这里填写答案 */
long long cn(int x){
long long sum=1;
for(int i=1;i<=x;i++){
sum*=i;
}
return sum;
}
6-11 求母牛数
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入格式:
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。
输出格式:
输出一个整数表示,第n年的母牛总数量。
输入样例:
在这里给出一组输入。例如:
18
输出样例:
在这里给出相应的输出。例如:
872
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
void cn(int a[]);
int main()
{
int n,a[1010];
cn(a);
while(~scanf("%d",&n)&&n)
{
printf("%d\n",a[n]);
}
return 0;
}
/* 请在这里填写答案 */
void cn(int a[]) {
a[1]=1; //第1年只有1头母牛
a[2]=2; //第2年新增1头小母牛
a[3]=3; //第3年新增1头小母牛
for(int i=4;i<=55;i++){
a[i]=a[i-1]+a[i-3]; //状态转移方程
}
}
6-12 求素数
输入一个不大于1000的整形数字,然后利用调用函数判断其是否是一个素数?
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
输入格式:
对于每一行输入一个不大于1000的整形数字
输出格式:
如果这个数字是素数输出“yes”,否者输出“no”(输出的时候不需要双引号)。
输入样例:
在这里给出一组输入。例如:
17
输出样例:
在这里给出相应的输出。例如:
yes
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
#include<math.h>
int cn(long long x);
int main()
{
long long zz;
while(~scanf("%lld",&zz))
{
if(cn(zz)==1)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
return 0;
}
/* 请在这里填写答案 */
int cn(long long x){
for(int i=2;i<x;i++){
if(x%i==0){
return 0;
}
}
return 1;
}
6-13 求最大值
在输入的十个数字当中比较最大值,使用递归算法。
输入格式:
输入十个整型数字,数字范围小于100.
输出格式:
输出这10个数字当中的最大值
输入样例:
在这里给出一组输入。例如:
49 56 68 63 24 11 85 62 28 66
输出样例:
在这里给出相应的输出。例如:
85
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
int cn(int a[],int n);
int main()
{
int a[1010],i,maxx;
for(i=0;i<10;i++)
{
scanf("%d",&a[i]);
}
maxx=cn(a,10);
printf("%d\n",maxx);
return 0;
}
/* 请在这里填写答案 */
//1
int cn(int a[],int n){
int i;
int max=-1;
for(i=0;i<n;i++){
if(a[i]>max){
max=a[i];
}
}
return max;
}
//2
int cn(int a[],int n){
int max=-1;
for(int i=0;i<n;i++){
max=max>a[i]?max:a[i];
}
return max;
}
6-14 数字求和
写一个递归函数使得,输入的数字,每个数位相加求和。
输入格式:
输入一个正整数n(1<=n<=1000000)
输出格式:
输出一个正整数,表示n的各位数字的和。
输入样例:
在这里给出一组输入。例如:
521456
输出样例:
在这里给出相应的输出。例如:
23
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
void cn(int n,int ans);
int main()
{
int n;
while(~scanf("%d",&n))
{
cn(n,0);
}
return 0;
}
/* 请在这里填写答案 */
//不是递归
void cn(int n,int ans){
int count=0,temp=n;
while(temp>0){
temp/=10;
count++;
}
int sum=0;
for(int i=0;i<count;i++){
sum+=n%10;
n/=10;
}
printf("%d",sum);
}
6-15 数字转换
一起玩一个游戏,输入一个整数,如果这个整数是奇数,那么就乘以3在加1,如果是偶数,那么就除以2,经过反复多次的操作,最后这个数字会变成1,请你将这个变化过程输出
输入格式:
每一行输入一个正整数n,n<=1000
输出格式:
每行输出n的变化过程,每次变化之后接一个空格,不要做无关的输出。
输入样例:
在这里给出一组输入。例如:
468
输出样例:
在这里给出相应的输出。例如:
468 234 117 352 176 88 44 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
#include<string.h>
void cn(long long x);
int main()
{
long long n;
while(~scanf("%lld",&n))
{
cn(n);
printf("\n");
}
return 0;
}
/* 请在这里填写答案 */
void cn(long long x){
while(x!=1){
printf("%d ",x);
if(x%2==0){
x/=2;
}
else{
x=x*3+1;
}
}
printf("1 ");
}
6-16 巫妖王的愤怒
不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票(记住,只有一张钞票),为了防止自己在战斗中频繁的死掉,他决定给自己买一些道具,于是他来到了地精商店前.
死亡骑士:"我要买道具!"
地精商人:"我们这里有三种道具,血瓶150块一个,魔法药200块一个,无敌药水350块一个."
死亡骑士:"好的,给我一个血瓶."
说完他掏出那张N元的大钞递给地精商人.
地精商人:"我忘了提醒你了,我们这里没有找客人钱的习惯的,多的钱我们都当小费收了的,嘿嘿."
死亡骑士:"......"
死亡骑士想,与其把钱当小费送个他还不如自己多买一点道具,反正以后都要买的,早点买了放在家里也好,但是要尽量少让他赚小费.
现在死亡骑士希望你能帮他计算一下,最少他要给地精商人多少小费。
输入格式:
输入一个正整数N(1<=N<=10000),N代表死亡骑士手中钞票的面值。
注意:地精商店只有题中描述的三种道具。
输出格式:
对于每组测试数据,请你输出死亡骑士最少要浪费多少钱给地精商人作为小费.
输入样例:
在这里给出一组输入。例如:
250
输出样例:
在这里给出相应的输出。例如:
50
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
void cn(int m);
int main()
{
int n;
scanf("%d",&n);
cn(n);
return 0;
}
/* 请在这里填写答案 */
void cn(int m){
int r;
if(m<350){
r=m%150>m%200?m%200:m%150;
}
else{
r=m%50;
}
printf("%d",r);
}
6-17 字符串逆序
将一个字符串逆序输出。
输入格式:
输入一行长度不超过100的字符串。
输出格式:
输出一行和输入顺序相反的字符串。
输入样例:
在这里给出一组输入。例如:
zzszhou
输出样例:
在这里给出相应的输出。例如:
uohzszz
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
#include <string.h>
void cn(char s[]);
int main()
{
char s[1001];
fgets(s,1000,stdin);
if (s[strlen(s)-1] == '\n')
s[strlen(s)-1] = '\0';
cn(s);
fputs(s,stdout);
printf("\n");
return 0;
}
/* 请在这里填写答案 */
void cn(char s[]){
char a[1001];
strcpy(a,s);
int j=0;
for(int i=strlen(s)-1;i>=0;i--){
s[j++]=a[i];
}
}
6-18 字母统计
统计字符串当中的大写字母个数和小写字母个数。
输入格式:
输入一行长度不超过100的字符串
输出格式:
输出两个数字n和m,分别代表大写字母个数和小写字母个数
输入样例:
在这里给出一组输入。例如:
ZHOUzzs
输出样例:
在这里给出相应的输出。例如:
4 3
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
int num1,num2;
void cn(char s[]);
int main()
{
char s[101];
while(~scanf("%s",s))
{
cn(s);
printf("%d %d\n",num1,num2);
}
return 0;
}
/* 请在这里填写答案 */
void cn(char s[]){
num1=0,num2=0;
for(int i=0;s[i]!='\0';i++){
if(s[i]>='a' && s[i]<='z'){
num2++;
}
else{
num1++;
}
}
}
6-19 求三角形面积
实验6 函数
一、实验目的
(1)掌握自定义函数的一般结构及定义函数的方法。
(2)掌握形参、实参、函数原型等重要概念。
(3)掌握函数声明、函数调用的一般方法。
二、实验内容
1、完成area函数,求任意三角形的面积。
提示:输入与输出都在主函数中完成,计算结果保留2位小数,如果不能组成三角形,输出dataerror。
输入样例:
在这里给出一组输入。例如:
3 4 5
输出样例:
在这里给出相应的输出。例如:
Area(3.0,4.0,5.0)=6.00
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<math.h>
#include<stdio.h>
float area(float a,float b,float c); /*计算三角形面积的函数原型声明*/
int main()
{
float a,b,c;
scanf("%f%f%f",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a&&a>0.0&&b>0.0&&c>0.0)
printf("Area(%.1f,%.1f,%.1f)=%.2f\n",a,b,c,area(a,b,c));
else
printf("dataerror");
return 0;
}
/* 请在这里填写答案 */
float area(float a,float b,float c){
float p,s;
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
return s;
}
6-20 排序问题
实验6 函数
一、实验目的
(1)掌握自定义函数的一般结构及定义函数的方法。
(2)掌握形参、实参、函数原型等重要概念。
(3)掌握函数声明、函数调用的一般方法。
二、实验内容
1、请帮助老师设计一个能实现任意20个整数升序排列的程序。
输入样例:
在这里给出一组输入。例如:
23 34 45 6 8 9 22 1 45 22 33 61 59 30 54 67 56 78 89 28
输出样例:
在这里给出相应的输出。例如:
23,34,45,6,8,9,22,1,45,22,33,61,59,30,54,67,56,78,89,28
1,6,8,9,22,22,23,28,30,33,34,45,45,54,56,59,61,67,78,89
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
void select_sort(int x[],int n);
int main()
{
int i,a[20];
i=0;
for(i=0;i<20;i++)
scanf("%d",&a[i]);
for(i =0; i < 19; i++)
printf("%d,",a[i]);
printf("%d\n",a[i]);
select_sort(a,20);
for(i = 0 ; i < 19 ; i++)
printf("%d,",a[i]);
printf("%d\n",a[i]);
return 0;
}
/* 请在这里填写答案 */
void select_sort(int x[],int n){
int a;
for(int i=0;i<n-1;i++){
for(int j=0;j<n-1-i;j++){
if(x[j]>x[j+1]){
a=x[j];
x[j]=x[j+1];
x[j+1]=a;
}
}
}
}
6-21 猴子吃桃子(递归)
实验6 函数
一、实验目的
(1)掌握自定义函数的一般结构及定义函数的方法。
(2)掌握形参、实参、函数原型等重要概念。
(3)掌握函数声明、函数调用的一般方法。
二、实验内容
1、一只聪明的猴子去摘桃子吃,第一天摘下若干个桃子,当天吃了一半,还不过瘾,又多吃了一个,
第二天早上又将剩下的桃子吃掉一半,并又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。
到第n早上想再吃时,只剩一个桃子了。聪明的你算一下第一天猴子共摘了多少桃子吧。
提示:分析出由当天的桃子数到前一天桃子数的个数规律。
输入样例:
在这里给出一组输入。例如:
10
输出样例:
在这里给出相应的输出。例如:
1534
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include "stdio.h"
int getpeaches(int n);
int main()
{
int n,peach;
scanf("%d",&n);
peach=getpeaches(n);
printf("%d",peach);
return 0;
}
/* 请在这里填写答案 */
int getpeaches(int n){
int c;
if(n==1){
c=1;
}
else{
c=(getpeaches(n-1)+1)*2;
}
return c;
}
6-22 Fibonacci 数列
实验6 函数
一、实验目的
(1)掌握自定义函数的一般结构及定义函数的方法。
(2)掌握形参、实参、函数原型等重要概念。
(3)掌握函数声明、函数调用的一般方法。
二、实验内容
1、用递归函数求解Fibonacci数列问题。在主函数中调用求Fibonacci数的函数,输出Fibonacci 数列中任意项的数值。
提示:Fibonacci数列第n(n≥1)个数的递归表示如下:当n=1或n=2时,f(n)=1;当n>2时,f(n)=f(n-1)+f(n-2);
输入样例:
在这里给出一组输入。例如:
6
输出样例:
在这里给出相应的输出。例如:
f(6)=8
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include <stdio.h>
int f(int n);
int main()
{
int n,sum;
scanf("%d",&n);
sum=f(n);
printf("f(%d)=%d\n",n,sum);
return 0;
}
/* 请在这里填写答案 */
int f(int n){
if(n==1){
return 1;
}
else if(n==2){
return 1;
}
else{
return f(n-2)+f(n-1);
}
}
6-23 汉诺塔问题
汉诺塔是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
本题要求编写递归函数,输出n层汉诺塔问题的解的过程,例如假设三根柱子编号分别为1、2、3,将圆盘从1号柱子移动到3号柱子,当n=1时,直接从1号移动到3号即可,输出1->3;当n=2时,则需要将1号柱的较小的圆盘先移动到2号柱子,再将1号柱子的较大的圆盘移动到3号柱子,最后将2号柱子圆盘移动到3号柱子结束,对应的输出结果为:1->2 、1->3、2->3,每次输出占一行。
输入样例:
在这里给出一组输入。例如:
2
输出样例:
在这里给出相应的输出。例如:
1->2
1->3
2->3
裁判测试程序样例及答案:
//在这里给出函数被调用进行测试的例子。例如:
#include<stdio.h>
void hanoi(int n,char a,char b,char c);
int main() {
int n;
char a='1',b='2',c='3';
scanf("%d", &n);
hanoi(n,a,b,c);
printf("\n");
}
/* 请在这里填写答案 */
void hanoi(int n, char a, char b, char c) {
if(n == 1){
// 当只有一个盘子时,直接从a移动到c
printf("%c->%c\n",a,c);
}
else{
// 先将n-1个盘子从a移动到b,以c作为辅助柱子
hanoi(n - 1,a,c,b);
// 然后将第n个盘子从a移动到c
printf("%c->%c\n",a,c);
// 最后将n-1个盘子从b移动到c,以a作为辅助柱子
hanoi(n - 1,b,a,c);
}
}
6-24 汉诺塔问题
汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。
请编写函数,完成移动汉诺塔的任务。
输入格式
圆盘数
起始柱 目的柱 过渡柱
输出格式
移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 1 开始由小到大顺序编号。
输入样例
3
a c b
输出样例
1: a -> c
2: a -> b
1: c -> b
3: a -> c
1: b -> a
2: b -> c
1: a -> c
裁判测试程序样例及答案:
#include <stdio.h>
void MoveTower(int num, char src, char dst, char trs);
int main()
{
int n;
char s, d, t;
scanf("%d %c %c %c", &n, &s, &d, &t);
MoveTower(n, s, d, t);
return 0;
}
/* 你提交的代码将被嵌在这里 */
void MoveDisk(int disk, char src, char dst) {
printf("%d: %c -> %c\n", disk, src, dst);
}
void MoveTower(int num, char src, char dst, char trs) {
if (num == 1) {
// 移动单个盘子
MoveDisk(1, src, dst);
}
else {
// 移动 n-1 个盘子到过渡柱
MoveTower(num - 1, src, trs, dst);
// 移动最大的盘子到目的柱
MoveDisk(num, src, dst);
// 移动 n-1 个盘子到目的柱
MoveTower(num - 1, trs, dst, src);
}
}