求大牛纠错c语言程序(有关高精度加减法)

作者&投稿:桂博 (若有异议请与网页底部的电邮联系)
求c语言大牛指导下,怎么实现在U盘一插入USB时会运行U盘里面的应用程序~

这个是用的autorun机制,但是现在的电脑的防病毒都会禁止autorun的。

指针的强制转换 并不影响最终的结果
更多的是给编译器用的。
在C里面对指针不同类型相互赋值做的要求级别并不高
当源类型和目标类型不匹配时只是报一个warning, 而C++里面就是错误了。
比如你这个 正确做法应该是
p=(char *)&a;

至于为什么要加强制转换, 其最根本的原因是
不同类型的指针,进行相互赋值的时候是很容易出现越界的。比如char *p, 这个指针可能只指向一个字节的单元,(char c; p=&c;这样), 如果赋值给int*q=p; 然后按照*q去赋值取值,就是绝对的越界操作。
对于编程中,如果不小心写错了,那么就会引起不可预知后果,甚至可能是你运行测试几十次都正常,但真正出成品了,到客户手里莫名其妙的出错,查起来超难。
所以要求加强制转换,就是为了避免这样的不小心。 人性化一点的说,就是告诉编译器,我知道我在不同类型之间赋值,我已经知道了这样做的后果,也已经确定了可以承担这个后果,你不要管我了。 于是编译器就不管了,后果嘛,自负。

/*********************
程序功能:计算任意位两整数相减
这里我为了程序的可管理性(也就是可维护性)
用了把程序分成了好几块,
当然对我来说这并不算多。这样的程序
更符合软件工程的要求或说对做比较大的程序较好
虽然这么多还是不够的,但是怕多了你会觉得太过复杂
请耐心读完,或直接上机器看结果。
当然对于有小数的也可以写,但是那样代码多得多。
******************/
#define LEN 250
#include <stdio.h>
#include <string.h>
/*A、B异号*/
int subA(char cha[], char chb[], char chc[])
{
int j = 0;
int tem = 0;
int flag = 0;
int a;
int b;
int fa = 0;
int fb = 0;
int lena = strlen(cha) - 1;
int lenb = strlen(chb) - 1;
char ch;
printf("not the same\n");
if ('-' == cha[0])
{
ch = '-';
fb = -1;
}
else
{
fa = -1;
ch = '+';
}
for (; lena > fa && lenb > fb; lena--, lenb--)
{
tem = (cha[lena] - '0') + (chb[lenb] - '0') + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
j++;
}
if (lena > fa)
{
for (; lena > fa; lena--, j++)
{
tem = cha[lena] - '0' + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
}
}
else if (lenb > fb)
{
for (; lenb > fb; lenb--, j++)
{
tem = chb[lenb] - '0' + flag;
if (tem > 9)
{
flag = tem / 10;
tem %= 10;
}
else
{
flag = 0;
}
chc[j] = tem + '0';
}
}
if (flag)
{
chc[j] = flag + '0';
j++;
}
chc[j] = ch;
j++;
return j;
}

/*比较函数*/
/****写这函数是因为发现用系统比较strcmp()出问题,具体在哪我也没去查
我当然也知道系统的会返回一些正负或0值,但是我这里测有时候对有时候错****/
int AcmpB(char cha[], char chb[])
{
int i;
int j;
int lena;
int lenb;
lena = strlen(cha);
lenb = strlen(chb);
if (lena > lenb)
{
return 1;
}
else if (lena < lenb)
{
return -1;
}
else
{
for (i = 0; i < lena; i++)
{
if (cha[i] < chb[i])
{
return -1;
}
else if (cha[i] > chb[i])
{
return 1;
}
}
}
}

