帮我检查一下这段C语言.

用指针法把4插入1,3,5,7,9数列中.我得到的结果是134790,不知错在那里?
#include <stdio.h>
void main(){
int *p,i,t,a[6]={1,3,5,7,9},b=4,l,h,j;
p=a;
for(i=1;i<6;i++,p++)
if (*p>b) break ;
t=b;*p=b;h=*p;
for(j=6;j<i;j--,p++)
l=*p,*p=h;h=l;
p=a;
for(i=1;i<7;i++,p++)
printf("%d",*p);
}

其实你这个程序错误的地方非常多(LZ不要生气啊,我初学的时候还写不出这样的呢)

先说你的程序错在哪里,主要错在3个地方:
错误1. 逻辑设计的错误(这个比较严重,稍后再说)
错误2. 在下列语句:
for(i=1;i<6;i++,p++)
if (*p>b) break ;
在这个语句执行后,程序中p已经指向了数组a的第3个元素:a[2] = 5
所以你随后的“*p=b;”这一句,其实就是将p指向的元素的内容赋值为b(也就是4),
所以a[2]的内容就变成了4,所以结果就变成了134790
错误3. 数组的插入算法错误
下面这个语句是无法实现数组的插入的:
for(j=6;j<i;j--,p++)
l=*p,*p=h;h=l;

正确做法:
正确的逻辑应该是这样的:
本题的要求"用指针法把4插入1,3,5,7,9数列中",其实他的实现分为以下步:
1. 定位(找到正确的插入位置,并记录) //这个过程,你已经做了

2. 数组正向遍历,找到数组尾 //由于本题的数组是固定的,所以直接可以用数组下标a[5],就不需要遍历了:)

3. 数组插入
//这一步是关键,应该按照如下方法实现:
起始位置:定义两个指针(假设为*p,*q),一个p指向数组尾元素(也就是a[5]),一个q指向p的前一个元素
数组逆向遍历:这里的遍历还包含赋值的意思,即每次将q指向地址内的值赋给*p,赋值完成后,p,q依次进行--操作,指向前一位置
上述逆向遍历直到找到先前记录的"定位"的位置为止,也就是a[2]
最后再将相关地址a[2]的值置位为4。

方法和思路远比贴给你一段代码重要,希望我讲明白了:)
温馨提示:内容为网友见解,仅供参考
第1个回答  2008-12-07
#include <stdio.h>
void main(){
int *p,i,t,a[6]={1,3,5,7,9},b=4,l,h,j;
p=a;
l=6;
for(i=0;i<l;i++)
{if (*(p+i)>b)
for(j=5;j>=i;j--)
{*(p+j)=*(p+j-1);
l--;
}

}

*(p+i-1)=b;
for(i=0;i<6;i++)
printf("%d",*(p+i));
}
第2个回答  2008-12-07
就是插入一个值弄了这么多变量,代码好乱,看的头晕!!

将你的代码该了一下:

#include <stdio.h>
void main(){
int *p,i,j,b=4,a[6]={1,3,5,7,9}; /*这里初始化数组是从0下标开始的*/
for(p=a,i=0;i<6;i++) /*你用的时候却是从下标为1开始*/
if (*(p+i)>b) break ; /*查找要插入的位置i*/
for(p=a,j=4;j>=i;j--) /*将i以后的数据都往后移动从最后一个开始移动*/
*(p+j+1)=*(p+j);
p=a;/*让指针指向数组头部*/
*(p+i)= b; /*将上面找到的下标为i的值替换为要替换的值b=4*/
for(p=a,i=0;i<6;i++)
printf("%d",*(p+i));
}
第3个回答  2008-12-07
t=b;*p=b;h=*p; 这句有毛病,这样做就把5用4覆盖了
可如下修改
#include <stdio.h>
void main(){
int *p,i,t,a[6]={1,3,5,7,9},b=4,l,h,j;
int*q;
p=a;
for(i=1;i<6;i++,p++)
if (*p>b)
break ;
q=&a[4];
for(;q>=p;q--)
*(q+1)=*q;
*p=b;
p=a;
for(i=1;i<7;i++,p++)
printf("%d",*p);

}
第4个回答  2008-12-07
写的太混乱了
我照你那代码修改了些:
/*在数组a[6]中按序插入一数*/
#include "stdio.h"
main()
{
int *p,a[6]={1,3,5,7,9},temp;
scanf("%d",&a[5]);
p=&a[5];
for(p=&a[5];p>=a;p--)
{
if(*p>*(p-1))
break;
else
{
temp=*p;
*p=*(p-1);
*(p-1)=temp;
}

}
p=a;
for(p=a;p<a+6;p++)
printf("%d ",*p);
}

