两道c语言题目求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两道c语言题目求解相关的知识,希望对你有一定的参考价值。

第一题:有以下程序
#define f(x)(x*x)
main()
int i1,i2;
i1=f(8)/(4);
i2=f(4+4)/(2+2);
printf("%d,%d\n",i1,i2);

程序运行的输出结果是_____
A.64,28 B.4,4 C.4,3 D.64,64
答案是C,我很奇怪,为什么i2会变小呢?
第二题:以下程序输出的结果是_______
main()
struct cmplxint x,int y cnum[2]=2,4,3,1;
printf("%d\n,cnum[0].y/cnum[0].x*cnum[1].y");

A.0 B.2 C.3 D.6
这题选B。我奇怪的是cnum[2]这不是一个只有两个元素的一维数组么,为什么数组中有四个元素;还有前面的struct cmplx,不是只声明了 一个结构体类型么,结构变量都没有~~~最后~~~为什么会有这么一个答案我也不清楚。
另外加个小问题。
include<stdio.h>
main()
char c1='1',c2='2';
c1=getchar();c2=getchar();
putchar(c1);putchar(c2);
我奇怪的是,char类型后面跟的如果是整形,不是不能加''么,只有字符的时候才能加''么~~
对不起了各位,第一题是我写错了。应该是i1=f(8)/f(4);
i2=f(4+4)/f(2+2);

第一题可能是题目印错了,如果的确是你所写的那样;答案是16,6
#define f(x)(x*x)
main()
int i1,i2;
i1=f(8)/f(4); //看一下除数
i2=f(4+4)/f(2+2);//除数
printf("%d,%d\n",i1,i2);

这样答案就是C,

第二道题,题目可以这样看
main()

struct cmplx

int x;
int y;
cnum[2];

cnum[0].x=2;
cnum[0].y=4;
cnum[1].x=3;
cnum[1].y=1;

printf("%d\n",cnum[0].y/cnum[0].x*cnum[1].y);


第三题 c1='1'对应的是字符1,对应的十进制为49;
如果c1=49,则等同于c1='1'字符;
而c1=1对应的是ASCII第二个字符,也就是这个“☺”
参考技术A 第一题:i1=(8*8)/(4)=16 i2=(4+4*4+4)/(2+2)=6
我看原题的意思应该是
#define f(x)(x*x)
main()
int i1,i2;
i1=f(8)/f(4);
i2=f(4+4)/f(2+2);
printf("%d,%d\n",i1,i2);

结果才会选c
实践就是最好的证明,我运行过了。结果就是16,6
第二题不能运行,乱七八糟的错误一大堆。
第三题:include前面要加 # .
至于你问的问题??
你是不是想说char类型变量赋值如果是数字就不能用‘’括起来(记住,字符串的话用双引号,单个字符都是用单引号的)?ASCLL码里面有0-9这几个数字,他们可以是字符,也可以是数值。原题有加单引号,是字符。
参考技术B 第一道:#define f(x)(x*x)这个宏替换将i1=f(8)/(4)替换为:i1=(8*8)/(4*4);i2=f(4+4)/(2+2)=4;替换成:i2=(4+4*4+4)/(2+2*2+2)=3;其实,宏替换就好比复制,它只是机械性负责复制,而不会识别运算符的优先级之类,所以用的时候要特别小心
第二道问题是问题,cnum[2]=2,4,3,1结构不明,不知道是你抄错还是什么原因;
第三,在C语言中,是把双引号中的数据看成字符的,而不数据,就比如"1",这样的表示说明它只是一个字符,而不是表示大小的数据。。。
参考技术C 1.

i1=f(8)/(4);
经过宏替换后就成了:
i1=(8*8)/(4);
所以i1=16

i2=f(4+4)/(2+2);
经过宏替换后就成了:
i2=(4+4*4+4)/(2+2);
所以,i2=6

所以i2<i1,而且答案是错的.

2.

struct cmplxint x,int y cnum[2]=2,4,3,1

这个式子定义了一个struct cmplx类型的结构体数组cnum,它有两个该结构体类型的元素,cnum[0]和cnum[1],cnum[0]有两个成员变量,分别是cnum[0].x和cnum[0].y,而且在定义时分别被初始化为2和4,cnum[1]也有x和y两个成员变量并且在定义时被初始化为3和1

3.
后面的'1'和'2'都是字符,不是整数1和2

c语言同一题目求解结果用float和int输出值差1.

