【C语言初阶(20)】调试练习题

news2024/12/24 2:35:10

文章目录

  • 前言
  • 实例1
  • 实例2

前言

  • 在我们开始调试之前,应该有个明确的思路;
  • 程序是如何完成工作的、变量到达某个步骤时的值应该是什么、出现的问题大概会在什么位置。
  • 这些东西在调试之前都需要先确认下来,不然自己都不知道自己在调试个什么东西了。

实例1

题目内容

  • 求 1!+2!+3! …+ n! ;不考虑溢出。

使用调试分析出下面代码的问题是什么

  • 注意:不要用经验来判断问题出在哪,全当第一次遇见这些代码,光瞪眼肯定是没法解决问题的。
int main()
{
	int i = 0;
	int sum = 0;			//保存最终结果
	int n = 0;
	int ret = 1;			//保存 n 的阶乘
	scanf("%d", &n);		//输入 3,结果应该是:1! + 2! +3! = 9
	
	for(i=1; i<=n; i++)
	{
		int j = 0;
		
		for(j=1; j<=i; j++)
		{
			ret *= j;
		}
		sum += ret;		//将 1 到 i 之间的数字累乘到 ret 上去就是 i 的阶乘
	}
	
	printf("%d\n", sum);
	
	return 0;
}
  • 结果显然和我们想象中的有所出入。

在这里插入图片描述

调试分析

  • 调试过程中,我们需要观察 sum、ret、i、n 、j 这几个变量的值的变化。
    • 调试过程中需要我们先给 n 输入一个值,此时已经给了个 3 给 n。

在这里插入图片描述

  • 第一次循环,i 初始化为 1,j 初始化为 1,满足条件 j <= i,进入内层循环。将 j = 1 乘到 ret 上,此时 ret 变为 1。

在这里插入图片描述

  • 内循环完一遍之后 j++ 变成了 2。2 <= i 的条件就不成立了,将算出的 1 的阶乘 + 到 sum 上去。此时 sum 变成了 1.

在这里插入图片描述

  • 求完一遍阶乘之后,令 i++ 变成了 2,那么内循环就要算出 2 的阶乘,重新令 j 初始化为 1,满足循环条件,将 j = 1 乘到 ret 上去,ret 的结果也是 1。

在这里插入图片描述

  • 然后 j++ 变成 了 2,将 j = 2 乘 到 ret 上,此时 ret 就变成了 2。

在这里插入图片描述

  • j++ 变成了 3,不满足循环条件 j <= i,退出循环,然后将 ret = 2 累加到 sum 上去,此时 sum 变成了 3。目前为止还没有任务问题。

在这里插入图片描述

  • 累加完了之后让 i++ 变成了 3,满足 i <= n(3) 的条件,现在要求 3 的阶乘。让 j 初始化为 1 从 1 开始 一直乘到 3。将 1 乘给 ret 之后发现,ret 的值变成 2,开始有点不对劲了。

在这里插入图片描述

  • j++ 变成 2,将 j = 2 乘 给 ret 此时 ret 变成了 4,然后 j++ 变成了 3,将 3 继续乘到 ret 上,此时 ret 变成了 12,ret = 12 明显不是 3 的阶乘。所以问题应该就是出在这里了。
  • 因为 ret 是在循环体外面创建的,在循环过程中 ret 的值被改了就回不到 1 了,用会变的值来进行累乘,结果肯定不如人意了。

在这里插入图片描述
在这里插入图片描述

  • 最终将 ret = 12 加到 sum 上去 3 + 12 结果 15 就这么出来了。

在这里插入图片描述

代码修改

  • 将在循环体外部的 ret 放到循环体内部,每次循环完一轮之后都让 ret 的值重新变回 1,就不会影响最终结果了。

在这里插入图片描述

实例2

分析下面代码出现死循环的原因

  • 前提:该代码仅限在 VS + X86 环境 + Debug 模式下验证。
#include <stdio.h>

int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	for(i=0; i<=12; i++)
	{
		arr[i] = 0;
		printf("hello word!\n");
	}
	
	return 0;
}

在这里插入图片描述

调试分析

  • 很明显数组访问是直接越界了,但是前面 9 次的赋值是没有问题的。

在这里插入图片描述

  • 再观察 i 的值,在数组越界到 10、11 的时候,i 的值都还算正常。可唯独到了 arr[12] 的时候,i 的值居然被改成 0;
  • 也就是说,i 和 arr[12] 挂上了钩,arr[12] 只要被赋值成 0,i 也会被改成 0,i 无法自增到 13 自然就无法退出循环直接就导致死循环了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 此时再观察 arr[12] 以及 i 的地址会发现,这两个家伙在你不知情的情况下已经住到同一个地址去了,难怪将 arr[12] 改为 0 会让 i 也跟着一块变。

