鸦领主 发表于 2020-12-10 22:13:55

C语言学习第八天 函数的开发 函数开发练习

本帖最后由 鸦领主 于 2020-12-10 22:13 编辑

一、函数的开发

1.函数的定义:

返回值类型   函数名      参数列表
   int cifang(int m, int n)          函数头:返回值类型 函数名(参数列表)
{                                              函数名可以自定义
    int i = 0;
    int k = 1;
    while ((i < n))         函数体:大括内输入你要实现的内容
    {
      k = k * m;
      i++;
    }
    return k;
}
列如:
#include<stdio.h>
int cifang(int m, int n)
{
    int i = 0;
    int k = 1;
    while (i < n) //i=0,n=6;0<6 循环6次
    {
      k = k * m; //循环一次k=1x3=3 ;循环二次k=3x3=9;循环三次k=9x3=27.......
      i++;
    }
    return k;//最后返回k最后得出的值
}
//上面是你定义的函数
int main()
{

    int y = cifang(5, 6);//这里直接调用这个函数带入俩个数值
    printf("结果是%d\n",y);//算出5的6次方
    int x = cifang(3, 4);//3和4是送入的实际参数,可以再次调用这个函数重复使用
    printf("结果是%d\n", x);

    return 0;
}


2.制作一些简单的函数
%c输出一个字符
a)判断一个字符是否为字母

#include<stdio.h>
int zimu(int i)
{
    if (i >= 'a' && i <= 'z')//判断输入的字符是否大于等于a,而且小于等于z
      return 1; //成立返回真
    else
      return 0;//不成立返回假
//4句简化成一句   return i >= 'a' && i <= 'z';
}
//上面为定义的函数
int main()
{
    int i = 'h';
    (zimu(i))? printf("你输入的%c是字母", i): printf("你输入的不是字母"); //返回真执行第句,返回假执行第二句

    return 0;
}


b)判断一个字符是否为0-9之间的数字
int shuzi(int i)
{
    if (i >= '0' && i <= '9')
      return 1;
    else
      return 0;
//4句简化成一句   return i >= '0' && i <= '9';
}
int main()
{
    int i = '3';
    (shuzi(i))? printf("你输入的%c是", i): printf("你输入的不是");

    return 0;
}


二、函数开发练习

1.编写一个函数,功能:测试带入的数字是否为素数;连续输入3个数字,判断这个3个数字分别是否为素数并打印。#include<stdio.h>
#include<math.h>
int shusu(int i)
{
    int n = 2;
    int m = sqrt(i) + 1;
    while (m>=n)
    {
      if (i % n == 0)
            return 0; //如果程序执行到这里说明不是素数,直接返回假
      n++;
    }   
      return 1; //能执行到这里说明是素数,直接返回真
}
//上面是编写的函数
int main()
{
    int a, b, c;
    printf("请输入3个数字判断是否为素数:");
    scanf_s("%d%d%d",&a,&b,&c);
    (shusu(a))? printf("%d是素数\n", a): printf("%d不是素数\n", a);
    (shusu(b)) ? printf("%d是素数\n", b) : printf("%d不是素数\n", b);
    (shusu(c)) ? printf("%d是素数\n", c) : printf("%d不是素数\n", c);
    return 0;

}

2.编写一个函数,功能:打印出a到z之间的素数
#include<stdio.h>
#include<math.h>
int shusu(int i)
{
    int n = 2;
    int m = (int)sqrt(i) + 1;
    while (m>=n)
    {
      if (i % n == 0)
            return 0;
            
      n++;
    }   
    return 1;
}
//上面判断否为素数
//void不需要return
void fanwei(int a,int z)//接收俩个数字
{
    int i = 0;
    while (a<z)
    {
      if (shusu(a))//每循环一次送如shusu里面判断
      {
            printf("%d ", a); //再打印出来
            i++;
      }
      a++;
      
    }
    printf("\n共打印%d个素数", i);
}
int main()
{
    int i, n;
    printf("请输入:");
    scanf_s("%d%d", &i, &n);
    fanwei(i, n); //把俩个数字送入void fanwie
    return 0;
}
3、编写一个菜单函数#include<stdio.h>
int caidan()
{
    puts("1、浏览所有数据");
    puts("2、添加数据");
    puts("3、删除数据");
    puts("4、修改数据");
    puts("0、退出程序");
    printf("===========\n");
    int i;
    printf("请选择:");
    scanf_s("%d", &i);
    return i;
   
}
//上面为函数内容
int main()
{
    while (caidan())//返回值为0退出循环不等于0一直循环
          ;
    return 0;
}

