学习笔记
1.25总结
函数:
1、语法
返回值的类型 函数名 (形参)
{
函数体;
return 表达式;
}
返回值的类型:
a. 一般与返回的结果类型一致
b. 不一致时,以函数定义时,“返回值的类型”一致
c. 不写,默认识别为int型
d. 不需要写返回值——void
形参:
a. 个数相同
b. 类型匹配
c. 匹配顺序 // 从右向左
函数体:
实现功能的代码
2、练习:
求和、找最大值、求月份的天数、打印100以内的素数
3、函数调用的本质
栈的存在可以实现函数的层层嵌套调用
堆、全局区(静态区)、字符串常量区、代码区
程序 = 代码 + 数据
除了代码区,其他都叫数据区
4、函数递归
递归概念: 自己调用自己
递归求和:
1、结束条件
2、递推关系
递归本质上是一种循环
练习1:
求n的阶乘
#include <stdio.h>
int fact(int n)
{
if (n == 1)//结束条件
{
return 1;
}else
{
return fact(n-1)*n;//递推关系
}
}
int main(void)
{
int n = 0;
printf("Input a num: \n");
scanf("%d",&n);
printf("%d\n",fact(n));
return 0;
}
练习2:
求斐波那契数列前n项和
#include<stdio.h>
int fibo(int n)
{
if (n == 2 || n == 1)
{
return 1;
}else
{
return fibo(n-1)+fibo(n-2);
}
}
int FiboSum(int n)
{
if (n == 2)
{
return 2;
}else
{
return FiboSum(n-1)+fibo(n);
}
}
int main(void)
{
int n;
printf("Input a num :\n");
scanf("%d",&n);
printf("sum = %d \n",FiboSum(n));
return 0;
}
练习3(巨难):
Hanoi( 汉诺)塔问题。
数组元素作为函数参数
1、数组元素作为函数实参 --- 此时函数的形参时一个与实参类型相同的变量即可
2、数组作为函数的形参,此时形式上看是数组,但是编译器最终是当做指针变量来看的
一维整型数组作为函数形参:
a.数组形式 b.数组长度:void printf(int a[10],int len); // 形参
调用:printf(a,len);
练习4:
写个函数,往数组中填入斐波那契数列的前n项
#include<stdio.h>
int fibo(int n)
{
if (n == 2 || n == 1)
{
return 1;
}else
{
return fibo(n-1)+fibo(n-2);
}
}
void array(int a[],int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
a[i] = fibo(i+1);
printf("a[%d] = %d \n",i,a[i]);
}
}
int main(void)
{
printf("Input a num: \n");
int len;
scanf("%d",&len);
int a[len];
array(a,len);
return 0;
}
练习5:
找出数组中的最大值
#include <stdio.h>
void Input(int a[],int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
scanf("%d",&a[i]);
}
}
int FindMax(int a[],int len)
{
int i = 0;
int max = a[0];
for (i = 1; i < len; ++i)
{
if (a[i] > max)
{
max = a[i];
}
}
return max;
}
int main(void)
{
int len;
printf("Input a num: \n");
scanf("%d",&len);
int a[len];
Input(a,len);
printf("max = %d\n",FindMax(a,len));
return 0;
}
练习6:
数组逆序
#include <stdio.h>
void Input(int a[],int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
scanf("%d",&a[i]);
}
}
void Reverse(int a[],int len)
{
int i = 0;
for (i = 0; i < len/2; ++i)
{
int t = a[i];
a[i] = a[len-1-i];
a[len-1-i] = t;
}
}
int main()
{
int len;
printf("Input a num: \n");
scanf("%d",&len);
int a[len];
int i = 0;
Input(a,len);
Reverse(a,len);
for (i = 0; i < len; ++i)
{
printf("%d ",a[i]);
}
putchar('\n');
return 0;
}
练习7:
实现一个对数组的排序
#include <stdio.h>
void Input(int a[],int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
scanf("%d",&a[i]);
}
}
void ChooseSort(int a[],int len)
{
int i = 0;
int j = 0;
for (i = 0; i < len-1; ++i)
{
for (j = i+1; j < len; ++j)
{
if (a[j] < a[i])
{
int t = a[i];
a[i] = a[j];
a[j] = t;
}
}
}
}
void BullingSort(int a[],int len)
{
int j;
int i;
for (j = 1; j < len; ++j)
{
for (i = 0; i < len-j; ++i)
{
if (a[i] > a[i+1])
{
int t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}
}
}
}
void InsertSort(int a[],int len)
{
int i;
int j;
for (i = 0; i < len; ++i)
{
int t = a[i];
j = i;
while (j > 0 && a[j-1] > t)
{
a[j] = a[j-1];
--j;
}
a[j] = t;
}
}
void Output(int a[],int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
printf("%d ",a[i]);
}
putchar('\n');
}
int main(void)
{
int len;
printf("Input a num: \n");
scanf("%d",&len);
int a[len];
Input(a,len);
ChooseSort(a,len);
printf("Choose_Sort is: ");
Output(a,len);
Input(a,len);
BullingSort(a,len);
printf("Bulling_Sort is: ");
Output(a,len);
Input(a,len);
InsertSort(a,len);
printf("Insert_Sort is: ");
Output(a,len);
return 0;
}
练习8:
查找
#include <stdio.h>
void Input(int a[],int len)
{
int i = 0;
for (i = 0; i < len; ++i)
{
scanf("%d",&a[i]);
}
}
void InsertSort(int a[],int len)
{
int i;
int j;
for (i = 0; i < len; ++i)
{
int t = a[i];
j = i;
while (j > 0 && a[j-1] > t)
{
a[j] = a[j-1];
--j;
}
a[j] = t;
}
}
int Find(int a[],int len,int k)
{
int begin = 0;
int end = len-1;
int mid;
while (begin <= end)
{
mid = (begin + end)/2;
if (a[mid] > k)
{
end = mid - 1;
}else if (a[mid] < k )
{
begin = mid + 1;
}else
{
break;
}
}
if (begin <= end)
{
return mid;
}else
{
return -1;
}
}
int main(void)
{
int len;
printf("Input a num: \n");
scanf("%d",&len);
int a[len];
Input(a,len);
InsertSort(a,len);
int k;
printf("Input a num to find: \n");
scanf("%d",&k);
int ret = Find(a,len,k);
if (ret < 0)
{
printf("Not Found!");
}else
{
printf("a[%d] = %d\n",ret,k);
}
return 0;
}
一维字符型数组:
void printStr(char s[1000]); // 形式上 写成字符数组的形式
函数调用:
printStr(s); // 数组名 注意:此时不需要传数组长度
练习9:
用函数实现字符串输入
#include <stdio.h>
void ScanfStr(char s[1000])
{
int i;
for (i = 0; ; ++i)
{
scanf("%c",&s[i]);
if (s[i] == '\n')
break;
}
s[i] = '\0';
}
int main()
{
char s[1000];
ScanfStr(s);
puts(s);
}
练习10:
统计字符串长度strlen
#include <stdio.h>
int Strlen(char s[])
{
int i = 0;
while (s[i] != '\0')
{
++i;
}
return i;
}
int main()
{
char s[10000];
gets(s);
printf("%d \n", Strlen(s));
}
练习11:
字符串拷贝strcpy
#include <stdio.h>
void Strcpy(char dest[],char src[])
{
int i = 0;
for (i = 0; i < 1000; ++i)
{
if (src[i] != 0)
{
dest[i] = src[i];
}else
break;
}
}
int main()
{
char dest[1000];
char src[1000];
printf("src[]: ");
gets(src);
printf("dest[]: ");
Strcpy(dest,src);
puts(dest);
return 0;
}
练习12:
字符串拼接strcat
#include <stdio.h>
void Strcat(char dest[],char src[])
{
int i = 0;
while (dest[i] != '\0')
{
++i;
}
int j = 0;
while (src[j] != '\0')
{
dest[i] = src[j];
++i;
++j;
}
dest[i] = '\0';
}
int main(void)
{
char dest[1000];
char src[1000];
printf("Input dest string: ");
gets(dest);
printf("Input src string: ");
gets(src);
Strcat(dest,src);
printf("Strcat: ");
puts(dest);
putchar('\n');
return 0;
}
练习13:
字符串比较strcmp
#include <stdio.h>
int Strcmp(char s1[],char s2[])
{
int i = 0;
while (s1[i] == s2[i] && s1[i] != '\0' && s2[i] != '\0')
{
++i;
}
return s1[i]-s2[i];
}
int main(void)
{
char s1[1000];
char s2[1000];
printf("Input s1: ");
gets(s1);
printf("Input s2: ");
gets(s2);
int ret = Strcmp(s1,s2);
if (ret > 0)
{
printf("max = s1,%d\n",ret);
}else if (ret < 0)
{
printf("max = s2,%d\n",ret);
}else
{
printf("s1 = s2");
}
return 0;
}