简单的C语言问题。。求纠错。。在线等

大致题目描述:
求A、B两个集合的差集。即输入两个自然数集合A,B,输出所有属于A不属于B的元素。
其中A、B输入的元素以空格分隔,-1表示输入结束,两集合各自不含重复元素。

【样例输入】
2 8 3 4 -1
6 1 4 9 -1
【样例输出】
2 8 3

我的代码:
#include<stdio.h>
int main()
{
int i,j,m,n,a[50],b[50];
for(i=0;a[i]!=-1;i++)
scanf("%d",&a[i]);
m=i;
for(j=0;b[j]!=-1;j++)
scanf("%d",&b[j]);
n=j;
for(i=0;i<m;i++){
for(j=0;j<m;j++){
if(a[i]==b[j])
i++;
}
printf("%d ",a[i]);
}
printf("\n");
return 0;
}

求纠错。。。具体指出错在哪,顺道帮我改下。。谢谢

#include<stdio.h>
int main()
{
int i,j,m,n,a[50],b[50];
/************found******/
for(i=0;a[i-1]!=-1;i++)
scanf("%d",&a[i]);
m=i;
/************found******/
for(j=0;b[j-1]!=-1;j++)
scanf("%d",&b[j]);
n=j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(a[i]==b[j])
//按照你的算法的话如输入 3 4 2 5 -1 \n 2 3 4 5 -1 \n则2会被打印出来,还会输出a[5]的值(随机值),之前并没有给a[5]赋值
break;
else if(j==n - 1)
printf("%d ",a[i]);
}
}
printf("\n");
return 0;
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-12-06
你这里面有两个问题:
1)
for(i=0;i<m;i++){
for(j=0;j<m;j++){ //这里应该是j<n吧
2)
if(a[i]==b[j])
i++; //这里的逻辑有问题。如果a[i] == b[j],表示a[i]存在B中,i加1的时候,j没有变换。 //a[i+1]可能和前面的b[0]~b[j]相等啊 这里的逻辑有问题。建议是把j也重新赋值(j = -1,因为j要执行++操作),同时注意判断i的范围不要越界。

楼上提到的输入部分,确实也是有问题的。

希望能帮到你!
第2个回答  2011-12-06
#include<stdio.h>
int main()
{
int i,j,m,n,a[50],b[50];
for(i=0;a[i]!=-1;i++) //a[i]!=-1判断在先,a[i]赋值在后
{
scanf("%d",&a[i]);
if (a[i]==-1) //内部弄个跳出的,下同
break;
}
m=i;
for(j=0;b[j]!=-1;j++)
{
scanf("%d",&b[j]);
if (b[j]==-1)
break;
}
n=j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++) //j<n不是m
{
if(a[i]==b[j])
i++;
}
if(i<m) //要不然会输出最后的-1
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
第3个回答  2011-12-06
4处错误:
首先,for(i=0;a[i]!=-1;i++)
scanf("%d",&a[i]);中的判断条件有误,因为每次执行后i值相应的加1,使得条件会不断循环直至数组大小越界。第二个scanf有同样的问题。
其次,for(j=0;j<m;j++)的应该改为 for(j=0;j<n;j++)这样才能遍历数组b[]中的元素。
最后,判断差集的提交不够完善。先代码改动如下(已测试)
#include<stdio.h>
int main()
{
int i,j,m,n;
int a[50]={0};
int b[50]={0};
int tmp = 0;
int iFlag = 0;//标志位
for(i=0;tmp!=-1;i++)
{
scanf("%d",&a[i]);
tmp = a[i];
}
m=i;
tmp = 0;
for(j=0;tmp!=-1;j++)
{
scanf("%d",&b[j]);
tmp = b[j];
}
n=j;
for(i=0;i<m;i++){
for(j=0;j<n;j++){
if(a[i]==b[j])
{
//i++;
iFlag = 1;
break;
}
}
if (iFlag != 1)
{
printf("%d ",a[i]);
}
}
printf("\n");
return 0;
}追问

为什么换组数测试就不对了。。比如
2 8 4 3 5 6 -1
2 4 6 -1

第4个回答  2011-12-06
不知道你遇到的错误是什么,但是输入数集用do{}while();比较好,或许会解决错误,然后
for(i=0;i<m;i++){
for(j=0;j<m;j++){
if(a[i]==b[j])
i++;
}
其中第二个for循环中m改为n
第5个回答  2011-12-06
错了太多地方,楼上的也都有一些问题,
我改好的代码如下,有不明白的就问吧:
#include<stdio.h>
#include<conio.h>

int main()
{
int i=0,j=0,m=0,n=0,a[50]={0},b[50]={0};
int flag=0;
char ch;

// for(i=0;a[i]!=-1;i++)
// scanf("%d",&a[i]);
// m=i;
// for(j=0;b[j]!=-1;j++)
// scanf("%d",&b[j]);
// n=j;

do
{
ch=getchar();

if(ch=='-') break;
else if(ch==' ')
{
i++;
m++;
}
else a[i]=a[i]*10+(ch-'0');
}while(1);

fflush(stdin);

do
{
ch=getchar();

if(ch=='-') break;
else if(ch==' ')
{
j++;
n++;
}
else b[j]=b[j]*10+(ch-'0');
}while(1);

for(i=0;i<m;i++){
flag=0;
for(j=0;j<n;j++){
if(a[i]==b[j])
flag=1;
}
if(flag==0) printf("%d ",a[i]);
}
printf("\n");
return 0;
}

C语言命令问题..急..在线等
显示:alt+f5 编辑按f9查错 回菜单:f10 1.在程序编辑完后按f9进行编译 2.要返回编辑窗口修改 程序,按f6,修改后运行编辑 3.要运行程序可选择RUM菜单中的RUN命令,也可用快捷键ctrl+f9 4.观察结果alt+f5。f2是保存。其他都忘记了。上学时的笔记上就记了这么多,你看着用吧。我刚翻出我的c程...

C语言简单代码求纠错
所以需要包含进math.hmain(){ float a, b, c, x1, x2, m, p, q, delta; printf("Please enter the coefficient for the quadratic function:"); printf("a="); scanf("%f", &a); printf("b="); scanf

用c语言求完全数,求纠错
printf("%d是完全数字!\\n",&sum); 改成printf("%d是完全数字!\\n",sum);输出不需要取地址符

C语言求,在线等急请编写程序,纠正录入的英文语句中出现的大小写拼写错...
include<stdio.h>int main(){int i=1;char s[100];gets(s);while(s[i]!='\\0'){if(s[i]>='A'&&s[i]<='Z')s[i]=s[i]+32;i++;}puts(s);return 0;} 有疑问欢迎私聊我

c语言求阶乘问题,希望高手指导本菜鸟改错,在线等,不胜感激
include <stdio.h>\/\/求一个数的阶乘,结果对10007取余int main(){ int N;int input[100];int i; unsigned long fac(int n);N = 0;while(scanf("%d",&input[N])&&(input[N]!=-1)&& N <100) \/\/现将输入存到缓冲区 { N++; }for(i = 0 ;i < N; i++){...

C语言问题求解,在线等,急!!!
1、根据题意每天从区间1~N中,依次深度-1,遇到某个深度0时停止作业,所修改的区间就是当日作业区间。2、独立函数实现一天作业(workForDay)。参数flag为1显示作业过程,如不需要传0。3、init函数为输入并返回动态数组。include <stdio.h> include <malloc.h> int len=0;\/\/路面长度 int *init(...

成人本科c语言,帮忙检查一下,在线等
4、若有int a=5; 则printf(“%d”,++a);的结果为   6。printf(“%d”,a++);的话 结果是 5 。

C语言初学者求纠错,急需!!!
void main(){double faHeight,moHeight,Height;char sex,sports,diet;printf("输入父亲身高,母亲身高");scanf("%lf%lf",&faHeight,&moHeight); \/\/lf-->doublegetchar();printf("请输入性别F\/M:");scanf("%c",&sex); getchar();if (sex=='M')Height=(faHeight+moHeight)*0.54;\/\/...

C语言问题简单的很,菜鸟送分,在线等,超级高分,给我讲明白,否则关闭问题...
p--; \/\/令p指向字符串中的前一位 \/\/此时,p指向了字符串的最后一位 for( ; t > 0 ; t-- ) \/\/从后往前输出字符串的每一位,t每减小1就输出了一个字符,t=0的时候恰好每一位都已输出 { printf("%c",*p);p--; \/\/令p指向字符串的前一个字符 } printf("\\n");} ...

c语言平均数求纠错,在线等
sum定义的时候要赋初值 sum=0;

相似回答