当前位置: 首页 > news >正文

《C程序设计》上机实验报告(六)之函数及其应用

实验内容:

1.运行程序

#include <stdio.h>

void ex(int x,int y);

void main( )

{ int a=1,b=2;

  ex(a,b);

  printf("a=%d,b=%d\n",a,b);

}

void ex(int x,int y)

{   x++;

    ++y;

    printf("\nx=%d,y=%d\n",x,y);

}

要求:

(1)输入源程序并进行编译、连接。

(2)将初始化(a=1,b=2)改为键盘输入(调用系统函数scanf())。

(3)将程序运行结果填入表5-1,分析参数传递与结果的关系。

表5-1 程序测试及结果分析

实参传递给形参后

子函数返回后

输出结果

x=2

y=3

输出结果

a=1

b=2

结果分析:输入数据,将实参传递给形参,再引用函数输出结果

2.运行程序

#include <stdio.h>

int b=0;

int f(int a);

void main( )

{   int a=2,i;

    for(i=0;i<3;i++)

        printf("%d\n",f(a));

    printf("\n");

}

int f(int a)

{

    int c=3;

    a=a+1;

    b+=a;

    c++;

    return (a+b+c);

}

要求:

(1)输入源程序并进行编译、连接、运行和调试。

(2)运行并将结果填入表5-3。

(3)分析函数中a、b、c的存储类型及其在每次调用中的变化。

(4)将函数f()中的语句“int c=3;”改为“static int c=3;”后进行编译、连接、运行和调试。将结果填入表5-3。

(5)比较(4)修改前后函数f使用的变量a、b、c的差别。

表5-2 程序测试及结果分析

b变量的类型为

全局变量

f函数调用

第1次

第2次

第3次

输出结果

10

13

16

表5-3 程序测试及结果分析

c变量的类型为

局部变量

f函数调用

第1次

第2次

第3次

输出结果

10

14

18

3. 运行程序

#include <stdio.h>

int func2(int a,int b);

int func1(int a,int b);

void main( )

{   int x=7,y=17;

    printf("%d\n",func1(x,y));

}

int func1(int a,int b)

{

    int c;

    a+=a;

    b+=b;

    c=func2(a,b);

    return c*c;

}

int func2(int a,int b)

{

    int c;

    c=a*b%3;

    return c;

}

要求:

(1)输入源程序并进行编译、连接、运行并调试。

(2)运行并将结果填入表5-4。

(3)分析函数之间的调用关系。

表5-4 程序测试及结果分析

func1返回的值

2

func2返回的值

2

main的输出结果

4

4.编写程序

编写一个函数,计算并返回三角形的面积。其中三角形的3条边长a、b、c作为函数的参数。输入a、b、c,判断是否能够构成三角形。

程序:#include<stdio.h>

#include<math.h>

double sanbian(double a, double b, double c)

{

  if (a + b > c && a + c > b && b + c > a)

  {

      printf("三条边可构成三角形\n");

      return 1;

  }

  else

      printf("输入错误\n");

  return 0;

}

double area(double a, double b, double c)

{

  double q, s;

  q = (a + b + c) / 2.0;

  s = sqrt(q * (q - a)*(q - b)*(q - c));

  return s;

}

int main()

{

  double a, b, c;

  printf("输入三条边长");

  scanf("%lf%lf%lf", &a, &b, &c);

  if (sanbian(a, b, c))

      printf("三角形的面积是 % lf", area(a, b, c));

  else

      printf("输出错误");

  return 0;

}

5.编写程序

编写一个程序,用两个函数分别求最大公约数和最小公倍数,其值不由函数带回,将最大公约数和最小公倍数都设为全局变量,在主函数中输出它们的值。

程序:#include<stdio.h>

int fun1(int m, int n) // 最大公约数函数

{

  int t;

  if (m < n)

  {//确保m为大数

      t = m;

      m = n;

      n = t;

  }

  while (n != 0)

  {//辗转相除 ,找最大公约数

      t = m % n;

      m = n;

      n = t;

  }

  return  m;//此时n为0,返回公约数m

}

int fun2(int m, int n)

{//最小公倍数函数

  int t;

  t = m * n / fun1(m, n);

  return t;

}

int main() {

  int m, n;

  printf("请输入两个正整数:\n");

  scanf("%d%d", &m, &n);

  printf("%d和%d的最大公约数为:%d\n", m, n, fun1(m, n));

  printf("%d和%d的最小公约数为:%d", m, n, fun2(m, n));

}

