C++中,main函数调用swap()后无效,怎么回事儿?

C++中,代码如下:#include<iostream>intswap(int,int);intmain(){inta=1,b=15;std::cout<<a<<""<<... C++中,
代码如下:
#include <iostream>
int swap(int,int);
int main()
{
int a=1,b=15;
std::cout<<a<<" "<<b<<std::endl;
swap(a,b);
std::cout<<a<<" "<<b<<std::endl ;
return 0;
}
int swap(int x,int y)
{
int z;
z=x;
x=y;
y=z;
return 0;
}
执行结果为:
1 15
1 15

问,为什么两个数没有调换?应该怎样实现?
展开
 我来答
小蚂蚁飘踩0m
2013-06-14
知道答主
回答量:5
采纳率:0%
帮助的人:5.7万
展开全部
你的int swap(int,int) 函数是传值,这个在实参代入函数的时候会拷贝一个临时副本给形参,内存地址是不一样的,不是用你本身实参在内存地址中实际存在的值,所以你swap函数是对临时副本的值做值交换,不会影响实际的a,b值。这里想交换a,b值的话,只要传递的是a,b所在实际内存地址的值就行了,可以有两种方法:传引用(直接是a,b做处理),传指针(传入a,b实际地址)
传指针:
#include <iostream>
int swap(int *,int *); //函数声明要改
int main()
{
int a=1,b=15;
std::cout<<a<<" "<<b<<std::endl;
swap(&a,&b); //这边使用注意,传入的是a,b地址
std::cout<<a<<" "<<b<<std::endl ;
return 0;
}
int swap(int *x,int *y) //函数定义要改
{
int z;
z=*x;
*x=*y;
*y=z;
return 0;
}

传引用:
#include <iostream>
int swap(int &,int &); //函数声明要改,其他不用改
int main()
{
int a=1,b=15;
std::cout<<a<<" "<<b<<std::endl;
swap(a,b);
std::cout<<a<<" "<<b<<std::endl ;
return 0;
}
int swap(int &x,int &y) //函数声明要改,其他不用改
{
int z;
z=x;
x=y;
y=z;
return 0;
}
zhuhuaizhong
2013-06-14 · TA获得超过7276个赞
知道大有可为答主
回答量:3978
采纳率:63%
帮助的人:3597万
展开全部

函数中的形参为局部变量,并且默认为传值方式,即 x,y 生成之后拷贝了 a,b 的值,你交换的是 x,y 而并非 a ,b ,可以改为引用形式传递或者使用指针。

