C语言编程求救,编程高手请进!
我觉得c语言在所有语言中是比较好学的一门编程语言 对初学者是非常好的 我的建议就是书呢 看一些就行了 关键是会用 在书上学到的是非常需要实践来证明的 有空就多编写一些简单的程序 逐渐突破吧 还有就是网上有很多人的杰作 注意主要是参考 学习别人的思想 其实有一个思想就可以编写一个程序了 千万不要照搬 (再次强调)! 要不然那就不是你的 过了就很容易忘记
如果有条件的话 我建议是看教学视频 最后学好了c语言 其他的语言都差不多的 学起来就容易多了。
虽然本人不是什么c语言高手,不过对于lz的程序,本人还是有些许拙见要向lz说明的:
首先是语法错误:程序中的x变量是float型的,但scanf中读入的x却是整型的,应改为scanf("%f, %d", &x, &y)比较好。
其次是算法有问题:lz是不是每次运行都得不到结果呢??原因是程序中滥用了return 0。例如:
if (y > 0)
{
for (i = 1; i <= y; i++)
{
if (y != i)
{
t = t * x;
}
else
{
return 0;
}
}
printf("%-6f^%d=%-6f", x, y, t);
}
其中if (y != i)……else本人是看了好几遍也不知道lz有何用意,而且for循环的最后一次循环一定会有y==i,于是会导致循环进入了else语句中执行return 0,那结果都返回了还怎么执行printf("%-6f^%d=%-6f", x, y, t)语句呢??下面的也差不多是这个问题了!!!
最后也就是一楼提到的语句简洁问题,我就有点不明白楼主为什么那么喜欢在if………语句中都用到printf("%-6f^%d=%-6f", x, y, t),其实这个句子最后统一再用也行,当然这个也只是小问题了!!!主要的还是前两个问题使楼主的程序不能正确运行!!
下面是我写的程序,基本上也是秉承了lz的算法,只是有些改动。
int main(void)
{
int i, y;
float x,t=1;
printf("Input x, y:");
scanf("%f, %d", &x, &y);
if (y > 0)
for (i = 1; i <= y; i++)t=t*x;
else if (y < 0)
{
for(i = 1; i <= - y; i ++)t=t*x;
t=1/t;
}
printf("%-6f^%d=%-6f", x, y, t);
return 0;
}
汉字的内码
点头表示什么?是“对”、“YES”,偏偏有的地方表示的意义却恰恰相反。一个动作,有不同的诠释;一个问题,有不同的答案;而一个符号,却有不同的意义,关键在于:你是如何地理解。在电脑中亦如此,所有的数据都是以0和1保存的,按不同的数据操作,可以得到不同的结果。对于显示英文操作,由于英文字母种类很少,只需要8位(一字节)即可。而对于中文,常用却有5000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码。不信,你可以用记事本写一C文件:
main()
{
unsigned char *s,*e="ABcd",*c="你好";
clrscr();
printf("English char =");
s=e;
while(*s!=0) /*C的字符串以0为结束符*/
{
printf("%3d,",*s);
s++;
}
printf("\nChinease char=");
s=c;
while(*s!=0)
{
printf("%3d,",*s);
s++;
}
getch();
}
再用TC输入*.txt打开运行,看见了没有,那些数值即英文和汉字的各字节内码。
汉字字模
得到了汉字的内码后,还仅是一组数字,那又如何在屏幕上去显示呢?这就涉及到文字的字模,字模虽然也是一组数字,但它的意义却与数字的意义有了根本的变化,它是用数字的各位信息来记载英文或汉字的形状,如英文的'A'在字模中是这样记载的:
而中文的“你”在字模中却是这样记载的:
在硬件系统内,英文的字模信息一般固化在ROM里,即使在没有进入系统的CMOS里,也可以让你看到英文字符。而在DOS下,中文的字模信息一般记录在汉字库文件HZK16里。
汉字库文件
了解字母和汉字是按字模位信息显示的原理后,那如何得到汉字的字模信息呢?难道要我们自己去做?NO。DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢?只需乘上一个汉字字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号-1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。
汉字库文件
了解点阵汉字及汉字库的构成原理后,显示汉字就变得简单。以16*16点阵字库为例,通常的方法是:将文件工作指针移到需要的汉字字模处、将汉字库文件读入一2*16数组再用for循环一位位地显示。以使用VGAHI模式显示“我”字为例,程序如下:
#include "graphics.h"
#include "stdio.h"
main()
{
int i=VGA,j=VGAHI,k;
unsigned char mat[16][2],chinease[3]="我";
FILE *HZK;
if((HZK=fopen("hzk16","rb"))==NULL)
exit(0);
initgraph(&i,&j,"");
i=chinease[0]-0xa0;j=chinease[1]-0xa0; /*获得区码与位码*/
fseek(HZK,(94*(i-1)+(j-1))*32l,SEEK_SET);
fread(mat,32,1,HZK);
for(j=0;j<16;j++)
for(i=0;i<2;i++)
for(k=0;k<8;k++)
if(mat[j][i]&(0x80>>k)) /*测试为1的位则显示*/
putpixel(i*8+k,j,WHITE);
getch();
closegraph();
fclose(HZK);
}
怎么样?只要掌握了正确的方法,显示汉字并不复杂。
打印字库文件和HZK12
如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H(黑体),你还可以使用不同字体的大字模汉字了。HZK24系列是24*24的点阵字库,每字模占用3*24字节。如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。例如你如果定义为mat[24][3]则应该这样输出:
for(i=0;i<24;i++)
for(j=0;j<24;j++)
if((0x80>>i%8)&mat[j][i/8]) /*转置显示*/
putpixel(j+x,y+i,color);
还有一类字库HZK12,虽然属于标准字库类型,但如果你将它的字模当作12*12位计算的话,根本无法正常显示汉字。因为字库设计者为了使用的方便,字摸每行的位数均补齐为8的整数倍,于是实际该字库的位长度是16*12,虽然每行都多出了4位,但这4位都是0(不显示),并不影响显示效果。
试一下这个程序,绝对可以达到你的要求
#include<stdio.h>
#include<graphics.h>
int getbit(unsigned char c,int n)
{
return((c>>n)&1);
}
int puthz16(int x,int y,int z,int color,char *p)
{
FILE *fp;
unsigned int i,c1,c2,f=0;
int i1,i2,i3,rec;
long l;
char by[32];
fp=fopen("hzk16","rb");
while((i=*p++)!=0)
{
if(i>0xa1)
if(f==0)
{c1=(i-0xa1)&0x7f;
f=1;
}
else
{
c2=(i-0xa1)&0x7f;
f=0;
rec=c1*94+c2;
l=rec*32L;
fseek(fp,l,SEEK_SET);
fread(by,1,32,fp);
for(i1=0;i1<16;i1++)
for(i2=0;i2<2;i2++)
for(i3=0;i3<8;i3++)
if(getbit(by[i1*2+i2],7-i3))
putpixel(x+i2*8+i3,y+i1,color);
x=x+16+z;
}
}
return(x);
}
main()
{
int gdriver=DETECT,gmode;
initgraph(&gdriver,&gmode,"");
setbkcolor(BLUE);
cleardevice();
puthz16(10,10,10,RED,"张李赵陈");
getch();
closegraph();
}
C语言编程求救
\/*学生的记录由学号和成绩组成,N名学生的数据在主函数中放入结构体数组s中,请编写函数fun,它的功能是:把高于平均分的学生数据放在b所指的数组中,高于等于 平均分的学生人数通过形参n传回,平均分通过函数值返回。在主函数中调用函 数fun,并输出结果*\/ include <stdio.h> define N 5 struct s...
C语言编程 求救
\/\/用if语句编程如下:include <iostream> void main(){ printf("请输入当月利润:");int money=0;scanf("%d",&money);int num = 0;if (money>1000000){ num += (money-1000000)\/100;\/\/超过100w部分奖金 num += 400000\/200*3;\/\/超过60w部分奖金 num += 200000\/100*3;\/\/超过40w部分奖...
c语言编程循环求救,希望编程大哥们指教帮忙
回答:数据规模不大的情况下,可以用红黑树或AVL建立map<key,value>,每个节点的key记录整数值,value记录出现的次数,如果插入时发现key相同则认为冲突,将对应的value值加1。最后遍历整个二叉树找到value最大的那一项的key值。 数据规模很大时,可以用hash表,选用适当的整数hash函数,解决冲突可用链表法,最后遍...
紧急求救用c语言编写:1、编写函数求两个数的较大值,并在主函数中调用...
1、int max(int a,int b){ return a>b?a:b;} 2、include<stdio.h> \/\/链接标准头文件 define N 5 \/\/定义常量N并赋值为5 void main() \/\/主函数入口 { \/\/表示主函数开始 int i,j; \/\/定义整形变量i和j int grade[N],temp; \/\/定义N维(N=5,也就是五维啦^^)整形数组和整形变...
C语言编程求救,编程高手请进!
你是否碰到过用启动盘启动系统后用DIR命令得到一串串莫名其妙的字符?有经验的朋友会告诉你:那是汉字。汉字?你不禁会问:怎么一个我一个也不认识。但那确确实实是汉字,如果你启动UCDOS或其他的汉字系统后,就会看到那是一个个熟悉的汉字。同样是汉字,为什么前后会看到不同的结果?呵呵,其实在电脑...
C语言编程求救
book books[]){ int i=0; while(i<10) { scanf("%d",&books[i].bookid); scanf("%s",books[i].name); scanf("%s",books[i].author); scanf("%f",&books[i].price); }}void find(book books[],char bookname[]){ int f=1; for(int i=0;...
编程c语言,求救,每次出来结果都不一样,这是
你没有对变量y进行赋值
C语言中两道编程题求救!
第一题:include<stdio.h> \/\/定义一个结构,记录一个学生的信息 typedef struct{ char num[10];char name[10];int score[3];} STUDENT;int main(){ FILE* file; \/\/文件指针,用于打开文件和将数据写入文件的一个接口 STUDENT student[5]; \/\/5个学生 int i,j;double ave[3]; \/\/计算各...
求救!用C语言编程:输入一个数 用倒三角(正三角)图形输出 谢了!_百度...
给你一个输出来是正的正三角行图案:\/*输出一个正的正三角行图形*\/ include<stdio.h> void main(){ int i, j, x, n, count, k , m , q , p , v ;scanf(“%d%d”,&n,&x);count=1;k=10;while(x-k>=0){count++;k*=10;} \/*count 的值表示输入数字的位数*\/ for(i...
C语言编程问题,求救【日历问题】!答复追加财富
int year[2]={365,366}; \/\/year[0]表示非闰年的天数,year[1]表示闰年的天数。int month[2][12]={31,28,31,30,31,30,31,31,30,31,30,31,31,29,31,30,31,30,31,31,30,31,30,31};\/\/month[0]表示非闰年里每个月的天数,month[1]表示闰年里每个月的天数。void main(){ int ...
仲长畏止血: 1、#include<stdio.h>#define N 10 void main() { int arry[N]; int i,j,temp; printf("请输入%d个整数:\n",N); for(i=0;i<N;i++)scanf("%d",&arry[i]); for(i=0;i<N;i++) for(j=i+1;j<N;j++) if(arry[i]<arry[j]) {temp=arry[i];arry[i]=arry[j];arry[j]=temp;} printf("...
汉川市15782145040: c语言代码求助,高手请进. - ?
仲长畏止血: #includeint main(int argc, char *argv[]) //argc 是参数个数,argv 是命令行参数 { int nflag; if (*++argv && !strcmp(*argv, "-n")) //指向下一个参数,并判断argv所指向的参数是否与“-n”相等,如果相等,执行以下程序 { ++argv; nflag = 1; } else //如...
汉川市15782145040: c语言高手进,求助啊 - ?
仲长畏止血: #include void main(){ float a,b,c,max1,max2,min1,min2; cout<<"please enter the numbers:"; cin>>a>>b>>c; ...
汉川市15782145040: C语言高手速进...求救啊!?
仲长畏止血: k=sqrt(n); //只需要判断到根号n就行了 for(i=2;i<=k;i++) if(n%i==0) //对2到k的数判断能否整除n break; //当一有一个能整除n时就退出循环 if(i>=k+1) //判断之前的 i 是否已经加到了 k+1 ,如果是的话也就是之前所有的数都不能整除 n ,这就说明n是素数 return 1; else return 0; if(n%i==0) //对2到k的数判断能否整除n break; //当一有一个能整除n时就退出循环,如果没有循环到i = k+1 但是n%i==0了,这样退出在下面判断 i >= k+1 就是不成立,也就会是else ,将返回0,就说明不是素数了
汉川市15782145040: 求助,c语言高手请进!?
仲长畏止血: #include<stdio.h> void main() { double e=1, a=1, b=1, i; printf("前50项e的值:\n"); for(i = 1; i < 50; ++i) { a=b; b=a/i; e+=b; } printf("%.12f\n",e); e=1; a=1; b=1; i=1; printf("最后一项的数值小于0.00001的e的值:\n"); while(1) { if(b<0.00001) break; a=b; b=a/i++; e+=b; } printf("e=%.12f\n",e); }
汉川市15782145040: C语言高手进来下~~初学者求救!~~~?
仲长畏止血: main函数里,]在你的sum,没有附值啊,所以输出的还是0,就像楼上的那位说的一样.sum=aa(a,b) int aa(int a,int b) { int i=0,sum=0; for(i=a;i<=b;i++) { sum=sum+i; } return sum; } #include<stdio.h> main() { int a,b,i,sum=0; scanf("%d,%d",&a,&b); sum=aa(a,b); printf("%d\n",sum); }
汉川市15782145040: C语言求救~~~希望高手指点一下啊 - ?
仲长畏止血: #include#include#define NULL 0#define LEN sizeof(struct work)struct work{ char name[20]; int age; float wages; struct work *next;};int...
汉川市15782145040: 求C语言程序,高手请进... - ?
仲长畏止血: /*1.输入一个以回车结束的字符串(少于80个字符),将其中的大写字母用下面列出的对应大写字母替换,其余字符不变,输出替换后的字符串 原字母 对应字母 A Z B Y C X D WX C Y B Z A*//*#include <stdio.h> void main() {char str[80];char ...
汉川市15782145040: C语言编程题,求助高手!!! - ?
仲长畏止血: /*用scanf()无法输入空格,就用getchar了*/ #include<stdio.h> int main(void) {char ch;static char str[128];int i=0;int j=0;printf("input the string: \n");while(1){ch=getchar();if(ch=='\n'||i>127)break;str[i]=ch;i++;}for(i=0;str[i];i++){for(j=...