/*A、B同号*/
int subB(char cha[], char chb[], char chc[])
{
int i;
int j = 0;
int f;
int tem;
int tema;
int temb;
int lena;
int lenb;
int count = 0;
int temflag;
char ch;
char chtem[LEN];
if ('-' == cha[0])
{
ch = '-';
f = 0;
}
else
{
f = -1;
ch = '+';
}
temflag = AcmpB(cha, chb);
/*调整长度*/
if (temflag < 0)
{
strcpy(chtem, cha);
strcpy(cha, chb);
strcpy(chb, chtem);
/*判断正负*/
if ('-' == ch)
{
f = 0;
ch = '+';
}
else
{
f = -1;
ch = '-';
}
}
lena = strlen(cha) - 1;
lenb = strlen(chb) - 1;
for (; lenb > f; lenb--, lena--)
{
tema = cha[lena];
temb = chb[lenb];
if (tema < temb)
{
for (i = lena - 1; i > f; i--)
{
if ('0' != cha[i])
{
cha[i] = ((cha[i] - '0') - 1) + '0';
break;
}
else
{
count++;
}
}
if (count)
{
for (i++; i <= lena - 1 && count > 0; i++, count--)
{
cha[i] = '9';
}
}

tema += 10;
}
tem = tema - temb;
chc[j] = tem + '0';
j++;
}
/**退出循环有可能A还有数据**/
for (;lena > f; lena--)
{
chc[j] = cha[lena];
j++;
}
chc[j] = ch;
j++;
chc[j] = '\0';
return j;
}

/*判断输入的是否为合法数据,为程序健壮性设计,可不要。
但要保证你输入的是合法的,这是我规定的,合法返回1否则返回0
注意:这里判断的标准为正数不带符号,负数带减号且正数不能以0打头
负数也不能写成如-0123,而是写成-123否则将造成后面的大改AcmpB比较出错*/
int isringht(char ch[])
{
int i;
int len = strlen(ch);
/***这个if是防止输入如-0123类似数据****/
if ('-' == ch[0] && '0' == ch[1])
{
return 0;
}
if ('-' == ch[0] || '0' < ch[0] && ch[0] <= '9')
{
for (i = 1; i < len; i++)
{
if (ch[i] > '9' || ch[i] < '0')
{
return 0;
}
}
if (len == i)
{
return 1;
}
}
else
{
return 0;
}
}
/*输入函数这里规定如果输入不合法(含有非数字,除了符号位)
时,重输入,直到正确,当然还可以设别的出口,如果再加别的可能这程序会过大*/
void input(char ch[])
{
int flag = 1;
while (flag)
{
printf("Input the numbers:\n");
gets(ch);
if (!isringht(ch))
{
printf("Input error !\nplease re_input:\n");
}
else
{
flag = 0;
}
}
}
/*输出结果*/
void print(char ch[], int n)
{
int i;
int count = 0;
int flag = 1;
/*如果结果为零则直接输出一个0,而不是输出一串0*/
for (i = 0; i < n - 1; i++)
{
if ('0' != ch[i])
{
break;
}
}
if (i == n - 1)
{
printf("0");
return;
}
/****修正输出,比如当有-0003时只输出-3,正数也类似*****/
for (i = n - 2 - count; i >= 0; i--)
{
if ('0' == ch[i] && 1 == flag)
{
count++;
}
else
{
flag = 0;
break;
}
}
if ('+' == ch[n-1])
{
for (i = n - 2 - count; i >=0; i--)
printf("%c", ch[i]);
}
else
{
for (i = n - 1; i >= 0; i--)
{
printf("%c", ch[i]);
}
}
}

void main()
{
int i;
int len;
char ch;
char cha[LEN];
char chb[LEN];
char chresult[LEN + 1];/*结果可能有进位,如负数减正数*/

for (i = 0; i < LEN; i++) /*初始化存放结果的数组,以保证结果的正确性*/
{
chresult[i] = '0';
}
chresult[i] = '\0';/*字符串结束标志,本这不用多说*/

input(cha);
printf("the first number is: ");
puts(cha);
input(chb);
printf("the second number is: ");
puts(chb);
if ('-' == cha[0] && '-' != chb[0]|| '-' != cha[0] && '-' == chb[0])
{
ch = 'A';/*A、B异号*/
}
else
{
ch = 'B';/*A、B同号*/
}
switch(ch)
{
case 'A':
{
len = subA(cha, chb, chresult);
break;
}
case 'B':
{
len = subB(cha, chb, chresult);
break;
}
/* default:printf("*********"); */
}

printf("(first number sub second number)result is :\n");
print(chresult, len);
/*puts(chresult);
让程序到此停顿*/
getch();
}/***由于时间有限没有进行那么全面的测试,如果发现有什么漏处请给出指示
这样的代码你认为没有水平我也没办法了.等以后有提高再再次改进吧,现在能缩的只能这样了,不过一定能再缩的,不过那样会费更多的心思,要想出更好的算法**/