在这里插入图片描述

代码分析

  • 现在要创建一个局部变量 i ,为 i 在栈上先分配一块空间;
  • 然后再创建数组 arr ,为 arr 分配一快空间;
  • 局部变量都是按照的方式(从搞地质向低地址使用)创建的,也就是说先被创建出来的 i 在内存中 在 arr 数组的下面。

在这里插入图片描述

  • 数组按照往下越界得情况来看的话,arr[12] 刚好就越界到了 i 所在的空间。
  • 前提中提到过的特殊情况下,先创建的 i 与 后创建的 arr 数组之间就是隔着两个整型的空间,所与才会越界越着越着就让摸到 i 了。

在这里插入图片描述

问题解决方案

  • 这段代码最大的问题就是数组的越界访问,没啥可说的,把这个改过来就行了。
#include <stdio.h>

int main()
{
	int i = 0;
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	
	for(i = 0; i < 10; i++)
	{
		arr[i] = 0;
		printf("hello word!\n");
	}
	
	return 0;
}

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

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

相关文章

IT服务管理学习笔记<一>

### IT服务管理知识整理 ITSM 的核心思想是&#xff0c;IT 组织&#xff0c;不管它是企业内部的还是外部的&#xff0c;都是 IT 服务提供者&#xff0c;其 主要工作就是提供低成本、高质量的 IT 服务。 ITSM 的核心思想是&#xff0c;IT 组织&#xff0c;不管它是企业内部的还…

中国农村大学生学习了这个【React教程】迎娶导师女儿,出任CEO走上人生巅峰

注&#xff1a;最后有面试挑战&#xff0c;看看自己掌握了吗 文章目录 React创建一个简单的 JSX 元素创建一个复杂的 JSX 元素在 JSX 中添加注释渲染 HTML 元素为 DOM 树 &#x1f338;I could be bounded in a nutshell and count myself a king of infinite space. 特别鸣谢…

《数据同步-NIFI系列》Nifi配置DBCPConnectionPool连接SQL Server数据库

Nifi配置DBCPConnectionPool连接SQL Server数据库 一、新增DBCPConnectionPool 在配置中新增DBCPConnectionPool&#xff0c;然后配置数据库相关信息 二、配置DBCPConnectionPool 2.1 DBCPConnectionPool介绍 主要介绍以下五个必填参数 Database Connection URL&#xff1…

简历上的项目,需要这样描述才有亮点!

作者&#xff1a;小傅哥 博客&#xff1a;https://bugstack.cn 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; 一、前言&#xff1b;豆包不是干粮 每每准备面试&#xff0c;总有些小伙子甩出自己的豆包项目&#xff0c;不是Xxx管理系统&…

绝绝子,这所211无歧视!极其保护一志愿!专硕爆冷全部录取!

一、学校及专业介绍 大连海事大学&#xff08;Dalian Maritime University&#xff09;&#xff0c;简称海大&#xff0c;位于辽宁省大连市&#xff0c;是中华人民共和国交通运输部所属的全国重点大学&#xff0c;位列国家“双一流”、“211工程”重点建设高校。 1.1 招生情况…

HJ99 自守数+OR86N 返回小于N的质数个数

HJ99 自守数 自守数_牛客题霸_牛客网 (nowcoder.com) #include <iostream> #include<cmath> using namespace std; bool Ending_Same(int a) {int a_a a * a;if (a_a a)return true;int i 1;while (a_a ! 0 && a_a/ (int)pow(10, i)!0)//保证a*a有足够…

SBFI AM(Na+Indicator),129423-53-6,可用来预测纯化线粒体Na+梯

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ SBFI AM(NaIndicator)钠离子荧光探针 PART1----​Product structure&#xff1a; PART2----​Product specifications&#xff1a; 1.CAS No&#xff1a;129423-53-6 2.Molecular formula&#xff1a;C56H58N2O23 3.Molec…

算法:HJ27 查找兄弟单词

描述 定义一个单词的“兄弟单词”为&#xff1a;交换该单词字母顺序&#xff08;注&#xff1a;可以交换任意次&#xff09;&#xff0c;而不添加、删除、修改原有的字母就能生成的单词。 兄弟单词要求和原来的单词不同。例如&#xff1a; ab 和 ba 是兄弟单词。 ab 和 ab 则…

