C语言程序改错

C语言程序改错,第1张

#include<stdioh>

#include<stringh>

#define N 10

void input(int num[],char name[N][8]) / input是输入数据的函数 /

{int i;

for(i=0;i<N;i++)

{printf("\n Input NO:");

scanf("%d",&num[i]);

printf("Input name:");

getchar( );

gets(name[i]);

}

}

void sort(int num[ ],char name[N][8]) /排序的数组/

{int i,j,min,temp1;

char temp2[8];

for(i=0;i<N-1;i++)

{min=i;

for(j=i;j<N;j++)

if(num[min]>num[j]) min=j;

temp1=num[i];

strcpy(temp2,name[i]);

num[i]=num[min];

strcpy (name[i],name[min]);

num[min]=temp1;

strcpy(name[min],temp2);

}

printf("\n result: \n");

for(i=0;i<N;i++)

printf("\n %5d%10s",num[i],name[i]);

}

void search(int n,int num[],char name[N][8]) / 折半查找函数 /

{int top,bott,mid,loca;

int min;

int sign;

loca=0;

top=0;

bott=N-1;

if ((n<num[0]) || (n>num[N-1]))

loca=-1;

while ((sign==1) && (top<=bott))

{min=(bott+top)/2;

if (n==num[mid])

{loca=mid;

printf("NO %d , His name is %s\n",n,name[loca]);

sign=-1;

}

else if (n<num[mid])

bott=mid-1;

else

top=mid+1;

}

if (sign==1 || loca==-1)

printf("Can't find%d \n",n);

}

void main()

{int num[N],number,flag=1,c,n;

char name[N][8];

input(num,name);

sort(num,name);

while(flag==1)

{printf("\n Input number to look for:");

scanf("%d",&number);

search(number,num,name);

printf("Continue or not(Y/N)");

getchar();

c=getchar();

if (c=='N' || c=='n')

flag=0;

}

}

帮你修改完了,总共有三个地方错误

void search(int n,num[],char name[N][8]) /排序的数组/ 这里的num[]前面要加个int

再在这个函数里面定义二个变量,分别 int sign; 和 int min

