C语言及算法设计课程实验五:循环结构程序设计

简介: C语言及算法设计课程实验五:循环结构程序设计

1e3093ebc6b54cb5afac1e7591145e09.jpg

一、实验目的


84a5bf9995d14aa58b3aedad548d2e24.jpg


  • (1) 熟悉掌握用while语句.do-while语句和for语句实现循环的方法。
  • (2) 掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。
  • (3) 进一步学习调试程序。


二、实验内容


d1d64de1721d4c2b8594b67a99a2d706.jpg


编程序并上机调试运行。

2.1、统计字符个数

(1) 输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。在得到正确结果后,请修改程序使之能分别统计大小写字母、空格、数字和其他字符的个数。

2.2、输出所有的“水仙花数


(2) 输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于 该数本身。例如,153是一水仙花数,因为153= 1^3 + 5^3+3^3

2.3、猴子吃桃问题


(3) 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了 一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天 剩下的一半零一个。到第10天早上想再吃时,见只剩一个桃子了。求第1天共摘了多少桃 子。

在得到正确结果后,修改题目,改为猴子每天吃了前一天剩下的一半后,再吃两个。请修改程序并运行,检查结果是否正确。


2.4、牛顿迭代法求方程

⑷用牛顿迭代法求方程

85f2036f1c6a4faf90119cebefcb9a1a.png

在1. 5附近的根

在得到正确结果后,请修改程序使所设的x初始值由1.5改变为100,1000,10000,再运行,观察结果,分析不同的工初值对结果有没有影响,为什么?

修改程序,使之能输出迭代的次数和每次迭代的结果,分析不同的x初始值对迭代的次数有无影响。


三、实验步骤


c39840423ec44e7bad0d31981a0cd49e.jpg


编程序并上机调试运行。

3.1、循环结构程序设计实验题目一:统计字符个数

(1) 输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数。


  • 在得到正确结果后,请修改程序使之能分别统计大小写字母、空格、数字和其他字符的 个数。

1、定义变量

定义变量的代码如下所示


  /// <summary>
  /// 定义变量
  /// </summary>
  /// <returns></returns>
  char c;
  int letters = 0, space = 0, digit = 0, other = 0;


2、 输入一串字符

输入一串字符的代码如下所示

  /// <summary>
  /// 输入一串字符
  /// </summary>
  /// <returns></returns>
  printf("请输人一行字符:\n");

3、while循环处理输入的字符串

while循环处理输入的字符串的代码如下所示

  /// <summary>
  /// while循环处理输入的字符串
  /// </summary>
  /// <returns></returns>
  while ((c = getchar()) != '\n')
  {
    if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
      letters++;
    else if (c == ' ')
      space++;
    else if (c >= '0' && c <= '9')
      digit++;
    else
      other++;
  }

4、输出统计字符的个数

输出统计字符的个数的代码如下所示


  /// <summary>
  /// 输出统计字符的个数
  /// </summary>
  /// <returns></returns>
  printf("字母数:%d\n空格数:%d\n数字数:%d\n其他字符数:%d\n", letters, space, digit, other);


5、统计字符个数运行结果

统计字符个数的运行结果如下所示


5051450fa9de4897bdab52d1ec5806c6.jpg


3.2、循环结构程序设计实验题目二:输出所有的“水仙花数”

(2) 输出所有的“水仙花数”,所谓“水仙花数”是指一个3位数,其各位数字立方和等于该数本身。



  • 例如,153是一水仙花数,因为153= 1^3 + 5^3+3^3

1、定义变量

定义变量的代码如下所示

/// <summary>
  /// 定义变量
  /// </summary>
  /// <returns></returns>
  int i, j, k, n;
  int flowerNumber[4], index = 0;

2、用for循环分辨出水仙花数

用for循环分辨出水仙花数的代码如下所示

/// <summary>
  /// 用for循环分辨出水仙花数
  /// </summary>
  /// <returns></returns>
  for (n = 100; n < 1000; n++)
  {
    i = n / 100;
    j = n / 10 - i * 10;
    k = n % 10;
    if (n == i * i * i + j * j * j + k * k * k)
      flowerNumber[index++] = n;
  }


3、输出100-1000之间的水仙花数

用for循环分辨出水仙花数的代码如下所示


