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

news2024/9/23 9:28:42

实验内容:

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型,则按不同类型的赋值规则进行转换。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1436648.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PyQt】05-多线程

文章目录 前言一、什么是单线程、多线程二、代码现象示例多线程代码运行结果 总结 前言 文章开始还是解释一下&#xff0c;这是跟着王铭东老师学习的。 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、什么是单线程、多线程 单线程 在Python中&am…

#Z0458. 树的中心2

题目 代码 #include <bits/stdc.h> using namespace std; struct ff {int z,len; }; vector<ff> vec[300001]; int n,u,v,w,dp[300001][2],ans 1e9; void dfs(int x,int fa) {for(int i 0;i < vec[x].size();i){ff son vec[x][i];if(son.z ! fa){dfs(son.z,…

第4节、电机多段转动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍用控制步进电机三个主要参数角度、速度、方向&#xff0c;实现简单的步进电机多段控制 一、目标功能 输入多个目标角度&#xff0c;以及每个角度对应的速度&#xff0c;实现步进电机的多段多速…

HGAME 2024 WEEK1 WP

文章目录 WEBezHTTPBypass itSelect Courses2048*16jhat REezASMezPYCezUPXezIDA PWNEzSignIn CRYPTO奇怪的图片ezRSAezMathezPRNG MISCSignIn来自星尘的问候simple_attack希儿希儿希尔签到 放假比较闲&#xff0c;打打比赛 WEB ezHTTP 来自vidar.club、UA要求阿巴阿巴阿巴…

zlib交叉编译(rv1126)

目录 1.下载 2.解压 3.配置 4.编译 1.下载 1)下载地址 zlib Home Site 2)下载tar.gz版本 下载该版本。 2.解压 1)解压到某个文件夹

使用Qt创建项目 Qt中输出内容到控制台 设置窗口大小和窗口标题 Qt查看说明文档

按windows键&#xff0c;找到Qt Creator &#xff0c;打开 一.创建带模板的项目 新建项目 设置项目路径QMainWindow是带工具栏的窗口。 QWidget是无工具栏的窗口。 QDuakig是对话框窗口。创建好的项目如下&#xff1a; #include "widget.h"// 构造函数&#xff…

SpringBoot整合Knife4j接口文档生成工具

一个好的项目&#xff0c;接口文档是非常重要的&#xff0c;除了能帮助前端和后端开发人员更快地协作完成开发任务&#xff0c;接口文档还能用来生成资源权限&#xff0c;对权限访问控制的实现有很大的帮助。 这篇文章介绍一下企业中常用的接口文档工具Knife4j&#xff08;基于…

Springboot集成rocketmq快速入门demo

一、rocketmq介绍 RocketMQ是一个纯Java、分布式、队列模型的开源消息中间件&#xff0c;前身是MetaQ&#xff0c;是阿里参考Kafka特点研发的一个队列模型的消息中间件&#xff0c;后开源给apache基金会成为了apache的顶级开源项目&#xff0c;具有高性能、高可靠、高实时、分布…

PyTorch 2.2 中文官方教程(十九)

使用 RPC 进行分布式管道并行 原文&#xff1a;pytorch.org/tutorials/intermediate/dist_pipeline_parallel_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 作者&#xff1a;Shen Li 注意 在github中查看并编辑本教程。 先决条件&#xff1a; PyTorc…

JVM 性能调优 - 四种引用(4)

为什么会有四种引用 我们先回顾下在 Java 虚拟机内存体系(1) 中提到了的垃圾回收算法 1、引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它,计数器的值就加一。每当有一个引用失效,计数器的值就减一。当计数器值为零时,这个对象被认为没有其他对象引用,…

专业排版设计软件:QuarkXPress 2024 for mac中文激活版

QuarkXPress 2024 for Mac是一款功能强大、易于使用、高质量输出的专业排版软件。无论您是出版业的专家还是初学者&#xff0c;都可以通过QuarkXPress 2024轻松创建出令人惊叹的出版物。 软件下载&#xff1a;QuarkXPress 2024 for mac中文激活版下载 QuarkXPress 2023 for Mac…

mvn常见报错:Failed to read artifact descriptor for 解决

问题&#xff1a; mvn打包时报错&#xff1a;Failed to read artifact descriptor for 产生原因&#xff1a; 项目打包时所需的依赖包不存在本地仓库&#xff0c;或本地仓库文件存在问题。 解决方法&#xff1a; 检查仓库可用性&#xff1a; 确保在Maven设置或pom.xml中指定…

居然在Web上就可以体验下MacOS啦?

发现一款宝藏项目 MacOS &#xff0c;在Web上打造一款原汁原味的 MacOS系统&#xff0c;不同于以外的仿操作系统的web应用&#xff0c;该应用底层基于 HTML5的 FileSystem 和 IndexedDB 构建了文件系统&#xff0c;理论上可以基于这套系统实现任何的上层应用。作者还制定了可以…

nacos越权漏洞复现

1.低版本(nacos<1.4.1)默认白名单UA 开启鉴权功能后&#xff0c;服务端之间的请求也会通过鉴权系统的影响。考虑到服务端之间的通信应该是可信的&#xff0c;因此在1.2~1.4.0版本期间&#xff0c;通过User-Agent中是否包含Nacos-Server来进行判断请求是否来自其他服务端。 但…

程序员为什么不喜欢关电脑?

目录 标题&#xff1a;程序员为何乐见电脑长时间处于关闭状态&#xff1f; 引言&#xff1a; 一、思维的延续性&#xff1a; 二、环境的连续性&#xff1a; 三、长时间开机的原因&#xff1a; 四、恢复成本的考量&#xff1a; 结论&#xff1a; 特别的&#xff1a; 不是…

Vue3快速上手(二)VSCode官方推荐插件安装及配置

一、VSCode官方插件安装&#xff0c;如下图2款插件 在用vite创建的程序里&#xff0c;提示提安装推荐的插件了&#xff0c;如下图&#xff1a; 二、配置 在设置-扩展里找到Volar插件&#xff0c;将Dot Value勾选上。这样在ref()修改变量时&#xff0c;会自动填充.value,无需…

电力负荷预测 | 基于ARIMA的电力负荷预测(Python)

文章目录 效果一览文章概述源码设计参考资料效果一览 文章概述 电力负荷预测 | 基于ARIMA的电力负荷预测(Python) 源码设计 #------------

第6节、T型加减速转动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本章介绍步进电机T型加减速的控制方法&#xff0c;分三个小节&#xff0c;本小节主要内容为该控制方法的推导与计算。目前各平台对该控制方法介绍的文章目前较多&#xff0c;但部分关键参数并未给出推导…

图解GPT2

GPT是一种Transformer Decoder架构&#xff0c;Decoder通过自回归方式生成下一个词&#xff0c;所以擅长文本生成任务。 本文将图解GPT2&#xff0c;本系列还有图解Tokenization&#xff0c;Word2Vec&#xff0c;Transformer&#xff0c;Bert。 这篇文章主要来自下面这篇博客。…

【C++】内存管理深入解析

目录 1. 内存的五大区域1.1 栈区&#xff08;Stack&#xff09;1.2 堆区&#xff08;Heap&#xff09;1.3 全局/静态存储区1.4 常量存储区1.5 代码区 2. 回顾c语言的动态内存管理2.1 malloc/calloc/realloc2.2 free 3. C中的新旧对话3.1 new3.2 delete 4. new/delete的实现原理…