求解一道C语言基础编程题。 求解一道C语言基础编程题

作者&投稿:塔琛 (若有异议请与网页底部的电邮联系)

首先看一下程序的逻辑(虽然貌似题主应该不是在这一块有问题:

关于ascii码的解释:

首先得知道每个字符和数值的对应关系(图不清晰可看戳这里:ascii编码对应表

好了,现在看程序中的第一个if语句,在用大于、小于这些运算比较符比较char的时候,会自动转换为整数比较,也就是说‘0’会转换成48,‘1’转换成49……以此类推,最后是‘9’转换成57,你会发现把这些char减去48就会得到它们各自相对应的整数数值,这就是第一个if里面减去48的目的。同理,接下来的else-if语句,‘A’到‘F’也会转换成整数数值,具体对应的数值可以参看ascii表,一样的道理减去‘A’然后加10的目的也是转换成数值,因为在大于10的进制下,A代表10,B代表11……以此类推,因为这个程序最高就16进制了,所以判断到F就可以了。

然后我们来看进制的解释:

所谓进制,其实就是组合数字的方式,理解了这一点就很好说了。比如说10进制,为什么198等于198(好像很傻一问题)?其实是因为在十进制下,198 (10) = 1 * 10^2 + 9 * 10^1 + 8 * 10^0 = 198(好像是这么回事,(。ì _ í。)),同一个数字,放在不同的位置,它所代表的分量也不一样,即组合数字的方式会影响数字的值,1后面还有2个数字,所以这个1实际上是1 * 10^2 = 100,而不是1,其它位置的数字同理,然后把这些值加起来,就得到了整个数字所代表的最终的值,因此我们才有了 198 = 198(好像很有道理)。

但是,198也可能不等于198,什么时候不等于呢?在不同的进制下。比如说假如我们的这个198是在16进制下的198,那么 198 (16) = 1 * 16^2 + 9 * 16^1 + 8 * 16^0 = 408 (10) = 408。

为什么会产生这种差别呢?因为16进制下的那个1代表的分量是1 * 16^2了,而不是1 * 10^2了,同理,在其它进制下只需要把乘的数字换成对应的进制的数就好了,比如在9进制下那个1就是1 * 9^2等等。

这样一来上面程序里面的for语句就好理解了,之所以用for是因为要算出次方(这个应该不用解释),一个数要乘的次方是它后面跟着的数字的个数,所以是“j = 0; j < len - 1”。

然后把这些值加起来,就得到这个数字对应的十进制下的数值,也就完成了最终的转换。

题主可以随便写些不同进制下的数字,然后自己算出十进制下对应的数值,和网站上得出的结果比较比较,这样也可以加深对进制的理解,同时提高计算能力。

戳这里:在线进制转换

这里给出了一个链接,这种网页到处都是,随便搜一下就可以找到。



我写了一个小时编著,结果百度不让我发布回答,看来是没办法帮助了如果你看到,留个微信吧,我在微信上给你具体说

求解一道C语言基础编程题。。~

intbase(intk,chars[])//按定义,k是进制(2~16),s是输入的字符串

{

int len=0,sum=0; //len 指s字符串长度,sum指转换后的k进制数

int i,j,t,n;

while (s[len]!='\0') len++; //计算s数组长度,也就查看用户从键盘输入了多少字符

i=len-1; //从最高位开始,也就是从最右侧开始计算,比如s=1234ab,先从b开始计算

while (s[i]!='\0') //逐个读取字符串s,第i位的具体字符值,s[i]是否有效

{

n=0; //s[i]是字符(char),s[i]转换成10进制对应的值

if (s[i]>='0'&&s[i]<='9') //查ascii码表

n=s[i]-48; //48即字符 '0'

else if (s[i]>='A'&&s[i]<='F') //A--F用来代表10进制下的10~15

n=10+s[i]-'A'; //s[i]是字符(char),s[i]转换成10进制对应的值

t=1;

for (j=0; j<len-i-1; j++) t=t*k;

/* //以上语句等于如下形式,s[i]对应的倍率,假设k=10,就好理解

t=1; //个位,即i=len-1时

t=1*k; //十位 即i=len-2时

t=1*k*k; //百位

t=1*k*k*k; //千位

.....

*/

sum += n*t; //合计,个+十+百+千+...

i--;

}

return (sum);

}

main()

{

int sz;

char str[20];

scanf("%d %s",&sz,str);

if (sz16)

printf("输入错误。
");

else

printf("%d
",base(sz,str));

}

~是缩进符号,自己替换成4个空格:
--------------------------------------------
#include
#include
int main(int argc, char *argv[])
{
~FILE *fp1, *fp2;
~char ch;
fp1 = fopen("file1.txt", "r");
~if (fp1 == NULL ) {
~~printf("file1.txt open error
");
~~return -1;
~}
fp2 = fopen("file2.txt", "w")
~if (fp2==NULL ) {
~~printf("file2.txt open error
");
~~fclose(fp1);
~~return -1;
~}
~for (ch = fgetc(fp1); ch != EOF; ch = fgetc(fp1)) {
~~fputc(ch, fp2);
~}
~fclose(fp1);
~fclose(fp2);
~return 0;
}

几个简单C语言编程题目,自己太笨做不来。求大神解答。速求
答:1.include <stdio.h>int main(){//求和int i,sum=0;for(i=1;i<=100;i++)sum+=i;//sum就是最后的和printf("1+2+3+...+100=%d",sum);return 0;}2.include <stdio.h>int main(){//最大最小值int a,b,c;int max,min;scanf("%d,%d,%d",&a,&b,&c);max=min=a;//...

c语言程序设计的基础题目求教,请给解析(多追积分)
答:4:若有定义:int a=10,b=9,c=8;接着顺序执行后下列语句是,变量b中的值是()c=(a-=(b-5));c=(a%11)+(b=3);由上面的几题为基础,c=(a-=(b-5))相当于c=(a=a-(b-5)),c=(a=10-(9-5)),c=(a=6),所以a=6,c=6,b=9(表达式b-5并没有改变b的值)c=(a%11)+...

编程题 c语言求解
答:编程统计学生考试成绩。设有M个学生,进行N门课程的考试,求学生考试的总分数及平均分,并按照总分由高到低的次序打印学生的名次,学号,各科成绩,总分,和平均...关注 展开全部 用struct类型解,不过你学C语言才48小时就好好练练基础吧,这种题目不适合你 已赞过 已踩过< 你对这个回答的评价是? 评论 ...

如何解这道C语言编程题?
答:我做的比你要的详细,记得给我加分!!!1.1/n n在什么区间我也没算出来,输出结果是1/n的准确结果,因为分数是有理数(可以表示为有限小数或无限循环小数)所以是可以准确表示的。include "string.h"int main(int argc, char* argv[]){ char m_DivString[5000],Temp[2];int m_Dividend=1,...

求大侠帮忙解决几道C语言编程题啊~~~
答:第一道:s=10*s+ch[i]-'0';s被赋值为0 所以 s=10x0 + ‘1’ - '0' .而 ch[0]='1'=49 ,'0'=48 ,所以结果为1。想问一下你认为是15 是怎么算出来的?第二道:define ADD(x) x+x 宏是编译预处理命令,预编译时展开,等价于:void main(){ int m=1,k=2,sum;sum=...

一道c语言编程题,求解答
答:s没有初始化,没有指向一块内存。while(*str != ' ')当遇到空格的时候就直接退出while循环了,并不会去掉空格。并且即使你进了while循环,你最后赋值的时候指针s已经到了最后了,也不会正确。void fun(char* str){char* s = (char*)malloc(sizeof(char) * strlen(str) + 1);char *tmp =...

帮我解一下这道C语言的题目
答:include<stdio.h>//注意你在stdio前面多打一个空格。编译会出错···main(){int k=2,s=0;do{//注意do是关键词,必需要小写。。。请不要乱改 if((k%2)!=0) //这个应该是0,而不是字母o。楼主打错了··continue;s+=k;k++;}while(k>10);//如果楼主的k>10,请注意,他只做了...

c语言编程题 求解答怎么做
答:include <stdio.h>/*1.A和B中至少一人获奖;2.A,C,D中至少两人获奖;3.A,E中至多一人获奖;4.B和F或者同时获奖,或者都未获奖;5.C和E的获奖情况也相同;6.如果E未获奖,则F也不可能获奖;7.C,D,E,F中至多三人获奖。用flag数组表示获奖状态,1表示获奖,0表示没获奖,下标与对应的人的...

C语言编程基础题目,请帮我写写。
答:1、设6个int型变量,如n1,n2,n3,n4,n5,n6分别代表不同类型的字符个数,如n1为大写英文,n2为小写英文等等。2、用1 个循环,逐个判断字符的类型,是大写的给n1+1,小写的给n2+1,等一次类推。3、退出循环时就6个不同类型的个数都统计出来了。程序简单如下:include<stdio.h> include<string.h...

简单C语言编程,求解答
答:while(a+b<=c||a+c<=b||b+c<=a){ printf("输入错误,不能组成三角形,请重新输入!");scanf("%lf,%lf,%lf",&a,&b,&c);} s=(a+b+c)/2;S=sqrt(s*(s-a)*(s-b)*(s-c))+0.0005;printf("\n三角形的面积为:%10.3lf",S);getch();} (附加题)6.编程将用户输入...