坐牢第八天 20240711

一.作业

1> 使用递归实现 求 n 的 k 次方

#include <stdio.h>
long cifan(int n,int k)
{
 if(k==0)
 {
    return 1;
 }
 else
 {
    return n*cifan(n,k-1);
 }
}
int main(int argc, char const *argv[])
{
    int n,k=0;
    printf("输入两个数:");
    scanf("%d%d",&n,&k);
    printf("%d的%d次方为:%ld",n,k,cifan(n,k));
    printf("\n");
    return 0;
}

运行截图:

2> 使用递归实现 strlen 的功能

#include <stdio.h>
#define M 100
int changdu(char*q)
{
    if(*q=='\0')
    {
        return 0;
    }
    else
    {
        return 1+changdu(q+1);
    }
}
int main(int argc, char const *argv[])
{
    char zifu[M]="";
    printf("输入一个字符串:");
    scanf("%s",zifu);
    getchar();
    printf("长度为:%d",changdu(zifu));
    printf("\n");
    return 0;
}

运行截图:

3> 使用递归实现汉诺塔问题(君子作业)

#include <stdio.h>
long hannuo(int n)
{
    if(n==1)
    {
        return 1;
    }
    else
    {
        return 2*hannuo(n-1)+1;
    }
}
 
int main(int argc, char const *argv[])
{
    int n=0;
    printf("输入汉诺塔层数:");
    scanf("%d",&n);
    printf("需要%ld步\n",hannuo(n));
    return 0;
}

代码运行:

4> 定义一个函数将一个字符串从大到小排序

#include<stdio.h>
#include <string.h>
//定义函数
void sort(char str[])
{
	int len = strlen(str);       //求出字符串实际长度
	for(int i=1; i<len; i++)
	{
		for(int j=0; j<len-i; j++)
		{
			if(str[j] < str[j+1])
			{
				//交换三部曲
				char temp = str[j];
				str[j] = str[j+1];
				str[j+1] = temp;
			}
		}
	}
 
	printf("排序成功\n");
}
int main(int argc, const char *argv[])
{
    char arr[20] = "";
    printf("请输入>>>");
    gets(arr);                       //输入一个字符串

    sort(arr);                   //调用排序函数
    printf("排序后的结果为:%s\n", arr);
    return 0;
}
 
 
 
 

 

运行截图:

5> 实现一个函数,用于检查一个字符串是否是回文字符串(正序和反序都相同)

#include<stdio.h>
#include <string.h>
#define MAX 100
int hws(char arr[])
{
    int start=0;
    int end=strlen(arr)-1;
    while (start<end)
    {
        if(arr[start]!=arr[end])
        {
            return 0;
        }
        start++;
        end--;
    }
     return 1;
}
int main(int argc, char const *argv[])
{
    char arr[MAX]="";
    printf("请输入一个字符串:");
    scanf("%s",arr);
    getchar();
    if (hws(arr))
    {
        printf("是回文数\n");
    }
    else
    {
        printf("不是回文数\n");
    }
    return 0;
}

运行截图:

6> 使用指针完成判断自己的主机存储多字节整数时,是大端存储还是小端存储

#include <stdio.h>
int main(int argc, char const *argv[])
{
    int n=0x12345678;
    char * p=&n;
    if(*p==0x78)
    {
        printf("小端存储\n");
    }
    else if(*p==0x12)
    {
        printf("大端存储\n");
    }
    
    printf("%#x\n",*p);
    return 0;
}

运行截图

7>

#include<stdio.h>
#include <string.h>
#define MAX 100
int geshu(char arr[])
{
    int sum=0;
    int flag=0;
   for(int i=0;arr[i]!='\0';i++)
    {
    if(!((arr[i]>=65&&arr[i]<=90)||(arr[i]>=97&&arr[i]<=122))) 
        {
             if(flag==1)
            {
                sum++;
            }
            flag=0;
        }
    else
        {
            flag=1;
        }
   
    }
    return sum;
}
int main(int argc, char const *argv[])
{
    char arr[MAX]="";
    printf("请输入一个字符串:");
    gets(arr);
    printf("%d",geshu(arr));
    printf("\n");
}

运行截图:

二.昨天补充

1.值传递与地址传递(非常重要)

1.值传递

说明:值传递过程中,形参与实参操作的是不同的内存空间

当普通变量作为函数参数传递时,是单向的值传递,仅仅只是将实参的值,复制一份给形参使用,形参的改变不会影响到实参的值

2.地址传递

说明:

当实参传递的是数组名、指针或变量的地址(&num)时,可以理解成是地址传递

地址传递过程中,形参与实参操作的是同一块内存空间

形参对内存空间进行改变时,实参也跟着一起改变

2.递归函数

1.递归函数的概念

所谓递归,就是一个函数直接或间接的形式调用自身,这样的函数调用,我们称为递归调用

2.递归4条件

1> 递归出口:用于终止递归进行进行的条件

2> 递归表达式:能够让递归继续进行的函数调用

3.递归思想

当直接解决规模比较大的问题不能进行时,需要先解决规模较小的原理一致的问题后,大的问题得以解决时,可以考虑使用递归

逐层分解,逐层合并

三指针

1、指针概述

1.1 指针相关概念

1> 引入目的:能够从地址的角度,找到内存中的数据,而不是以变量的角度去找,效率较高

2> 指针:就是内存地址编号

3> 指针变量:由于指针这个地址编号很难记忆,我们引入指针变量存储指针

存储地址的变量称为指针变量

4> 指针变量中,指针存储地址,作为一个特殊的数据类型,其大小是固定的 8 字节

1.2 指针变量的定义

1> 定义格式:数据类型 * 指针名;

例如:int * ptr;

2> 指针变量的使用:使用运算符 ‘ * ’来取得指针变量中的值,我们也称该运算为 取值运算

3> 指针的大小与指针的类型之间的关系

不同数据类型的指针所占内存空间都是一样的,都是指针的大小,32位系统下为4字节,64位系统下为 8字节

指针的数据类型存在的意义,不是为了给指针分配内存空间的,而是为了指针偏移使用的

不同类型的指针,在进行指针偏移时,偏移的大小跟指针的数据类型有关

指针每偏移一个单位,内存空间就会偏移一个数据类型大小的字节数

指针指向普通变量时,指针的偏移是没有意义的,但是,指针指向数组时,指针的偏移就有了现实的意义,表示指向上一个元素或者下一个元素的地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值