首先我指出你书写的一个错误。switch(c-'2')下面那行的(

应该改成{

因为{是与default:putchar(c+2);下面出现的}进行配对的。

依次输入2473得到输出668977,只需修改一处地方。在case

2:putchar(c+4);后面加上

break;

分析如下:使用getchar输入,每次只能识别一个字符,而又使用了while循环,输入2473就相当于输入了4个数,while每次识别一个。

先分析输入2的情况:这里的2是字符'2',执行switch(c-'2'),‘2’-‘2’=0;因此要执行case

0的情况,case

0

和case

1

共用putchar(c+4),故2+4=6,要输出6,记住:输出的这个6其实是字符‘6’。然后继续执行case

2:putchar(c+4);输出第二个‘6’。这时后面加上了break;即跳出本层switch,本次while循环执行完毕。第一次循环完毕,输出了:66

然后是输入为4的情况:执行switch(c-'2'),‘4’-‘2’=2;所以执行case

2:putchar(c+4);即4+4=8,输出一个8(字符‘8’)。继续执行break;跳出本层switch,本次while循环执行完毕。第二次循环完毕,输出了:8

继续输入为7的情况:执行switch(c-'2'),‘7’-‘2’=5;要执行case

5,但本程序中并没有case

5,故执行缺省情况

default:putchar(c+2);‘7’+‘2’=‘9’,因此输出9(字符‘9’)。本次while循环执行完毕。第三次循环完毕,输出了:9

最后一个输入数3的情况:执行switch(c-'2'),‘3’-‘2’=1;所以执行

case

1:putchar(c+4);即‘3’+‘4’=‘7’,输出7(字符‘7’)。继续执行case

2:putchar(c+4);又输出了一个7(字符‘7’)。遇到后面的break;跳出switch,本次while循环结束。第四次循环结束,输出了:77

至此,全部四次循环均结束,所以最后的输出是668977

按照题目要求改完的两个程序如下(改动的地方见注释)

第一个程序

#include<stdioh>

void main()

{

float n,f;

float x1=1,x2,temp;//这里x1初始化为1,因为要先给x1赋值

printf("Enter a positive number:");

scanf("%f",&n);

while(1)

{

x2=(x1+n/x1)/2;//这里这句移到这里,因为要先给x2赋值

temp=x1-x2;

if(temp<0)

temp=-temp;

if(temp<1e-5)

break;

x1=x2;

}

printf("The square root of %52f is %85f\n",n,x2);

}

第二个程序

#include<stdioh>

void main()

{

float n,f;

float sqroot(float n);

printf("Enter a positive number:");

scanf("%f",&n);

f=sqroot(n);//这里接收函数返回值,因为函数有返回值

printf("The square root of %52f is %85f\n",n,f);//这里把x2改成f,因为x2未定义

}

float sqroot(float n)

{

float x1=1,x2,temp;//这里x1初始化为1,因为x1要先赋值

for(;;)//这里去掉temp>1e-5,因为for循环体中有判断了

{

x2=(x1+n/x1)/2;//这里这句移到这里,因为x2要先赋值

temp=x1-x2;

if(temp<0)

temp=-temp;

if(temp<1e-5)

break;

x1=x2;

}

return x2;

}

根据你的要求我将你的程序修改如下:具体的错误我会在此行做一定的解释。

#include<stdioh>

#include<mathh>

main()

{

int x,i;

float sum,c=1;//首先是这里的c,你要把c>=1e-5作为while循环的条件就应该先给c一个适当的值(这里就暂时赋大于1e-5的数1),否则系统会给它一个任意的值而导致程序错误。下次在使用时要注意啊。这其实和垒加时给sum赋0,垒乘时给它赋1是一样的啊。

x=1,i=1,sum=0;

while(c>=1e-5)

{

x=xi;

c=10/x;//其次是这里,你有没有到我把原来的1/x改成了10/x。这样改的原因是:c这里你定义的是单精度实型主要是为了保留小数点后的相应位数。但你原来的c=1/x;表达式左边c虽然是单精度实型,但右边的1/x中1和x却都是整型的。这就使1/x的值最终为整型。完全不符合你的想法。要想符合自己的想法这里就要对1/x进行类型强制转换。c语言中规定数据类型转换的原则是:为两个运算对像的计算结果尽可能多的提供存储空间。根据转换原则这里改为10/x。因为10是单精度实型在一般的系统中它占用4个字节,而x为整型在一般的系统中它占用2个字节10占的存储空间比x多,于是就进行强制转换将10/x结果转换为占存储空间多的单精度实型。这样就能把小数点后的数字保存下来了。

sum=sum+c;

i++;

}

printf("sum=%f",sum);

getch();

}

/求1+1/2!+1/3!+1/4!+1/5!+……+1/n!使误差小于10的-5次方/

你的程序其它的都对,设计的算法也很好。以后多学习一点c语言的理论知识。相信你的c语言一定会有很大的提高。加油啊!

#include <stdioh>

#include <mathh>

#include "mathh"

float fun(int n)

{

int i = 0, sum = 0;

float s = 20f;

for (i = 1; i <= n; i++)

{

sum = sum + i;

if (sum == 1) continue;

printf("( 1 +  %d ) + 1 =  %d\n", i, sum + 1);

s = s / (sum + 1);

printf(" %016f \n", s  );

}

return s;

}

int  main()

{

fun( 10 );

return 0;

}

1程序的功能是判断用户是不是输入的整数0

#include<stdioh>

int main()

{

int n;

printf("请输入一个整数:\n");

scanf("%d", &n);

/Found/

switch (n)

{

/Found/

case 0: printf("Zero\n"); break;

default: printf("Non-Zero\n"); break; //此处break可要可不要

}

return 0;

}

2程序的功能是输入一个整数,如果为1时输出100,为2时输出200,其它输出0

#include<stdioh>

int main()

{

int x, y;

printf("请输入一个整数:\n");

scanf("%d", &x);

switch (x)

{

case 1: y = 100; break; //case 1:相当于if(x==1){},case后面跟一个值,而不是一个表达式

case 2: y= 200; break;

default: y = 0; break;

}

printf("%d\n", y);

return 0;

}

//顺便说一句,switch语句括号里面的值是有要求的,byte,short ,int ,char,其它的基本都不行,

//比如float,double,long之类的都不行

以上就是关于C语言程序改错全部的内容,包括:C语言程序改错、初学者C语言程序改错题、C语言改错题,根据题目修改图中错误的源程序代码等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9326665.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存