题目描述
企业发放的奖金根据利润提成。利润低于或等于100000元的,奖金可提10%;
利润高于100000元,低于200000元(100000<I≤200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成 7.5%;
200000<I≤400000时,低于200000元部分仍按上述办法提成,(下同),高于200000元的部分按5%提成;
400000<I≤600000元时,高于400000元的部分按3%提成;
600000<I≤1000000时,高于600000元的部分按1.5%提成;
I>1000000时,超过1000000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。

float输出:
#include <stdio.h>
main()

long i;
float j,j1,j2,j4,j6,j10;
j1=100000*0.1;
j2=j1+100000*0.075;
j4=j2+200000*0.05;
j6=j4+200000*0.03;
j10=j6+400000*0.015;
scanf("%ld",&i);
if(i<=100000)
j=i*0.1;
else if(i<=200000)
j=j1+(i-100000)*0.075;
else if(i<=400000)
j=j2+(i-200000)*0.05;
else if(i<=600000)
j=j4+(i-400000)*0.03;
else if(i<=1000000)
j=j6+(i-600000)*0.015;
else
j=j10+(i-1000000)*0.01;
printf("%f\n",j);

用int输出:
#include <stdio.h>
main()

long i,j;
float j1,j2,j4,j6,j10;
j1=100000*0.1;
j2=j1+100000*0.075;
j4=j2+200000*0.05;
j6=j4+200000*0.03;
j10=j6+400000*0.015;
scanf("%ld",&i);
if(i<=100000)
j=i*0.1;
else if(i<=200000)
j=j1+(i-100000)*0.075;
else if(i<=400000)
j=j2+(i-200000)*0.05;
else if(i<=600000)
j=j4+(i-400000)*0.03;
else if(i<=1000000)
j=j6+(i-600000)*0.015;
else
j=j10+(i-1000000)*0.01;
printf("%ld\n",j);

测试结果有差异,比如我输入20万,float输出17500.000000 long和int输出都是17499,差1是怎么回事呢?如果我想输出17500的整数,应该怎么改?

试试这样就好了
#include <stdio.h>
main()

long i;
float j,j1,j2,j4,j6,j10;
j1=100000*0.1;
j2=j1+100000*0.075;
j4=j2+200000*0.05;
j6=j4+200000*0.03;
j10=j6+400000*0.015;
scanf("%ld",&i);
if(i<=100000)
j=i*0.1;
else if(i<=200000)
j=j1+(i-100000)*0.075;
else if(i<=400000)
j=j2+(i-200000)*0.05;
else if(i<=600000)
j=j4+(i-400000)*0.03;
else if(i<=1000000)
j=j6+(i-600000)*0.015;
else
j=j10+(i-1000000)*0.01;
printf("%ld\n",long(j));


i根本不需要long型。用int就够了。
#include <stdio.h>
main()

int i;
float j,j1,j2,j4,j6,j10;
j1=100000*0.1;
j2=j1+100000*0.075;
j4=j2+200000*0.05;
j6=j4+200000*0.03;
j10=j6+400000*0.015;
scanf("%ld",&i);
if(i<=100000)
j=i*0.1;
else if(i<=200000)
j=j1+(i-100000)*0.075;
else if(i<=400000)
j=j2+(i-200000)*0.05;
else if(i<=600000)
j=j4+(i-400000)*0.03;
else if(i<=1000000)
j=j6+(i-600000)*0.015;
else
j=j10+(i-1000000)*0.01;
printf("%d\n",long(j));

输出结果正确。追问

哦,谢谢,这个是强制转换吗?

追答

恩,是的。

参考技术A float 是但精确度
double 是双精确度
int是整数
用float 和double 的时候输出的时候最好加上小数点像是
printf("%lf.2",a);
就精确到了2 位小数。。
float输出17500.000000 这是电脑默认的
如果我想输出17500的整数。。。。。这是你的公式计算吧,跟你用的float 和int 无关。。。追问

但用int输出时是17499,差1怎么回事?

追答

我运行了下第二个是17500啊。。

追问

我用c-free5运行就这样啊

追答

我的正常啊。。。CFREE3.5的

追问

奇怪,,,不过谢谢你哦

参考技术B 这不是树上的例题吗?追问

嗯,但是我们老师要求输出整数啊,不要留小数点,我我用整数输出的值要差1.

以上是关于两道c语言题目求解的主要内容,如果未能解决你的问题,请参考以下文章

c语言编程题目求解

c语言同一题目求解结果用float和int输出值差1.

跪求C语言大神!!两道题。!!

C语言这两道题加了static跟没加的有什么区别?

求高手,两道c语言编写题

我有两道c语言题要做,应该不难,请各位大神帮忙