s2=s2+(y*y+1);
returns2;
}
7题
用函数实现将任一一个十进制正整数转化为对应的二进制数。
十进制的输入和对应的二进制输出均由主函数完成,转化工作由自定义函数完成。
#include
#include
#include
voidput_01to(unsignedshortintb,char*p_data_2,unsignedshortintarrlen)
{//当前的二进制数字存放在该数组最左边,即第1个元素单元,所以已有的单元需右移一个,然后再放
unsignedshortintlen_2;
inti;
len_2=strlen(p_data_2);//计算当前字符串长度,即已有的二进制位数
if(len_2==arrlen)
{printf("二进制数的位数太长了,不能转换!
\n");
}
else
{
for(i=len_2;i>0;i--)//右移一位
{*(p_data_2+i)=*(p_data_2+i-1);
}
//填写当前二进制数字
if(b==1)
*p_data_2='1';
else
*p_data_2='0';
*(p_data_2+len_2+1)='\0';//补字符串结束标志
}
}
voidzhuanhuan_10_to_2(unsignedintdata_10,char*p_data_2,unsignedshortintarrlen)
//在C语言中没有二进制数的表达方式,所以用数组存储二进制数字
//此转换用递归的函数调用,注意计算机导论中的十进制整数到二进制数的转换原理
//次处只考虑十进制整数转换
{unsignedintten;//商
unsignedshortintyushu;//余数
if(data_10!
=0)//此时递归转换结束
{ten=data_10/2;
yushu=data_10%2;
put_01to(yushu,p_data_2,arrlen);//将余数即二进制数字放入二进制数组
zhuanhuan_10_to_2(ten,p_data_2,arrlen);//继续转换
}
}
voidmain()
#definearrBlen100
{
inta,abs_a;
charb_arr[arrBlen];
b_arr[0]='\0';
printf("请输入一个数据:
");
scanf("%d",&a);
abs_a=abs(a);
zhuanhuan_10_to_2(abs_a,b_arr,arrBlen);
if(a<0)
{printf("-");
}
printf("%s",b_arr);
printf("\n");
}
8题
写一个函数,输入一段英文,将字符串中最长的单词输出。
/*本题是输入一段英文,所以不知道这段英文有多长,所以必须用动态分配空间的方法,同样也不知道单词有多少个字母
故均用动态的方法解决存储问题,请参考5-1动态方式2.c
*/
#include
#include
#include
structcharpointer
{char*p_str;//指向英文字符串的某个字符,该指针前字符表示读取过了,该指针指以后的字符,包含该指针指向的字符是未读取的字符,
//每次读取一个单词均从该指针指向的字符开始,逐个向后读取
char*p_maxword;//指向最大单词
char*p_curword;//指向当前单词
};
char*addchar(char*p,charch,intcharnum)
{//添加一个字符空间
if(p==NULL)
{//此时说明以前没有
p=(char*)malloc(sizeof(char)*1);
}
else
{//此时说明不是第1个字符,即不是第1次动态分配空间,而是在上次分配的空间基础上增加空间
p=(char*)realloc(p,sizeof(char)*(charnum+1));
}
if(p!
=NULL)
{*(p+charnum-1)=ch;
}
returnp;
}
structcharpointergetword(structcharpointerpp)
{intwordchars=1;
//去掉单词前面的单词分隔符号,例如空格、标点符号等,也就是说单词只能是大小写字母
while(!
(('A'<=*pp.p_str&&*pp.p_str<='Z')||('a'<=*pp.p_str&&*pp.p_str<='z')))
{if(*pp.p_str=='\0')
{break;//读到英文尾了
}
else
{pp.p_str++;
}
}
//从此处开始读字母字符
while(('A'<=*pp.p_str&&*pp.p_str<='Z')||('a'<=*pp.p_str&&*pp.p_str<='z'))
{pp.p_curword=addchar(pp.p_curword,*pp.p_str,wordchars);
wordchars++;
pp.p_str++;
}
pp.p_curword=addchar(pp.p_curword,'\0',wordchars);
returnpp;
}
char*getmaxword(char*p_chars)
{structcharpointercurpointer;
curpointer.p_str=p_chars;
curpointer.p_curword=NULL;
curpointer.p_maxword=NULL;
curpointer=getword(curpointer);//获取第一个单词
curpointer.p_maxword=curpointer.p_curword;//第一个单词作为当前最大的单词
curpointer.p_curword=NULL;
curpointer=getword(curpointer);//获取第2个单词
while(strlen(curpointer.p_curword)!
=0)//==0则说明单词字符串已读完
{
if(strlen(curpointer.p_curword)>strlen(curpointer.p_maxword))//此时说明当前识别出的单词是最大的单词
{free(curpointer.p_maxword);//释放已分配给最大单词的空间
curpointer.p_maxword=curpointer.p_curword;//改指针指向
}
else
{free(curpointer.p_curword);//释放当前单词空间
}
curpointer.p_curword=NULL;//当前单词指向为空,还原curpointer.p_curword的初始值为NULL
curpointer=getword(curpointer);//获取第3个及以后的单词
}
returncurpointer.p_maxword;
}
char*getwords()
{char*str,curchar;
unsignedintcharnum=0;
str=NULL;
printf("请输入一段英文:
");
curchar=getchar();
while(curchar!
=10)//Enter的效果是回车换行,其ACSII值是10
{charnum++;
str=addchar(str,curchar,charnum);
curchar=getchar();
}
if(str!
=NULL)
{str=addchar(str,'\0',charnum+1);
}
returnstr;
}
voidmain()
{char*p_str,*p_word;
p_str=getwords();
//printf("%s%s\n%d",p_str,p_str,strlen(p_str));
//return;
if(p_str!
=NULL)
{p_word=getmaxword(p_str);
printf("%s",p_word);
}
free(p_str);
free(p_word);
printf("\n");
}
9题
#include
voidmain()
{
intyear,month,day;
intnum;
printf("输入年,月,日,用逗号隔开\n");
scanf("%d,%d,%d",&year,&month,&day);
switch(month)
{
case1:
num=day;break;
case2:
num=31+day;break;
case3:
num=60+day;break;
case4:
num=91+day;break;
case5:
num=121+day;break;
case6:
num=152+day;break;
case7:
num=182+day;break;
case8:
num=213+day;break;
case9:
num=244+day;break;
case10:
num=274+day;break;
case11:
num=305+day;break;
case12:
num=335+day;break;
}
if((year%4==0&&year%100!
=0)||(year%400==0))
printf("改日是该年的第%d天\n",num);
elseif(month>2)printf("改日是该年的第%d天\n",num-1);
else
printf("改日是该年的第%d天\n",num);
}