4.编写一个函数,求俩个数的最大公约数(2,3,6都能被12和18整除那么最大公约数是6)#include<stdio.h>
int yueshu(int a,int b)
{
    int m = a > b ? b : a;//求出最小的数字
    while (m>0) //从最小的数字开始探测
    {
      if (a % m == 0 && b % m == 0) //能同时被a或者b整除
      {
            printf("%d和%d的最大公约数是:%d", a, b, m);
            return m;
      }
      m--; //比如12到11,10,9.....找出第一个能被整除的数字
    }
   
}
int main()
{
    yueshu(18, 12);
   
}思路:如从12开始向下探测11,10,9,8,7...找出第一个能被a和b同时整除的数

4.编写一个函数,求俩个数的最小公倍数(6、15两数的公倍数有30、60、90、……,6及15两数之最小公倍数为30)#include<stdio.h>
int yueshu(int a,int b)
{
    int m = a > b ? a : b; //求出最大的数字
    while (m)//从某个数开始一直向上探测
    {
      if (m %a== 0 && m % b == 0)//直到找出能同时被a或者b整除
      {
            printf("%d和%d的最小公倍数是:%d", a, b, m);
            return m;
      }
      m++;//比如36,37,38...直到找出可以同时整除a和b的数
    }
   
}
int main()
{
    yueshu(18, 12);
   
}
思路:如从36开始向上探测37,38,39...找出第一个能同时整除a和b的数
5.代码融合在一起为了看着不乱我们将代码分为多个cpp(隔页调用需要声明:将要调用的函数的函数头复制到本页加个;)

main.cpp#include<stdio.h>
int caidan();

int main()
{
    while (caidan())
      ;
    return 0;
}
菜单.cpp#include<stdio.h>
#include<Windows.h>
void Testbeishu();
void Testgongyue();
void Testsushu();
int caidan()
{
    system("cls");
    int a;
    puts("1、求最大公约数");
    puts("2、求最小公倍");
    puts("3、判断是否为素数");
    puts("0、退出程序");
    puts("===============");
    printf("请选择:");
    scanf_s("%d", &a);
    switch (a)
    {
    case 1:
      Testgongyue();
      break;
    case 2:
      Testbeishu();
      break;
    case 3:
      Testsushu();
      break;
    case 0:
      return a;
    default:
      printf("输入的数字无效\n");
      system("pause");
      break;
    }
    return a;
}
case要用.cpp;#include<stdio.h>
#include<Windows.h>
int gongyue(int a, int b);
int beishu(int a, int b);
int sushu(int a);
void Testgongyue()
{
    while (1)
    {
      system("cls");
      int a, b;
      printf("你选择了求最大公约数\n请输入俩个数字求最大公约:");
      scanf_s("%d%d", &a, &b);
      if (a == 0&&b==0)
            return;
      printf("%d和%d的最大公约数是%d\n", a, b, gongyue(a, b));
      system("pause");
    }
}
void Testbeishu()
{
    while (1)
    {
      system("cls");
      int a, b;
      printf("你选择了求最小公倍数\n请输入俩个数字求最小公倍:");
      scanf_s("%d%d", &a, &b);
      if (a == 0 && b == 0)
            return;
      printf("%d和%d的最小公倍数是%d\n", a, b, beishu(a, b));
      system("pause");
    }
}
void Testsushu()
{
    while (1)
    {
      system("cls");
      int a;
      printf("输入0返回到选项列表\n");
      printf("你选择了判断是否为素数\n请输入一个数判断是否为素数:");
      scanf_s("%d", &a);
      if (a == 0)
            return;
      (sushu(a)) ? printf("%d是素数\n", a) : printf("%d不是素数\n", a);
      system("pause");
    }
}
最大公约数.cpp#include<stdio.h>
int gongyue(int a, int b)
{
    int m=(a > b) ? b : a;
    while (m>0)
    {
      if (a % m == 0 && b % m == 0)
            return m;
      m--;
    }

}
最小公倍数.cpp#include<stdio.h>
#include<stdio.h>
int beishu(int a, int b)
{
    int m = (a > b) ? a : b;
    while (m)
    {
      if (m % a == 0 && m % b == 0)
            return m;
      m++;
    }

}
素数.cpp#include<stdio.h>
#include<math.h>
int sushu(int a)
{
    if (a % 2 == 0&&a!=2)
      return 0;
    if (a == 1)
      return 0;
    int i = 2;
    int m = (int)sqrt(a) + 1;
    while (i<m)
    {
      if (m % i == 0)
            return 0;
      i++;
    }
    return 1;
}或者可以创建一个头文件把声明全部放进去
F10单步跟踪,F11进菜单函数
6.软件运行流程将地址固定的方法:链接器→高级→将随机基址改为否,固定改为是栈是循环使用的,当返回到main函数,栈将不会使用,下次再调用其他函数时还是同样的空间

页: [1]
查看完整版本: C语言学习第八天 函数的开发 函数开发练习