/// <summary>
  /// 输出100-1000之间的水仙花数
  /// </summary>
  /// <returns></returns>
  printf("100-1000之间的水仙花数是\n");
  for (i = 0; i < 4; i++)
  {
    printf("%d\t", flowerNumber[i]);
  }
  printf("\n\n");


4、水仙花数运行结果

水仙花数运行结果如下所示


b3ca3acf10594b9c9ecd4609719c62ee.jpg

3.3、循环结构程序设计实验题目三:猴子吃桃问题


(3) 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了 一个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天 剩下的一半零一个。到第10天早上想再吃时,见只剩一个桃子了。求第1天共摘了多少桃 子。


  • 在得到正确结果后,修改题目,改为猴子每天吃了前一天剩下的一半后,再吃两个。请修改程序并运行,检查结果是否正确。

1、定义变量

定义变量的代码如下所示


  /// <summary>
  /// 定义变量
  /// </summary>
  /// <returns></returns>
  int day, x1, x2;
  day = 9;
  x2 = 1;

2、while循环计算第1天共摘了多少桃子

while循环计算第1天共摘了多少桃子的代码如下所示

  /// <summary>
  /// while循环计算第1天共摘了多少桃子
  /// </summary>
  /// <returns></returns>
  while (day > 0) 
  {
    x1 = (x2 + 1) * 2;  //第1天的桃子数是第2天桃子数加1后的2倍
    x2 = x1;
    day--;
  }

3、输出猴子第1天共摘了多少桃子

输出猴子第1天共摘了多少桃子的代码如下所示


  /// <summary>
  /// 输出猴子第1天共摘了多少桃子
  /// </summary>
  /// <returns></returns>
  printf("第1天共摘了%d个桃子\n", x1);


4、猴子吃桃的运行结果

猴子吃桃的运行结果如下所示


6c63d2252c774e8da4682595200dba1a.jpg


3.4、循环结构程序设计实验题目四:牛顿迭代法求方程

⑷用牛顿迭代法求方程


85f2036f1c6a4faf90119cebefcb9a1a.png



在1. 5附近的根

在得到正确结果后,请修改程序使所设的x初始值由1.5改变为100,1000,10000,再运行,观察结果,分析不同的工初值对结果有没有影响,为什么?

修改程序,使之能输出迭代的次数和每次迭代的结果,分析不同的x初始值对迭代的次数有无影响。


1、定义变量

定义变量的代码如下所示

  /// <summary>
  /// 定义变量
  /// </summary>
  /// <returns></returns>
  double x1, x0, f, f1;
  x1 = 1.5;

2、while循环迭代法计算方程在1.5附近的根

while循环迭代法计算方程在1.5附近的根的代码如下所示

  /// <summary>
  /// while循环迭代法计算方程在1.5附近的根
  /// </summary>
  /// <returns></returns>
  do
  {
    x0 = x1;
    f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
    f1 = (6 * x0 - 8) * x0 + 3;
    x1 = x0 - f / f1;
  } while (fabs(x1 - x0) >= 1e-5);


3、输出方程的根

输出方程的根的代码如下所示


  /// <summary>
  /// 输出方程的根
  /// </summary>
  /// <returns></returns>
  printf("方程在1.5附近的根是:%5.2f\n", x1);


4、牛顿迭代法求方程的运行结果

牛顿迭代法求方程的运行结果如下所示


afd4ab9f58cf4023989827560ebb2c47.jpg


四、实验总结


c24d418d08dd41ee912fc1098879b7ec.jpg

本次通过C语言及算法设计课程实验五:循环结构程序设计,掌握了如下几点。

(1) 熟悉掌握用while语句.do-while语句和for语句实现循环的方法。

(2) 掌握在程序设计中用循环的方法实现一些常用算法(如穷举、迭代、递推等)。

(3) 进一步学习调试程序。


五、实验完整代码

115d4fbd67e14a758d7b563e5123ce39.jpg

5.1、循环结构程序设计实验题目一:统计字符个数的完整程序

