c基础进入尾声了,今天还是接着讲了指针的另一种写法,函数指针数组,这是一个数组,它存储了多个函数的地址,调用函数的时候可能会用到。还有const和void与指针的用法,宏定义等,最后讲了多文件编辑,老师说这是以后经常用到的一种编写代码的形式,今天的作业就是用多文件编辑写的。下面是今天的脑图:
课堂练习:
使用三种方法实现斐波那契,使用多文件编译
三个文件:main.c head.h test.c
在main调用三个函数 Fibonacci(); FibonacciArr(); FibonacciRec(int n)
Fibonacci: 思路定义3个变量,向后移动实现【无参无返函数】 c=a+b;a=b;b=c
FibonacciArr: 借助于数组实现【无参无返函数】 a[0]=1 a[1]=1; arr[i]=arr[i-1]+arr[i-2]
FibonacciRec: 借助递归实现,【有参有返函数】 FibonaciRec(n-1)+FibonaciRec(n-2)
代码:
主函数文件(fei.c)
#include "head.h"
int main(int argc, const char *argv[])
{
//1
int n;
printf("请输入要得到第几个斐波那契数:\n");
scanf("%d",&n);
getchar();
fun1(n);
//2
int a[20] = {1,1};
printf("输出20个斐波那契数\n");
fun2(a,20);
//3
int fei;
printf("请输入第几个斐波那契数:\n");
scanf("%d",&fei);
int final = fun3(fei);
printf("第%d个斐波那契数为:%d\n",fei,final);
return 0;
}
头文件(head.h)
#include <stdio.h>
#include <string.h>
void fun1(int n);
void fun2(int *p,int n);
int fun3(int n);
函数文件(fun.c)
#include "head.h"
void fun1(int n){
int i = 1,j = 1;
if(n == 1 || n == 2){
printf("第%d个斐波那契数为:%d\n",n,1);
return;
}
int fi = 0;
for(int w = 2; w < n; w ++){
fi = i + j;
i = j;
j = fi;
}
printf("第%d个斐波那契数为:%d\n",n,fi);
}
void fun2(int *p,int n){
for(int i = 0; i < n; i ++){
if(i < 2){
printf("%d ",*(p+i));
}else{
*(p+i) = *(p+i-1) + *(p+i-2);
printf("%d ",*(p+i));
}
}
printf("\n");
}
int fun3(int n){
if(n == 1 || n == 2){
return 1;
}
return fun3(n - 1) + fun3(n - 2);
}
结果如下:
2.实现字符串技能
三个文件:main.c head.h test.c
1> 通过指针指向字符串,实现字符串逆置 void MyStrRev(char *p) //p要逆序的字符串
2> 通过递归实现字符串逆置 void StrRevRec(char a[], int len) //len字符串长度 a逆置的字符串
3> 字符串连接 char *MyStrcat(char *dest,const char *src)//dest:连接到dest字符串中,src字符串不变
4> 字符串比较函数int MyStrcmp(const char *s1,const char *s2) s1存储第一个字符串 s2存储第二个字符串
5> 字符串拷贝char *MyStrcpy(char *dest,const char *sec) dest:拷贝后的字符串 src源字符串
6> 字符串长度long Mystrlen(const char *s1) s1存储字符串
主函数文件:nizhi.c
#include "head.h"
int main(int argc, const char *argv[])
{
//1
char a[10] = "\0";
printf("字符串逆置:\n");
printf("请输入一个字符串\n");
scanf("%s",a);
getchar();
int n = strlen(a);
Nizhi(a,n);
printf("逆置后的结果是\n%s\n",a);
//2
char b[10] = "\0";
printf("递归实现字符串逆置:\n");
printf("请输入一个字符串\n");
scanf("%s",b);
getchar();
int left = 0;
int right = strlen(b) - 1;
DiguiNizhi(b,left,right);
printf("递归逆置后的结果是\n%s\n",b);
//3
char c[20] = "\0";
char d[10] = "\0";
printf("字符串连接:\n");
printf("请输入2个字符串\n");
scanf("%s %s",c,d);
getchar();
Strcat(c,d);
printf("连接的结果是\n%s\n",c);
//4
char e[10] = "\0";
char f[10] = "\0";
printf("字符串比较:\n");
printf("请输入2个字符串\n");
scanf("%s %s",e,f);
getchar();
int cha = MyStrcmp(e,f);
if(cha == 0){
printf("两个字符串一样大\n");
}else if(cha < 0){
printf("第二个字符串大于第一个\n");
}else{
printf("第一个字符串大于第二个\n");
}
//5
char g[10] = "\0";
char h[10] = "\0";
printf("字符串拷贝:\n");
printf("请输入1个字符串\n");
scanf("%s",h);
getchar();
char *cpy = MyStrcpy(g,h);
printf("拷贝后的目的字符串是\n%s\n",cpy);
//6
char o[100] = "\0";
printf("字符串长度:\n");
printf("请输入一个字符串\n");
scanf("%s",o);
getchar();
long len = MyStrlen(o);
printf("该字符串的长度是%ld\n",len);
return 0;
}
头文件:head.h
#include <stdio.h>
#include <string.h>
void Nizhi(char *p,int n);
void DiguiNizhi(char *p,int left,int right);
void Strcat(char *p,char *q);
int MyStrcmp(const char *p,const char *q);
char *MyStrcpy(char *p,const char *q);
long MyStrlen(const char *p);
函数文件:fun.c
#include "head.h"
void Nizhi(char *p,int n){
int left = 0;
int right = n - 1;
while(left < right){
char a = *(p+left);
*(p+left) = *(p+right);
*(p+right) = a;
left ++;
right --;
}
}
void DiguiNizhi(char *p,int left,int right){
if(left >= right){
return;
}
char a = *(p+left);
*(p+left) = *(p+right);
*(p+right) = a;
DiguiNizhi(p,left+1,right-1);
}
void Strcat(char *p,char *q){
int n = strlen(p);
while(*q){
*(p+n) = *q;
q ++;
p ++;
}
}
int MyStrcmp(const char *p,const char *q){
int n = strlen(p);
for(int i = 0; i < n; i ++){
if(*(p+i) - *(q+i) > 0){
return *(p+i) - *(q+i);
}else if(*(p+i) - *(q+i) < 0){
return *(p+i) - *(q+i);
}
}
return 0;
}
char *MyStrcpy(char *p,const char *q){
int n = 0;
while(*(q+n)){
*(p+n) = *(q+n);
n ++;
}
return p;
}
long MyStrlen(const char *p){
int n = 0;
while(*(p+n)){
n ++;
}
return n;
}
结果如下:
Day13作业
1、实现字符串移动。
例如char str[]="AGAB%Sr67gs5ffwt+%"
得到结果是AABGS567grstw%%+
1.1 先对字符串实现升序排序 voidSort(char *p,int n)
1.2 从字符串中挑出大写 char *DaXie(char *p,int n)
1.3 从字符串中挑出数字 char *ShuZi(char *p,int n)
1.4 从字符串中挑出小写 char *XiaoXie(char *p,int n)
1.5 从字符串中挑出特殊字符 char *TeShu(char *p,int n)
1.6 在主函数使用**字符指针数组**接收返回的字符串地址 char *p[4] p[0]
1.7 按照顺序,实现字符串连接【使用strcat就行,或者调用自己封装的函数】
char t[100];
strcat(t,p[0]) strcat(t,p[1])
主函数文件:
#include "head.h"
int main(int argc, const char *argv[])
{
char str[] = "AGAB%Sr67gs5ffwt+%";
printf("转移前结果是:\n");
int n = strlen(str);
MySort(str,n);
puts(str);
char *p[4] = {DaXie(str,n),ShuZi(str,n),XiaoXie(str,n),TeShu(str,n)};
char t[30] = "\0";
Strcat(t,p[0]);
Strcat(t,p[1]);
Strcat(t,p[2]);
Strcat(t,p[3]);
printf("转移后结果是:\n");
puts(t);
return 0;
}
头文件:
#include <stdio.h>
#include <string.h>
void MySort(char *p,int n);
char *DaXie(char *p,int n);
char *ShuZi(char *p,int n);
char *XiaoXie(char *p,int n);
char *TeShu(char *p,int n);
函数文件:
#include "head.h"
void MySort(char *p,int n){
while(n > 0){
int type = 0;
for(int i = 0; i < n - 1; i ++){
if(*(p+i) > *(p+i+1)){
char a = *(p+i);
*(p+i) = *(p+i+1);
*(p+i+1) = a;
type ++;
}
}
if(type == 0){
break;
}
n --;
}
}
char *DaXie(char *p,int n){
static char d[10] = "\0";
int k = 0;
for(int i = 0; i < n; i ++){
if(*(p+i) >= 'A' && *(p+i) <= 'Z'){
d[k++] = *(p+i);
}
}
return d;
}
char *ShuZi(char *p,int n){
static char a[10] = "\0";
int k = 0;
for(int i = 0; i < n; i ++){
if(*(p+i) >= '0' && *(p+i) <= '9'){
a[k++] = *(p+i);
}
}
return a;
}
char *XiaoXie(char *p,int n){
static char b[10] = "\0";
int k = 0;
for(int i = 0; i < n; i ++){
if(*(p+i) >= 'a' && *(p+i) <= 'z'){
b[k++] = *(p+i);
}
}
return b;
}
char *TeShu(char *p,int n){
static char c[10] = "\0";
int k = 0;
for(int i = 0; i < n; i ++){
if(!(*(p+i) >= 'A' && *(p+i) <= 'Z')
&& !(*(p+i) >= '0' && *(p+i) <= '9')
&& !(*(p+i) >= 'a' && *(p+i) <= 'z')){
c[k++] = *(p+i);
}
}
return c;
}
结果如下:
2、判断二维字符数组是否存在**回文字符串**
例如:char a[] [10]={"asd","asa","werew","yuyu"};
提示存在回文字符串,回文字符串对称
思路:循环二维字符数组,判断每一个字符串是否是回文字符串【回文字符串使用单独函数】,
2.1 循环二维数组,存在回文返回1,否则返回0 int LoopStr(char str[] [10],int n)
2.2 回文字符串函数,是回文返回1,否则返回0 int HuiWen(char *p)
主函数文件
#include "head.h"
int main(int argc, const char *argv[])
{
char a[][10] = {"asd","asfa","werefw","yuyu"};
int n = sizeof(a)/sizeof(a[0]);
int type = LoopStr(a,n);
if(type == 1){
printf("存在回文字符串\n");
}else{
printf("不存在回文字符串\n");
}
return 0;
}
头文件
#include <stdio.h>
#include <string.h>
int LoopStr(char (*p)[10],int n);
int HuiWen(char *p);
函数文件
#include "head.h"
int LoopStr(char (*p)[10],int n){
int type2 = HuiWen(*(p+n-1));
if(n < 1){
return 0;
}
if(type2 == 1){
return 1;
}
// printf("%p\n",*(p+n-1));
int final = LoopStr(p,n-1);
return final;
}
int HuiWen(char *p){
int n = strlen(p);
int left = 0;
int right = n - 1;
while(left < right){
if(*(p+left) != *(p+right)){
return 0;
}
left ++;
right --;
}
return 1;
}
结果如下: