Guido 发表于 2020-10-21 20:50:43

逆向学习第11天_作业练习及内存跟踪

本帖最后由 Guido 于 2020-10-22 21:23 编辑

1.在不同源文件中编写一些函数:例如:int divisor(int a,int b)
int multiple(int a,int b)
int IsPrime(n)等等,主函数可以跨文件访问这些函数;

2.编写一个菜单函数:int Menu()
使用puts打印菜单:要求整齐好看
1、求最大公约数
2、求最小公倍数
3、查着素数
0、退出程序.
=============
请选择:
将输入的数值作为返回值返回给主调函数,当返回的数值是0时结束循环,退出进程。当输入的1-3的数字时,快文件访问一些上一题中的真实功能的函数;

3、使用画图软件,对第2题中的多层次的函数调用进行入栈过程绘画。将每个函数所用到的变量和形式参数,在绘图软件中标示出他们的位置;//求两个数的最大公约数,存在则返回最大公约数
#include<stdio.h>
int divisor(int a,int b)//
{
      puts("您选择求最大公约数,请输入两个数值");
      scanf_s("%d%d", &a, &b);
      int n;
      a<b?n = a : n = b;//从较小值开始递减,求公约数
      while (n)
      {
                if (a%n == 0 && b%n == 0)
                {
                        printf("%d与%d的最大公约数是%d\n\n", a, b, n);
                        return 0;
                }
                n--;
      }
      printf("%d与%d的最大公约数是%d\n\n", a, b, 1);
      return 1;
}

//判断一个数是否是素数,是的话返回1,不是的话返回0
#include<stdio.h>
#include<math.h>
int IsPrime(int a)
{
      puts("您选择了查看素数,请输入数值");
      scanf_s("%d", &a);
      int i = 2;
      int n = (int)sqrt(a) + 1;
      if (a / 2 == 0)
      {
                return 0;
      }
      while (i < n)
      {
                if (a%i == 0)
                {
                        break;
                }
                i++;
      }
      if (i < n)
      {      printf("%d不是素数\n\n", a);
                return 0;
      }
      else
      {
                printf("%d是素数\n\n", a);
                return 1;
      }
}
#include<stdio.h>
#include"type.h"
int Menu()
{
      int a=1, b=1;
      int n=1;
      puts("1、求最大公约数");
      puts("2、求最小公倍");
      puts("3、查看素数");
      puts("0、退出程序");
      puts("===============");
      puts("请选择");
      scanf_s("%d", &n);
      switch (n)
      {
                case 1:
                        divisor(a,b);
                        return n;
                        break;
                case 2:
                        multiple(a, b);
                        return n;
                        break;
                case 3:
                        IsPrime(a);
                        return n;
                        break;
                case 0:
                        return n;
                        break;
                default:
                              puts("输入无效,请重新输入");
      }
      return n;
}//求两个数的最小公倍数,返回值为其最小公倍数
#include<stdio.h>
int multiple(int a, int b)
{
      puts("您选择了求最小公倍数,请输入两个数值");
      scanf_s("%d%d", &a, &b);
      int n;                                        //m中存储最小公倍数
      a > b ? n = a : n = b;//从两者中较大的值开始递增,依次寻找其最小公倍数
      while (n%a != 0 || n%b != 0)
      {
                n++;
      }
      printf("%d与%d的最小公倍数是%d\n\n", a, b, n);
      return n;
}#include<stdio.h>
#include"type.h"
int IsPrime(int a, int b);
int IsPrime(int a);
int multiple(int a, int b);
int main()
{
      /*divisor(7, 12);*/
      /*IsPrime(33);*/
      /*multiple(7, 8);*/
                while (Menu());
      return 0;
}
2.在内存中跟踪并用表格表示出入栈出栈的过程
















页: [1]
查看完整版本: 逆向学习第11天_作业练习及内存跟踪