完整程序如下所示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
  /// <summary>
  /// 定义变量
  /// </summary>
  /// <returns></returns>
  char c;
  int letters = 0, space = 0, digit = 0, other = 0;
  /// <summary>
  /// 输入一串字符
  /// </summary>
  /// <returns></returns>
  printf("请输人一行字符:\n");
  /// <summary>
  /// while循环处理输入的字符串
  /// </summary>
  /// <returns></returns>
  while ((c = getchar()) != '\n')
  {
    if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')
      letters++;
    else if (c == ' ')
      space++;
    else if (c >= '0' && c <= '9')
      digit++;
    else
      other++;
  }
  /// <summary>
  /// 输出统计字符的个数
  /// </summary>
  /// <returns></returns>
  printf("字母数:%d\n空格数:%d\n数字数:%d\n其他字符数:%d\n", letters, space, digit, other);
  return 0;
}

5.2、循环结构程序设计实验题目二:输出所有的“水仙花数”的完整程序

完整程序如下所示

#define _crt_secure_no_warnings
#include <stdio.h>
int main()
{
  /// <summary>
  /// 定义变量
  /// </summary>
  /// <returns></returns>
  int i, j, k, n;
  int flowernumber[4], index = 0;
  /// <summary>
  /// 用for循环分辨出水仙花数
  /// </summary>
  /// <returns></returns>
  for (n = 100; n < 1000; n++)
  {
    i = n / 100;
    j = n / 10 - i * 10;
    k = n % 10;
    if (n == i * i * i + j * j * j + k * k * k)
      flowernumber[index++] = n;
  }
  /// <summary>
  /// 输出100-1000之间的水仙花数
  /// </summary>
  /// <returns></returns>
  printf("100-1000之间的水仙花数是\n");
  for (i = 0; i < 4; i++)
  {
    printf("%d\t", flowernumber[i]);
  }
  printf("\n\n");
  return 0;
}


5.3、循环结构程序设计实验题目三:猴子吃桃问题的完整程序

完整程序如下所示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
  /// <summary>
  /// 定义变量
  /// </summary>
  /// <returns></returns>
  int day, x1, x2;
  day = 9;
  x2 = 1;
  /// <summary>
  /// while循环计算第1天共摘了多少桃子
  /// </summary>
  /// <returns></returns>
  while (day > 0) 
  {
    x1 = (x2 + 1) * 2;  //第1天的桃子数是第2天桃子数加1后的2倍
    x2 = x1;
    day--;
  }
  /// <summary>
  /// 输出猴子第1天共摘了多少桃子
  /// </summary>
  /// <returns></returns>
  printf("第1天共摘了%d个桃子\n", x1);
  return 0;
}


5.4、循环结构程序设计实验题目四:牛顿迭代法求方程

完整程序如下所示

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
  /// <summary>
  /// 定义变量
  /// </summary>
  /// <returns></returns>
  double x1, x0, f, f1;
  x1 = 1.5;
  /// <summary>
  /// while循环迭代法计算方程在1.5附近的根
  /// </summary>
  /// <returns></returns>
  do
  {
    x0 = x1;
    f = ((2 * x0 - 4) * x0 + 3) * x0 - 6;
    f1 = (6 * x0 - 8) * x0 + 3;
    x1 = x0 - f / f1;
  } while (fabs(x1 - x0) >= 1e-5);
  /// <summary>
  /// 输出方程的根
  /// </summary>
  /// <returns></returns>
  printf("方程在1.5附近的根是:%5.2f\n", x1);
  return 0;
}

676e3f4baaf34f15854b911032bc0ba1.jpg