6.编写程序

写一个判别素数的函数,在主函数输入一个整数,输出是否素数的信息。

要求:

(1)判别素数的函数名为:prime。

   (2)程序中测试数据为:17、34、2、1、0

(3)算法分析中表示出判断素数的算法。

(4)结果分析中讨论判断素数的几种算法,并分析优劣。

程序:#include <stdio.h>

#include <math.h>

bool prime(int m)

{

  int i;

  if (m <= 1) return false;

  for (i = 2; i <= m - 1; i++)

      if (m % i == 0) break;

  if (i >= m) return true;

  else return false;

}

void main()

{

  int i;

  int a[5] = { 17,34,2,1,0 };

  for (i = 0; i < 5; i++)

  {

      if (prime(a[i]))

          printf("a[%d]=%d is a prime number\n", i, a[i]);

      else

          printf("a[%d]=%d is not a prime number\n", i, a[i]);

  }

}

7.编写程序

编写具有如下原型的函数:

void chgStr(char is[],char os[]);

由它负责将is 中的输入字符串按照如下的规则变换成结果字符串放入os数组中。

从头到尾逐字符地对输入字符串is进行处理:

(1)若is的当前字符不是数学字符,则将该字符复制到输出字符串os中。

(2)若is的当前字符是一个数学字符,且假定其大小值为n,则将该数字字符替换为n+1个相关字母存放到结果字符串os中:字符0替换为1个a,字符1替换为2个b,字符2替换为3个c,……,字符9替换为10个j。

例如:当输入字符串is为“s1k02”时,输出字符串os应为“sbbkaccc”;

      当输入字符串is为“abc5uf20t”时,输出字符串os应为“abcffffffufcccat”;

编写函数,对chgStr()进行调用,以验证其正确性.

程序:int  main()

{

  char is[20], os[20];

  int i, j, n, k;

  char c;

  printf("输入一个字符串_");

  gets_s(is);

  puts(is);

  i = 0, j = 0;

  while (is[i] != '\0')

  {

      if (is[i] < '0' || is[i]>'9')

          os[j++] = is[i++];

      else

      {

          n = is[i++] - '0';

          c = 'a' + n;

          for (k = 0; k <= n; k++)

              os[j++] = c;

      }

  }

  os[j] = '\0';

  puts(os);

}

8.

程序:#include <stdio.h>

double f(double x);

double g(double x);

int main()

{

  system("color f3");

  int i;

  for (i = -5; i <= 5; i++)

      printf("x=%2d,g(%2d)=%8.3f\n", i, i, g(i));

}

double f(double x)

{

  return x * x + 10.0 / 21 * x - 1;

}

double g(double x)

{

  return x * x + 10.0 / 21 * x - 1;

}

9.编写程序

编写具有如下原型的函数:

bool f(long x);

其功能为:若整数x仅由偶数字(0、2、4、6、8) 组成时(如x=2468),函数返回true;

否则返回false(如x=2214)。

编写主函数,对f()进行调用,以验证其正确性。

要求:输入输出界面设计为下面的形式

Input a long integer:x=2214

NO!—(Include:1,3,5,7)

再一次执行:

Input a long integer:x=80246

YES!—(Only: 0,2,4,6,8)

程序:#include <stdio.h>

bool f(long x)

{

  long yousa;

  while (x % 10 != 0)

  {

      yousa = x % 10;

   if (yousa != 0 && yousa != 2 && yousa != 4 && yousa != 6 && yousa != 8)

          return false;

      else

          x = x / 10;

  }

  return true;

}

void main()

{

  long int x;

  printf("input a long integer:x=");

  scanf("%d", &x);

  if (f(x))

      printf("YES!—(Only:0,2,4,6,8)");

  else

      printf("NO!—(Include:1,3,5,7)");

}

  10.编写程序

编写一个将x进制正整数转化为十进制数并输出结果的函数,具有如下原型:

void ChgxTo10(char a[],int x);

其中:参数a中存放的是x进制正整数的各位数字字符(如x可为2或8或16等,为大于等于2而小于等于16的正整数),要将其转化为十进制数并输出。

要求及提示:

(1)编写主函数,输入具体数据a(一个数字字符串)及其进制x,而后作为实参对ChgxTo10()进行调用以验证其正确性。

(2)要注意检查a数组中x进制数的合法性,即只允许出现数字字符1~x-1。例如可以再编写并使用如下的函数checkx()来完成该检查功能:

void checkx(char a[],int x);