你的程序时实现什么功能?连功能都不知道怎么改啊

日 我还没有学到这呢!!!

为什么用a,b,c要用char型?直接用int不就行了,也不用分正负了。 题目里都说了是两个 INT 型的A,B

求大牛纠错c语言程序(有关高精度加减法)
答:/ 程序功能:计算任意位两整数相减 这里我为了程序的可管理性(也就是可维护性)用了把程序分成了好几块,当然对我来说这并不算多。这样的程序 更符合软件工程的要求或说对做比较大的程序较好 虽然这么多还是不够的,但是怕多了你会觉得太过复杂 请耐心读完,或直接上机器看结果。当然对于有小数的也...

C语言的编程菜鸟,求大牛帮忙找找错
答:而且,你的sqrt里面用了float的乘法。所以如果数比较大的时候会出错的。建议将乘积的平方根拆成平方根的乘积,因为这两种方式结果一样。比如:4*9的平方根等于4的平方根乘以9的平方根。include <stdio.h> include<math.h> int main(){ double a,b,c,s,area;printf("Input a,b,c:");scanf(...

C语言 求大牛们帮忙写一个小程序
答:/ Filename: test.c Description:Version: 1.0 Created: 2014年10月22日 09时31分13秒 Revision: none Compiler: gcc Author: YOUR NAME (),Company:/ include <stdio.h> include <string.h> include <stdlib.h> int getRes( const char *str,int strlen, //strlen没用上...

【十万火急】求 程序大牛 用C语言写一个触摸按键的程序,原理图附上...
答:unsigned char code Tab_key[]= //行列式键盘映射,这个表主要是为了直观 {0x00, //无键按下 '7','8','9','/', '4','5','6','*', '1','2','3','-', 'C','0','='

这个C语言怎么改才正确啊? 跪求大牛们指教
答:void main(){ float f,c;printf("请输入华氏温度\n");scanf("%f",&f); (这里的你原本是%d 这是错误的)c=(float)5/9*(f-32); (前面应该强制定义5为单精度,不然5/9的结果只整形那就是0了)printf("摄氏温度为%f\n",c);system("pause");} 纯手打,希望采纳啊 (*^__^...

求大牛解答:C语言程序编译通过,但运行时提示已停止运行??
答:%d",a[i]);i=i+1;}while(a[i-1]!=-1);//如果要输入到-1结束, 需要这样写.n=i;//退出时,i就是总的个数.if(n%2!=0)for(j=0;j<n/2;j++){t=a[j];a[j]=a[n-j-1];a[n-j-1]=t;}else{n=n+1;for(j=0;j<n/2;j++){t=a[j];a[j]=a[n-j-1];a[...

C语言求大牛帮忙找出错误
答:转换的时候类型有错误,t是int型的指针,不能把name[i]赋值给t

c语音程序问题⋯c语言求幂值出错,那个1e-8的判断是实验的要求应该没错...
答:本题是采用微积分中的麦克劳林公式求解自然底数e的值。LS的语法有误,运行结果也不对。首先,你应该把所有的变量都设置为float型,如果采用int型,在运算过程中将会不断取整数;其次,你的主函数是int型,所以在末尾需加上一个说明返回值的语句,例如return 0;。如有疑问欢迎追问!

八个C语言项目毕业后从小白到大牛
答:适合人群: C语言的初学者,难度较小,不合适写在简历上。综合应用数组、指针,可以锻炼编程逻辑思维,积累代码量。 涉及技术:数组、指针、结构体、函数。 三、停车管理系统 难度系数: 代码量:800行 实现功能:停车、找车、缴费、离开、路线规划。 适合人群:有C语言和链表、栈、队列基础。 涉及技术:指针、数组、链表...

c语言 openmp 程序编译不了 求大牛解答
答:include include <omp.h> define DIM1 2000 define DIM2 2000 define DIM3 2000 int main(){ int ii, jj, kk,mm;int nthreads = 1000;double *A;double *B;double *C;long dim1 = DIM1;long dim2 = DIM2;long dim3 = DIM3;clock_t tic, toc;float elapsed_time;double maxr...