职业发展规划指南:如何成为成功的产品经理

导语&#xff1a;产品经理是当今互联网时代最炙手可热的职位之一。作为连接技术、商业和用户需求的桥梁&#xff0c;产品经理在公司中扮演着至关重要的角色。本文将为你提供一些关于产品经理职业发展的规划指南&#xff0c;帮助你在这个领域取得成功。 掌握核心技能&#xff1…

修复navicat 不可用

第一步&#xff1a;关闭Navicat 第二步&#xff1a;打开注册表编辑器&#xff0c;win R, 输入regedit 第三步&#xff1a; 在最上方搜索框输入HKEY_CURRENT_USER\Software\PremiumSoft\NavicatPremium 将Registration15XCS文件夹 和 Update文件夹删除 第四步&#xff1a; 在…

Jenkins工具系列 —— Jenkins 安装并启动

文章目录 安装涉及相关链接选择安装Jenkins版本安装JenkinsJenkins web页面启动 安装涉及相关链接 Jenkins官网&#xff1a; https://www.jenkins.io/zh/ Jenkins下载安装步骤&#xff1a; https://www.jenkins.io/zh/download/ 安装各种版本OpenJDK&#xff1a; https://blog…

netty3和netty4 的区别

netty3和netty4 的区别 目录概述需求&#xff1a; 设计思路实现思路分析1.区别 拓展实现性能参数测试&#xff1a; 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better…

SpringBoot项目中使用Lombok插件中Slf4j日志框架

前言&#xff1a;idea需要安装lombok插件&#xff0c;因为该插件中添加了Slf4j注解&#xff0c;可以将Slf4j翻译成 private static final org.slf4j.Logger logger LoggerFactory.getLogger(this.XXX.class); springboot本身就内置了slf4j日志框架&#xff0c;所以不需要单独…

Vue前端框架入门

文章目录 Vue快速入门Vue指令生命周期 Vue 经过一小段时间学习 我认为vue就是在原js上进行的一个加强 简化JS中的DOM操作 vue是分两个层的 一个叫做视图层(View)&#xff0c;你可以理解为展现出来的前端页面 一个叫数据模型层(Model),包含数据和一些数据的处理方法 MVVM就是实…

热度升温 SSOT上海国际智慧办公展览会精彩预告福利放送

上海国际智慧办公展览会&#xff08;SSOT&#xff09;是智慧办公及商用空间智能化解决方案及技术应用的专业平台&#xff0c;本届展会除了将“智联”智能行业&#xff0c;同时会以“智越”为题&#xff0c;与行业共建跨越行业界限之桥梁。 展会将融合应用智慧办公、智慧地产、智…

Flask中flask-session

Flask中flask-session Flask-Session是一个为Flask应用程序开发的工具&#xff0c;允许您轻松处理服务器端会话。会话是存储和追踪用户特定数据的方式。例如&#xff0c;当用户登录到应用程序时&#xff0c;他们的状态&#xff08;即登录状态&#xff09;可以保存在会话中&…

搞清楚 Windows C/C++ 编程中各种编码

最近编写程序,中文乱码问题让很多同学很头疼,那么今天黄老师来帮大家剖析一下: 以 “好人“ 两个字为例: 等会我们使用代码跟踪内存,来查看字节的编码: 先上代码: #include<stdio.h> #include<stdlib.h> #include<windows.h>char * ConvertUT…

PHP-Mysql好运图书管理系统--【白嫖项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 首页必要的项目知识ThinkPHP的MVCThinkTemplateThinkPHP 6和ThinkPHP 5 phpStudy 设置导数据库前台展示页面后台的管理界面数据库表结构项目目录如图&#xff1a;代码部分&a…

模型法在初中物理中的实例与应用

摘要&#xff1a;模型法是初中物理解题的重要方法&#xff0c;它的优点有方便快捷&#xff0c;易于理解等。文章通过列举模型法在初中物理解题时应用的例子&#xff0c;与模型法在学习与生活中的实际应用&#xff0c;说明了模型法可用性高&#xff0c;易于理解&#xff0c;能让…

UNIX网络编程卷一 学习笔记 第二十六章 线程

在传统UNIX模式中&#xff0c;当一个进程需要另一个实体完成某事时&#xff0c;它就fork一个子进程&#xff0c;并让子进程去执行处理&#xff0c;Unix上大多网络服务器程序就是这么写的。 这种范式多年来一直用得很好&#xff0c;但fork调用存在一些问题&#xff1a; 1.fork调…