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

文章详细描述了多个C语言编程练习,涉及函数定义、参数传递方式、数据类型、数组操作、三角形面积计算、素数判定、最大公约数和最小公倍数计算,以及字符串处理和算法分析。
摘要由CSDN通过智能技术生成

实验内容:

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

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

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CSU 大一上 C语言实验报告 (1)教材第2章编程题第2题:编写计算球体体积的程序。 说明:本题声明适当变量,用户键入数据,运算并输出结果,较简单。 (2)教材第2章编程题第8题:编写程序计算第一、第二、第三月还贷后剩余贷款金额。 说明:本题要求用户输入总额、利率、每月还贷净额,输出每月剩余,对输入输出、类型定义考查。 (3)教材第3章编程题第2题:编写程序实现对用户输入的产品信息进行格式化。 说明:本题考查格式化输入输出、转义字符的运用。 (4)教材第4章编程题第4题:编写程序实现将输入的整数按八进制输出。 说明:本题重在考查简单的运算符和表达式运用。 (5)用户输入一个三位数,输出各位数字之和。 说明:本题重在考查如何从一个整数中取出每一个数字。 (6)教材第5章编程题第5题:编写程序计算用户输入所得额的税金。 说明:本题考查简单的选择结构。 (7)教材第5章编程题第11题:编写程序实现将用户输入的两位数转化为英文。 说明:本题考查switch语句的应用。 (8)教材第6章编程题第8题:编写程序显示单月日历,用户指定这个月的天数和该月起始日是星期几。 说明:本题考查循环结构和选择结构的综合应用,判断是否一个星期最后一天,换行符。 (9)教材第6章编程题第11题:编程序实现利用无穷级数法估计e的值。 说明:本题考查根据公式设计循环结构并实现。 (10)因子之和等于其本身的数称为完数,如28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28为完数。编程序找出2~5000中的完数。 说明:本题利用变量i在2~5000中变化,判断其是否是完数。 (11)教材第7章编程题第12题:编程计算从左至右求值的表达式的值。 说明:本题考查对运算符和操作数的判断。 (12)教材第7章编程题第14题:编程序用牛顿计算法计算浮点数平方根。 说明:本题考查对循环结构的掌握,对表达式的合理运用,对基本类型的理解。 (13)教材第8章编程题第14题:编写程序颠倒句子中单词的顺序。 说明:本题考查对字符数组的处理,对一些循环选择结构的理解。 (14)教材第8章编程题第15题:编写程序实现凯撒密码加密。 说明:本题考查对字符数组的掌握,对字符处理的理解。 (15)编程序实现将用户输入的数字字符串转化为整数输出。 说明:本题考察对字符、整数关系的掌握与理解,对循环结构的熟练运用。 (16)教材第9章编程题第1题:编写选择排序的函数,并递归调用。 说明:本题利用函数简化程序、使得结构更清晰、熟练掌握。 (17)教材第9章编程题第7题:编写计算xn的函数。 说明:本题考查函数定义、调用,并初步考察递归运用。 (18)教材第10章编程题第6题:编写程序实现逆波兰运算。 说明:本题考查对程序每部分的理解、掌握,外部、内部变量,主函数,小函数的编写与应用。初步了解栈的一些实现函数。 (19)编程序找出2~5000中满足条件的数x:x是素数且x的每位数字是素数、每位数字之和是素数,如23、223、2333等。 说明:本题考查函数方法与循环选择结构的综合运用。 (20)教材第11章编程题第3题:用指针变量编写简化一个分数的函数。 说明:本题用来解决函数无法传回传递的实际参数,指针变量。 (21)教材第12章编程题第2题:编写函数读入用户输入的一条消息,检测是否是回文,分别用数组、指针来解决。 说明:本题可以体会到数组与指针的特点,利用指针的便利。 (22)利用指针编写程序,实现从键盘键入字符串,将此字符串从m个字符开始的n个字符复制成另一个字符串。 说明:本题用指针指向字符串,进行跟踪和复制操作。 (23)教材第13章编程题第5题:编写程序实现对输入命令行参数求和。 说明:本题加深对命令行参数的理解、考查知识的综合应用。 (24)教材第16章编程题第5题:用结构变量解决搜索离用户输入时间最近的航班信息,并输出。 说明:本题考查结构与数组的结合运用,有助于理解结构。首先,定义一个存储起飞、到达时间的结构,再定义一个该类型的数组,循环搜索即可。 (25)教材第17章编程题第5题:用指针数组存储键入的字符串,对数组排序。 说明:本题应用动态分配内存、数组排序,考查综合能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

了一li

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值