一.作业
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字节
指针的数据类型存在的意义,不是为了给指针分配内存空间的,而是为了指针偏移使用的
不同类型的指针,在进行指针偏移时,偏移的大小跟指针的数据类型有关
指针每偏移一个单位,内存空间就会偏移一个数据类型大小的字节数
指针指向普通变量时,指针的偏移是没有意义的,但是,指针指向数组时,指针的偏移就有了现实的意义,表示指向上一个元素或者下一个元素的地址