运行如下:输入 4
输出:1 3 4 5 7 9
第5个回答  2008-12-07
for(i=1;i<6;i++,p++)
if (*p>b) break ;
这里,你找到了应该把4放在的位置,现在你要做的是把这个位置上的5先保存起来,否则4放上去就把5覆盖了。

t=b;*p=b;h=*p;
而这里,你把4保存在了t上,这是毫无意义的,应该是这样:
t=*p;*p=b;

下面你要把4以后的元素都后移一个位置,并保持它们原来的顺序。但是你做错了太多。
1、for后面要是有多个语句,需要用大括号括起来,才能一起执行。
2、你的p现在指向的位置应该是最后一个元素,而不是不变就行的
for(j=6;j<i;j--,p++)
l=*p,*p=h;h=l;
应该是这样的:
p=a+5;
for(j=6;j>i;j--,p--)
{
t=*p;*p=t;
}

帮我检查一下这段C语言.
if (*p>b) break ;在这个语句执行后,程序中p已经指向了数组a的第3个元素:a[2] = 5 所以你随后的“*p=b;”这一句,其实就是将p指向的元素的内容赋值为b(也就是4),所以a[2]的内容就变成了4,所以结果就变成了134790 错误3. 数组的插入算法错误 下面这个语句是无法实现数组的插入的:for...

帮我检查我这个C语言怎么错了。
printf("Pass=%.1f%\\n",100*c\/n);printf("Fine=%.1f%\\n",100*d\/n);} 改好了

帮我看下这个C语言代码剩下的怎么写
void main(){ int a[10],i,x;printf("请输入十个数:");for(i=0;i<10;i++){ scanf("%d",&a[i]);} printf("这些数是:\\n");for(i=0;i<10;i++){ printf("%d ",a[i]);} printf("\\n在输入一个数:");scanf("%d",&x);int flag = 0;for(i=0;i<10;i++){ if...

谁帮我看看这段C语言程序什么意思?
回答:是将一段字符串表示的十六进制数转成数值,例如将字符串"0102030a"转成数值1,2,3,10,并将这些数值保存到buf中

谁帮我看下这段C语言为什么输出的都是长方形
在输入的时候你需要加一个逗号,注意:因为你写的是:scanf("%d,%d",&a,&b); 否则b将接收不到数值,那么a和b就永远不会相等了,所以就都执行printf("changfangxing")了。

大神帮我看下这段C语言代码,把字符串里的大写英文字母全部转换为小写...
char *dx(char *, char *);void pd(char*);int main(int argc,char *argv[]){char str1[100], str2[100];printf("请输入一串英文字符:\\n");gets_s(str1,100);pd(str1);dx(str1,str2);printf("全部转换为小写字母输出:%s",str2);system("pause");return 0;}char *dx(char...

哪位大佬能帮看看这道c语言?
if(*pa<=*pb)\/\/找到第一个a小于等于b,就把b元素插入到a元素后面(a移位){ flag=1;move1(pa+1,a,50);\/\/a当前元素之后的元素向后移1位 (pa+1)=*pb;break;} pa--;} if(!flag)\/\/如未发生位移,说明该b元素小于所有a元素,插入再a数组开始位置,a所有元素后移1位 move1(a,a,50...

帮我看看这段C语言哪错了?我照着书上抄的啊
第二行 int main(void) ,void 前面的括号应该是半角字符的(,而不是全角的(

求各位c语言老师帮我检查下程序,谢谢
这是我改好的,应该没有问题。修改过的地方我都加标注了,你对照你的看一下。为了 方便测试,我把 N 改成 4 了。你改成10就行了 。include<stdio.h>#define N 4struct student{ char num[6]; char name[8]; int score[4]; int total; float avr;};float aver;int k...

求大神帮我看看这条c语言
int a=37;a+=a%=9;运算过程:a=a%9=37 % 9=1 a+=1,即a=a+1 所以,a=2

相似回答
大家正在搜