(3)程序执行后的输入输出界面可设计为:

    a,x=? 7b 16

       7B(16)=123(10)

       再一次执行:

    a,x=? 236 7

       236(7)=125(10)

程序:#include <stdio.h>

#include <math.h>

bool checkx(char a[], int x);

void chgxto10(char a[], int x);

void main()

{

  int x;

  char a[20];

  printf("input 1~9 or A~F data.\n");

  scanf("%s", &a);

  printf("input radix x:");

  scanf("%d", &x);

  if (checkx(a, x))

      chgxto10(a, x);

  else

      printf("data is not right\n");

}

bool checkx(char a[], int x)

{

  int i = 0;

  char b[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };

  bool flag;

  while (a[i] != '\0')

  {

      flag = 0;

      for (int j = 0; j < x; j++)

      {

          if (a[i] == b[j])

          {

              flag = 1;

              break;

          }

      }

      if (flag == 0) return false;

      i++;

  }

  return true;

void chgxto10(char a[], int x)

{

    long sum = 0;

  int num = 0, i = 0, j;

  int p;

  while (a[i++] != '\0') num++;

  for (j = num - 1, i = 0; j >= 0; j--, i++)

  {

      if (a[j] >= '0' && a[j] <= '9')

          p = a[j] - '0';

      else if (a[j] >= 'A' && a[j] <= 'F')

          p = a[j] - 'A' + 10;

}

程序测试及运行结果:

4.

5.

程序测试及运行结果:

6.

7.

8.

程序测试及运行结果:

9.

10.

四、分析与讨论

1.函数实参和形参的“传递”方式有哪些?

答:(1)常量传递,实参是常量,形参是变量

  1. 变量传递,实参是变量,形参是变量
  2. 地址传递 ,实参是地址,形参也是地址
  3. 指针指针传递,实参是指针,形参是指针
  4. 指针地址传递,实参是指针,形参是地址
  5. 地址指针传递,实参是地址,形参是指针
  6. 数组元素变量传递,实参是数组元素,形参是变量
  7. 变量数组元素传递,实参是变量,形参是数组元素

2.函数的形参与实参类型总结?

答:形参:在定义函数时指定的参数,在未出现函数调用时,他们并不占用内存中的存储单元。只有在发生函数调用时,函数中的形参才被分配内存单元。在函数调用结束后,形参所占用的内存单元也被释放。

实参:即你调用函数时传递的参数。实参可以是常量、变量、表达式。

实参与形参的类型应相同或兼容赋值;

如果实参为int型而形参为float型,则按不同类型的赋值规则进行转换。

形参和实参实际上占用的是两份不同的存储单元。

相关文章:

  • BC107 矩阵转置
  • 踩坑实录(First Day)
  • SpringBoot之整合PageHelper分页插件
  • 代码随想录算法训练营DAY14 | 二叉树 (1)
  • vue3 之 组合式API—computed
  • 代码随想录算法训练营第四十一天| 343. 整数拆分、96.不同的二叉搜索树
  • 忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际
  • 【多模态大模型】视觉大模型SAM:如何使模型能够处理任意图像的分割任务?
  • LeAPI 后端接口开发 - 发布、下线接口
  • 导出pdf 加密、加水印、加页脚
  • 计组学习笔记2024/2/5
  • 框架学习Maven
  • Gson源码解读
  • 自动化报告pptx-python|高效通过PPT模版制造报告(三)
  • Jupyter Notebook中的%matplotlib inline详解
  • 分享的文章《人生如棋》
  • 【刷算法】求1+2+3+...+n
  • angular学习第一篇-----环境搭建
  • ES6核心特性
  • Idea+maven+scala构建包并在spark on yarn 运行
  • input的行数自动增减
  • Js基础——数据类型之Null和Undefined
  • ReactNative开发常用的三方模块
  • uni-app项目数字滚动
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 如何进阶一名有竞争力的程序员?
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 译米田引理
  • ionic异常记录
  • Python 之网络式编程
  • 阿里云ACE认证学习知识点梳理
  • 组复制官方翻译九、Group Replication Technical Details
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​queue --- 一个同步的队列类​
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)ssm教材管理系统 毕业设计 011229
  • (紀錄)[ASP.NET MVC][jQuery]-2 純手工打造屬於自己的 jQuery GridView (含完整程式碼下載)...
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .bat批处理(六):替换字符串中匹配的子串
  • .form文件_一篇文章学会文件上传
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .NET 的程序集加载上下文
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net生成的类,跨工程调用显示注释
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务