1) 阅读并调试下面程序,并根据程序运行结果进行分析

1) 阅读并调试下面程序,并根据程序运行结果进行分析,第1张

这个c++程序看起来像一个可以实现x与y的值互换的程序,但实际上却没这种效果,运行之后x还是为5,y还是10。问题是出在这个void Swap(int a, int b)

子函数上。

调用这个子函数的时候只是把x与y的值复制了一份传给了a,b。

在这个子函数上面确实是实现了a与b的值互换,但这没有什么意义,交换后的值并没有传回主函数,而且子函数也不可以一次回传两个数值。

如果要实现x与y的值互换我们必须把x与y的地址传过去才能实现x与y的值互换

具体应该这么写

#include<iostream>

using namespace std;

void Swap(int a, int b);

void main()

{

int x(5), y(10);

cout<<"x="<<x<<" y="<<y<<endl;

Swap(&x,&y);

cout<<"x="<<x<<" y="<<y<<endl;

}

void Swap(int a, int b)

{

int t;

t=a;

a=b;

b=t;

}

这样就把x与y的地址传递到了子函数中,直接在地址中对x与y的值进行交换也就不用回传x,y的值了。

#define来定义宏的时候要注意最好把宏中的参数分别用括号括起来,如#define gpj n/(n+1) 应写成#define gpj ((n)/(n+1)),否则有可能导致错误。楼主的就是这样导致的。

因为用#define定义宏仅仅只是一个替换,如程序中if(j>100ps) ,如果按楼主定义的话编译时会替换为if(j<(100n/(n+1)))这句实际上跟楼主的意思有差别。楼主希望先算n/(n+1)的值,再与100相乘,但实际上是先100与n相乘,再除以(n+1),因为两个int型做除法时结果会取整,因此这两种算法的结果可能不一样。其他宏定义也类似。

将宏定义写成#define gpj ((n)/(n+1))这种形式后,在调试就可以看到,调试结果和输出结果是一样的了。

STACK SEGMENT STACK

DW 64 DUP() ;定义栈段。长度为字型(2字节)64=128个字节

STACK ENDS

CODE SEGMENT

ASSUME CS:CODE

START: MOV DX,0001H ;给DX赋值1

MOV BL,02Hd d ;给bx 16位寄存器

。低八位BL赋值十六进制的2H

A1: MOV AL,BL ;把BL给AL

INC BL ;BL自加1

MUL BL ;ALBL 结果放在ax中

ADD DX,AX ;AX和DX相加

CMP AX,00C8H ;比较AX和00c8的值相等返回0,大于返回1小雨返回-1

JNA A1 ;返回值大于0 跳回A1处继续循环。

A2: INT 03H ;三号中断 结束程序。

CODE ENDS

END START

b ! 程序:

void swap(int a, int b)

{ int t;

t=a; a=b; b=t;

}

的功能就是交换a,b的值!

所以输出为 3 5 5 3

这个程序本身就没有错啊!!只是要保持一个好习惯调用函数之前要先声明

至于运行结果为什么会是这样呢前三次的reset函数的调用对i都是没有用的,因为输出的是i的值,所以i=5,i=2,i=2(第二次的时候i被赋值为i/2=2)之后调用workover,在workover中,i(此时为2)被赋值(i%i)((ii)/(2i)+4),因为i%i的值为0,则该式为0((ii)/(2i)+4), 故为0,所以在workover中输出i的值为0接着在主函数中,输出i的值为2

故运行结果为

i=5

i=2

i=2

i=0

i=2

/大概要求,a和b二个数组, a,b数组都从键盘中输入

1,字母大小写转换函数,将字符指针P所指字符中的小写字母转换为大写字母,无返回值(函数要求用指针来 *** 作字符串);void Converst(char p);

2,字符串连接函数,将字符指针p2所指的字符串连接到指针p1所指的字符串后面去,无返回值,不得用strcat()。

void Cat(char p1,const char p2);

3,主函数中调用Converst()函数将a的小写字母转换为大写字母,并输出a,在比较二个字符串的大小,将值较大的字符串连接到值较小的字符串后面,并输出连接后的字符串。

/

#include <stdioh>

#include <stringh>

#include <ctypeh>

void Convert(char p)

{

while(p!='\0')

{

if(islower(p))/判断是否是小写字母/

p = toupper(p);/是就转换成对应的大写字母/

p++;

}

}

void Cat(char p1, const char p2)

{

while(p1!='\0') p1++;/找到第一个字符串的末尾/

while((p1=p2)!='\0')/把第二个字符串逐个字符复制到第一个字符串末尾直到到达第二个字符末尾/

p1++, p2++;

}

int main()

{

char a[1000], b[1000];

printf("请输入一个字符串:\n");

gets(a);

printf("请再输入一个字符串:\n");

gets(b);

Convert(a);

printf("%s\n", a);

if(strcmp(a,b)<0)/比较字符串大小/

{

Cat(a,b);

printf("%s\n", a);

}

else

{

Cat(b,a);

printf("%s\n", b);

}

return 0;

}

第二行输出不是5,也不是7,应该是4

x+=z>yz--:y++ //这个表达式里面"+="的优先级是最低的,所以等价于

x+=(z>yz--:y++)

验证下:

以上就是关于1) 阅读并调试下面程序,并根据程序运行结果进行分析全部的内容,包括:1) 阅读并调试下面程序,并根据程序运行结果进行分析、程序调试的结果和输出的结果不一样、要一个简单的汇编循环程序的调试结果(最好截图,并分析一下结果是什么)和全部注释,谢谢~~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10134864.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存