【C语言】函数例题与数组

目录

一、函数例题

例题-->九九乘法表

例题-->字符串的逆序输出

例题-->利用递归的方法求一个数的各位数之和

例题-->用递归的方法求n的k次方

二、数组

一维数组

二维数组


一、函数例题

例题-->九九乘法表

思路:创立两个数表示行数与列数,再用循环进行计算,列数小于等于函数。

注意:%2d--打印结果两位   %-2d--两位且左对齐

代码如下图:

int main()
{
	int i = 1;//行
	for (i = 1; i <= 9; i++)
	{
		int j = 1;//列
		for (j = 1; j <= i; j++)
		{
			printf("%d*%d=%2d ", i, j, i*j);//%2d--打印结果两位   %-2d--两位且左对齐
		}
		printf("\n");
	}
	getchar();
	getchar();
	return 0;
}

例题-->字符串的逆序输出

思路:建立循环将第一个与最后一个交换

代码如下:

int my_strlen(char *str)
{
	int count=0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
void reverse_string(char *str)
{
	int left = 0;
	int right = my_strlen(str)-1;
	char tmp;
	while(left < right)
	{
		tmp = str[left];//str[left]=*(str+left)
		str[left] = str[right];
		str[right] = tmp;
		left++;
		right--;
	}
}

若用递归的方法,思路为:(abcdef)\0=f(bcde)\0\0=fe(cd)\0\0\0=fed()\0\0\0\0=fedc\0\0\0=fedcb\0\0=fedcba\0当中间字符长度为0或者1的时候递归停止。

代码如下:

void reverse_string(char *str)
{
	char tmp=*str;
	int len = strlen(str);
	*str = *(str+len - 1);
	*(str + len - 1) = '\0';
	if (strlen(str+1)>=2)
	{
		reverse_string(str+1);
	}
	*(str + len - 1) =tmp;
}

例题-->利用递归的方法求一个数的各位数之和

eg:1729=1+7+2+9

思路:1729=sum(172)+9=sum(17)+2+9=sum(1)+7+2+9

代码如下:

int sum(int n)
{
	if (n > 9)
	{
		return sum(n / 10) + (n % 10);
	}
	else
		return n;
}
int main()
{
	int num = 1729;
	printf("%d", sum(num));
	getchar();
	getchar();
	return 0;
}

例题-->用递归的方法求n的k次方

思路:n*n的k-1次方 

代码如下:

int test(int n, int k)
{
	if (k == 0)
		return 1;
	if (k>0)
		return n*test(n,k-1);

}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d",&n,&k);
	printf("%d\n",test(n, k));
	getchar();
	getchar();
	return 0;
}

这个没有考虑k为负数的情况,因此我们可以思考下当k为负数的时候,n的k次方就会变成1/n的-k次方

代码如下:

double test(int n, int k)
{
	if (k == 0)
		return 1.0;
	else if (k > 0)
		return n*test(n, k - 1);
	else
		return 1.0 / test(n, -k);
}
int main()
{
	int n = 0;
	int k = 0;
	scanf("%d %d",&n,&k);
	printf("%lf\n",test(n, k));
	getchar();
	getchar();
	return 0;
}

二、数组

一维数组

创建:元素类型 数组名[数组大小(常量表达式)]

eg:int arr[6];或者char arr[5];

错误形式:int n=0;int arr[n];(c99语法支持eg :gcc)

初始化:

整数型

1.int arr[10]={1,2,3,4,5,6,7,8,9,10};(完全初始化)

2.int arr[10]={1,2,3,4,5};(不完全--其余为0)

3.int arr[]={1,2,3,4,5}=int arr[5]={1,2,3,4,5}

字符型

1.char ch[5]={'a','b','c'};(其余为'\0')

2.char ch[]={'a','b','c'};-->a b c//数组长度为3,但是求字符串长度时为一个随机值

3.char ch[5]="bit";-->b i t \0 \0

4.char ch[]="bit";-->b i t \0

这里我们要注意下第2种的打印会出现乱码烫烫...这是因为字符串的结束标志为\0

数组大小可以通过计算--sizeof(arr)/sizeof(arr[0])

%p--按照地址的格式打印(十六进制),运用如下:

 打印数组元素,也可以用指针,如下:

注意:数组名是数组首元素的地址

有例外:1.sizeof[数组名]--数组名为整个数组-->计算的是整个数组的字节

              2.&数组名--数组名为整个数组--整个数组的地址

int main()
{
	int arr[10] = {1,3,2,4,5,6,7,8,9,10};
	int *p=arr;//数组名为其首元素的地址
	for (int i = 0; i < 10; i++)
	{
		printf("%d ",*p);
		p++;
	}
	getchar();
	getchar();
	return 0;
}

二维数组

创建:[行][列](行可以省略,但列不可以

eg:int arr[3][4];或者char ch[5][6];

初始化:

1.int arr[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

2.int arr[3][4]={1,2,3,4};(不完全--补0)

3.int arr[3][4]={{1,2,3},{4,5,6},{7,8,9}};(一行一行初始化)

用指针打印数组元素,如下:

int main()
{
	int arr[][4] = { { 1, 3 }, { 2, 4 }, { 5, 6 } };
	int *p =& arr[0][0];
	for (int i = 0; i < 12; i++)
	{
		printf("%d ", *p);
		p++;
	}
	getchar();
	getchar();
	return 0;
}

二维数组可以看成多个一维数组!!!

冒泡排序:相邻的进行比较,有需要的话进行交换。

思想如下:

 10个数字--9趟---->n个数字--n-1趟

代码如下:

int main()
{
	int arr[] = {9.8,7,6,5,4,3,2,1,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	//趟
	for (i = 0; i < sz - 1; i++)
	{
		//每一趟的次
		int j = 0;
		for (j = 0; j < sz - 1; j++)
		{
			if (arr[j]>arr[j + 1])//交换
			{
				int tmp = arr[j];
				arr[j ] =arr[j+1];
				arr[j + 1] = tmp;
			}
		}
	}
	for (int x = 0; x < sz; x++)
	{
		printf("%d ", arr[x]);
	}
	getchar();
	getchar();
	return 0;
}

本次学习就到次啦!!芜湖~

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值