int swap(int &x,int &y)
{
 int z;
 z=x;
 x=y;
 y=z;
 return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
云林之盟
2013-06-14 · 涵盖汽车、软件、医学等全方位知识体系
云林之盟
采纳数:166 获赞数:523

向TA提问 私信TA
展开全部
因为你写得函数只是两个数字在函数SWAP内部交换,形参交换了,并没用达到实参的交换,如果要传递给主函数的实参交换,应该是交换两个变量a和b的地址就行了。程序如下所示:
#include <iostream>
using namespace std;
void swap(int *,int *);
int main()
{
int a=1,b=15;
std::cout<<a<<" "<<b<<std::endl;
swap(&a,&b);
std::cout<<a<<" "<<b<<std::endl ;
return 0;
}
void swap(int *x,int *y)
{
int z;
z=*x;
*x=*y;
*y=z;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
CraZy_小猪
2013-06-18 · TA获得超过792个赞
知道小有建树答主
回答量:871
采纳率:55%
帮助的人:275万
展开全部
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <TCHAR.H>
#include <iostream>
#define STRUCT_LENTH sizeof(struct Select_Question)//结构体大小
#define DATAPATH "1.txt"//文件路径
#define QUESTION_TOTAL (10)//10道测试题
#define OPERATION_EXIT (0)//退出程序
#define OPERATION_ADD (1)//添加问题
#define OPERATION_DEL (2)//删除问题
#define OPERATION_MODIFY (3)//修改问题
#define OPERATION_TEST (4)//进行随机测试
#define OPERATION_SHOW (5)//将题库中的选择题显示出来
//定义一个结构体,用来记载选择题的id号,题目,选项以及答案
struct Select_Question{
char Subject[256];//题的内容
char SelectItem[256];//题的选项
char result;//答案
long id;//每道题的编号
struct Select_Question *next;//下一道题
};
long m_Total = 0;//题库中的题总数
long m_score = 0;//答题分数
void loaddata();//读取文件
long selectNum();//主界面选择
void add(void);//添加
void del(void);//删除问题
void modify(void);//修改问题
void show(void);//显示题库中的选择题
void test(char *p);//测试过程
void randomToTest();//进行随机测试
void write_info(Select_Question *p,FILE *fp);//将内存中的数据写入到txt文件中
void clear_screen(FILE* fp);//清屏操作
void count_score(char c,long* score);//统计分数
void get_max_id(Select_Question *p,long* MaxID);//取得当前题库中最大的id,->当追加选择题时将追加的选择题的id为:最大值+1
void get_all_id(long id[]);//取得题库中的所有id
Select_Question *head,*p1,*p2,*end;
/*主函数 */
int main(int argc, char* argv[])
{
long num = 0;
bool bRet = false;
while (1){
//选择输入的内容
num = selectNum();
//读取题库中的数据
loaddata();
switch(num){
case OPERATION_ADD://添加选择题
::system("cls");
add();
break;
case OPERATION_DEL://删除选择题
::system("cls");
del();
break;
case OPERATION_MODIFY://修改选择题
::system("cls");
modify();
break;
case OPERATION_TEST://进行随机测试
::system("cls");
randomToTest();
break;
case OPERATION_SHOW://将题库中的选择题显示出来
::system("cls");
show();
break;
case OPERATION_EXIT://退出程序
::system("cls");
return 0;
default:
::rewind(stdin);
::printf("\n 输入错误,请重新输入(0~5),:\n");
::rewind(stdin);
::rewind(stdin);
::system("cls");
}
}
return 0;
}
/*将题库中的选择题到主界面上*/
void show()
{
FILE *fp;
Select_Question *point=head;
if ((fp = ::fopen(DATAPATH,"r"))==NULL){//打开题库
::printf("文件不存在或者文件打开失败!\n");
return;
}
::printf("题库的内容如下(按任意键返回到主界面):\n");
while(point!=NULL)
{
if (point->id>0){
//将题库的内容输出到主界面上
::printf("%d %s %s %c\n",point->id,point->Subject,point->SelectItem,point->result);
}
//指向下一个节点
point = point->next;
}
clear_screen(fp);
return;
}
/*取得题库中的数据*/
void loaddata()
{
FILE *fp;
m_Total = 0;//取得题库总数前,先将变量清0
if ((fp = fopen(DATAPATH,"r"))==NULL){//打开题库
::printf("文件不存在或者文件打开失败!\n");
return;
}
head =p1= (struct Select_Question *)malloc(STRUCT_LENTH);
p1->next = NULL;
while(!feof(fp)){
//取得题库中的数据
::fscanf(fp,"%d%s%s%s",&(p1->id),&(p1->Subject),&(p1->SelectItem),&(p1->result));
if (p1->id <0){
break;
}
//申请一块内存给下一个节点使用
p2=(struct Select_Question *)malloc(STRUCT_LENTH);
p1->next =p2;
end=p1;
p1=p2;
p1->next =NULL;
m_Total++;
}
if (m_Total==0){
end = head;
end->next = NULL;
}
::system("cls");
::fclose(fp);
return;
}
/*删除某一道题*/
void del()
{
FILE *fp;//文件的指针
long Num = 0;//将要删除的id
Select_Question* point = head;//当前链表的首地址
long Exist_flag = 0;//标识题库中是否有将要删除的题
if ((fp = ::fopen(DATAPATH,"w+")) == NULL){
//打开文件失败的场合
::printf("题库读取失败!按任意键返回主界面!");
clear_screen(fp);
return;
}
while(point!=NULL)//point指针如果移动到链表的结尾的话,while循环结束
{
if ((point->id) >0){
//将题库中的所有题目显示出来
::printf("%d%s%s%c\n",point->id,point->Subject,point->SelectItem,point->result);
}
//移动到链表的下一个节点
point = point->next;
}
if (m_Total){//题库中的题存在时,可以进行删除的操作,否则不能进行删除的操作
::printf("请输入要删除的题的ID:\n");
::scanf("%d",&Num);
//point的指针指向链表的首地址
point = head;
while(point!=NULL)//point指针如果指向了链表的结尾,那么while循环结束
{
if (point->id ==Num){
//如果输入的id与题库中的id相吻合,那么该变量变成true
Exist_flag = 1;
}
else{
if ((point->id) >0){
//如果当前链表中的id与将要删除的id不相同,那么直接将该节点写入到txt文件中
::fprintf(fp,"%d %s %s %c\n",point->id,point->Subject ,point->SelectItem,point->result);
}
}
//移动到链表的下一个节点
point = point->next;
}
if (Exist_flag){
::printf("需要删除的选择题已经成功删除,按任意键返回主界面!");
}
else{
//题库中数据删除失败的时候
::printf("你输入的id与题库的id不吻合,按任意键返回主界面!");
clear_screen(fp);
return;
}
}
else{
//题库中不存在题时,没有可删除的题
::printf("题库没有题可删除,按任意键返回主界面!\n");
}
//关闭当前打开的文件
clear_screen(fp);
return;
}
/*menu select*/
long selectNum()
{
long Num = 0;
::printf("\t\t**************菜单**************\n");
::printf("\t\t\t1.增补题库\n");
::printf("\t\t\t2.删除题库\n");
::printf("\t\t\t3.修改题库\n");
::printf("\t\t\t4.随机测试(10道题)\n");
::printf("\t\t\t5.显示题库\n");
::printf("\t\t\t0.退出(任何情况下按Ctrl+C 退出程序)\n");
::printf("\n 输入你的选择(0~5):\n");
::scanf("%d",&Num);
return Num;
}
/*进行随机测试*/
void randomToTest()
{
if (!m_Total){
::printf("题库中没有选择题,按任意键返回主界面!\n");
::getch();
::system("cls");
return;
}
Select_Question *p=NULL;
char *str=NULL;
char *presult=NULL;
Select_Question *phead = head;
long id[1024];
::memset(id,0,sizeof(id));
long num=0;
long score=0;//记录每道题得的分数
long total=0;
long randomid=0;//从当前数组中取得id
m_score=0;
get_all_id(id);
for (int i=0;i<10;i++){
//取得一个随机数
num = rand();
//将随机数的范围控制在题库的范围内
num = num%(m_Total)+1;
randomid=id[num];
p = head;
while(p!= NULL){
//随机数与题库的id匹配成功时,输出选择题。
if (p->id==randomid){
//输出选择题目选项
::printf("%s\n%s\n",p->Subject,p->SelectItem);
::printf("请输入答案:\n");
break;
}
p = p->next;
}
count_score(p->result,&score);
//将每道题得的分数保存到全局变量中
m_score +=score;
//按任意键切换到下一题,清除当前答完的题
::getch();
::system("cls");
}
::system("cls");
::printf("答题结束!测试结果为:%d\n",m_score);
::printf("按任意键返回主界面!\n");
::getch();
::system("cls");
return;
}
/*取得题库中所有的id*/
void get_all_id(long id[])
{
FILE *fp;
int i=0;
Select_Question *point=head;
if ((fp = ::fopen(DATAPATH,"r"))==NULL){//打开题库
return;
}
while(point!=NULL)
{
if (point->id>0){
id[i]=(point->id);
i++;
}
//指向下一个节点
point = point->next;
}
::fclose(fp);
return;
}
/*统计分数*/
void count_score(char result,long *score)
{
if (score==NULL){
return;
}
int i=0;
char str;//输出
bool right=false;//记录当前的题是否答对
//给三次答题机会
for (i;i<3;i++){
::scanf("%s",&str);
if (str==result){
right=true;
::printf("回答正确,按任意键切换到下一题!");
break;
}
else{
right=false;
if (i!=2){
//第三次输入错误时直接显示答案,不提示重新输入
::printf("选择错误,请重新输入!\n");
}
else{
::printf("正确答案为:%c\n",result);
::printf("答题次数超过三次,按任意键切换到下一题!\n");
}
continue;
}
}
//当前题答对时,计算当前的分数
if (right==true){
switch(i){
case 0:
//第一次答对,得10分
*score=10;
break;
case 1:
//第二次答对得7分
*score=7;
break;
case 2:
//第三次答对得5分
*score=5;
break;
}
}
//答错时候得0分
else{
*score=0;
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式