相关文章
|
26天前
|
存储 C语言
C语言程序设计核心详解 第十章:位运算和c语言文件操作详解_文件操作函数
本文详细介绍了C语言中的位运算和文件操作。位运算包括按位与、或、异或、取反、左移和右移等六种运算符及其复合赋值运算符,每种运算符的功能和应用场景都有具体说明。文件操作部分则涵盖了文件的概念、分类、文件类型指针、文件的打开与关闭、读写操作及当前读写位置的调整等内容,提供了丰富的示例帮助理解。通过对本文的学习,读者可以全面掌握C语言中的位运算和文件处理技术。
|
26天前
|
存储 C语言
C语言程序设计核心详解 第七章 函数和预编译命令
本章介绍C语言中的函数定义与使用,以及预编译命令。主要内容包括函数的定义格式、调用方式和示例分析。C程序结构分为`main()`单框架或多子函数框架。函数不能嵌套定义但可互相调用。变量具有类型、作用范围和存储类别三种属性,其中作用范围分为局部和全局。预编译命令包括文件包含和宏定义,宏定义分为无参和带参两种形式。此外,还介绍了变量的存储类别及其特点。通过实例详细解析了函数调用过程及宏定义的应用。
|
26天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第八章 指针超详细讲解_指针变量_二维数组指针_指向字符串指针
本文详细讲解了C语言中的指针,包括指针变量的定义与引用、指向数组及字符串的指针变量等。首先介绍了指针变量的基本概念和定义格式,随后通过多个示例展示了如何使用指针变量来操作普通变量、数组和字符串。文章还深入探讨了指向函数的指针变量以及指针数组的概念,并解释了空指针的意义和使用场景。通过丰富的代码示例和图形化展示,帮助读者更好地理解和掌握C语言中的指针知识。
|
26天前
|
存储 人工智能 C语言
C语言程序设计核心详解 第六章 数组_一维数组_二维数组_字符数组详解
本章介绍了C语言中的数组概念及应用。数组是一种存储同一类型数据的线性结构,通过下标访问元素。一维数组定义需指定长度,如`int a[10]`,并遵循命名规则。数组元素初始化可使用 `{}`,多余初值补0,少则随机。二维数组扩展了维度,定义形式为`int a[3][4]`,按行优先顺序存储。字符数组用于存储字符串,初始化时需添加结束符`\0`。此外,介绍了字符串处理函数,如`strcat()`、`strcpy()`、`strcmp()` 和 `strlen()`,用于拼接、复制、比较和计算字符串长度。
|
26天前
|
存储 C语言
C语言程序设计核心详解 第九章 结构体与链表概要详解
本文档详细介绍了C语言中的结构体与链表。首先,讲解了结构体的定义、初始化及使用方法,并演示了如何通过不同方式定义结构体变量。接着,介绍了指向结构体的指针及其应用,包括结构体变量和结构体数组的指针操作。随后,概述了链表的概念与定义,解释了链表的基本操作如动态分配、插入和删除。最后,简述了共用体类型及其变量定义与引用方法。通过本文档,读者可以全面了解结构体与链表的基础知识及实际应用技巧。
|
存储 算法 C语言
二十个一乘以二十个二等于多少?C语言经典算法设计之大数乘法
二十个一乘以二十个二等于多少?C语言经典算法设计之大数乘法
1659 0
|
23天前
|
存储 Serverless C语言
【C语言基础考研向】11 gets函数与puts函数及str系列字符串操作函数
本文介绍了C语言中的`gets`和`puts`函数,`gets`用于从标准输入读取字符串直至换行符,并自动添加字符串结束标志`\0`。`puts`则用于向标准输出打印字符串并自动换行。此外,文章还详细讲解了`str`系列字符串操作函数,包括统计字符串长度的`strlen`、复制字符串的`strcpy`、比较字符串的`strcmp`以及拼接字符串的`strcat`。通过示例代码展示了这些函数的具体应用及注意事项。
|
1月前
|
Linux C语言
C语言 多进程编程(三)信号处理方式和自定义处理函数
本文详细介绍了Linux系统中进程间通信的关键机制——信号。首先解释了信号作为一种异步通知机制的特点及其主要来源,接着列举了常见的信号类型及其定义。文章进一步探讨了信号的处理流程和Linux中处理信号的方式,包括忽略信号、捕捉信号以及执行默认操作。此外,通过具体示例演示了如何创建子进程并通过信号进行控制。最后,讲解了如何通过`signal`函数自定义信号处理函数,并提供了完整的示例代码,展示了父子进程之间通过信号进行通信的过程。
|
1月前
|
C语言
C语言 字符串操作函数
本文档详细介绍了多个常用的字符串操作函数,包括 `strlen`、`strcpy`、`strncpy`、`strcat`、`strncat`、`strcmp`、`strncpy`、`sprintf`、`itoa`、`strchr`、`strspn`、`strcspn`、`strstr` 和 `strtok`。每个函数均提供了语法说明、参数解释、返回值描述及示例代码。此外,还给出了部分函数的自实现版本,帮助读者深入理解其工作原理。通过这些函数,可以轻松地进行字符串长度计算、复制、连接、比较等操作。
|
1月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
下一篇
无影云桌面