学C的第十四天【应用多文件的形式实现 扫雷 程序(重点);练习:(递归实现)1. 打印9*9乘法口诀表 2. 编写一个函数实现n的k次方 3. 计算一个数的每位之和 4.将参数字符串中的字符反向排列】-2

简介: int main() --- 主程序

int main() --- 主程序

image.png

练习:

   

1. 实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

         

(如:输入9,输出9 * 9口诀表,输出12,输出12 * 12的乘法口诀表。)

//实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
//如:输入9,输出9 * 9口诀表,输出12,输出12 * 12的乘法口诀表。
#include <stdio.h>
void print_table(int n)
{
  int i = 0;
  for (i = 1; i <= n; i++) //控制n行
  {
    int j = 0;
    for (j = 0; j <= i; j++) //每行打印几行
    {
      printf("%2d*%2d=%3d ", i, j, i * j);
    }
    printf("\n");
  }
}
int main()
{
  int n = 0;
  scanf("%d", &n);
  print_table(n);
  return 0;
}


b0ce2b4bb35346db8e0af6420a7e0945.png


2. 编写一个函数实现n的k次方,使用递归实现

//编写一个函数实现n的k次方,使用递归实现
#include <stdio.h>
double Pow(int n, int k)
{
  if (k == 0)
  {
    return 1;
  }
  else if (k > 0)
  {
    return n * Pow(n, k - 1); //2的4次方 = 2 * 2的3次方
  }
  else
  {
    return 1.0 / Pow(n, -k);
  }
}
int main()
{
  int n = 0;
  int k = 0;
  //输入:
  scanf("%d %d", &n, &k);
  //调用函数
  double num = Pow(n, k);
  //输出:
  printf("%lf\n", num);
  return 0;
}


b3fb8616a62a4622b51fadb30198d27d.png

3. 计算一个数的每位之和(递归实现)

//写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
//例如,调用DigitSum(1729),则应该返回1 + 7 + 2 + 9,它的和是19
//输入:1729,输出:19
//DigitSum(1729)-> DigitSum(172)+ 9 -> DigitSum(17)+ 2 + 9 
//-> DigitSum(1)+ 7 + 2 + 9
#include <stdio.h>
int DigitSum(int n)
{
  if (n <= 9) //只有个位数直接返回相加就好
  {
    return n;
  }
  else //不止个位数进行取尾数,递归
  {
    return DigitSum(n / 10) + n % 10;
  }
}
int main()
{
  unsigned int num = 0; //非负整数,设置成无符号unsigned
  scanf("%d", &num);
  int ret = DigitSum(num); //递归实现要求
  printf("%d\n", ret);
  return 0;
}


d9592901d93b47be9f454bab63230403.png

4. 编写一个函数 reverse_string(char * string)参数字符串中的字符反向排列递归实现,不使用C库函数

               

(4.1)版本1:使用库函数,不使用递归

//编写一个函数 reverse_string(char * string)(递归实现)
//实现:将参数字符串中的字符反向排列,不是逆序打印。
//要求:不能使用C函数库中的字符串操作函数。
//版本1:使用库函数,不使用递归
#include <stdio.h>
void reverse_string(char* s)
{
  int left = 0; //左下标
  int right = strlen(s) - 1; //右下标
  while (left < right) 
  //left < right:说明数组中还有元素需要调换
  {
    //通过中间值进行调换
    char tmp = s[left];
    s[left] = s[right];
    s[right] = tmp;
    left++;
    right--;
  }
}
int main()
{
  char arr[] = "abcdef";
  //调用自定义函数
  reverse_string(arr);
  printf("%s\n", arr);
  return 0;
}

c6139bc2acdc40dbb9a41a1a2c5c37ae.png

(4.2)版本2:不使用库函数,使用递归

//版本2:不使用库函数,使用递归
#include <stdio.h>
//reverse_string("abcdef") -> 交换a和f + reverse_string("bcde")
// -> 交换b和e + reverse_string("cd") -> 交换c和d + reverse_string("")
int my_strlen(char* s)
{
  int count = 0; //统计元素个数
  while (*s != '\0') //还没到结束符就继续统计
  {
    count++;
    s++;
  }
  return count;
}
void reverse_string(char* s)
{
  //if (*s = '\0')//首字符为结束符,说明是空字符串
  //{
  //  return;//直接返回
  //}
  int len = my_strlen(s);
  char tmp = s[0];
  s[0] = s[len - 1]; //把最后的值赋给第一个值
  s[len - 1] = '\0';
  //赋完后把最后位置换成\0,先别把第一个值赋给最后一个值
  //倒数第二个假设成数组的最后一个值,然后递归
  if (my_strlen(s+1) >= 2) 
  //从第二个元素开始数到新赋值的\0处
  //如果有大于等于2个元素则还需要进行调换
  {
    reverse_string(s + 1);
  }
  s[len - 1] = tmp;
  //最后再赋值给后面的值
}
int main()
{
  char arr[] = "abcdef";
  //调用自定义函数
  reverse_string(arr);
  printf("%s\n", arr);
  return 0;
}

5ddfa655c08b4bafaf8de7abfb675098.png

相关文章
|
9月前
学C的第十三天【应用多文件的形式实现 三子棋 程序(重点);练习:1. 打印9*9乘法口诀表、2. 求10个整数中的最大值、3. 分数加减交叉计算、4. 数一下 1到 100 的整数中出现了多少个9】
9.数组的应用实例1:三子棋(综合以前学习的知识) 三子棋的实现:(重点都在注释中) 1. 游戏不退出,继续玩下一把(循环) 2. 应用多文件的形式写代码
|
9月前
学C的第三天(多组输入的一种方法;简单了解函数,数组,多种操作符)-2
10.2:移位操作符(移动的是二进制位): >>(右移) <<(左移) 10.3:位操作符(操作的额也是二进制位): &(按位与) ^(按位异或) |(按位或)