1.编制不同的数字间的转换程序
要求 (1)提供输出界面.
(2)当输完一个任意十进制数字,程序能自动将起转换为二进制,八进制,十六进制.
(3)其中转换必须用算法来实现!而不是用PRINTF函数显示.
2.单词统计
要求(1)输入任意一段英文
(2)根据1中输入的各个单词出现的概率的高低输出前五个单词
(3)具有输入和输出界面
十万火急,做好了,俺就可以回家了!!!谢谢各位大侠!
如果有//说明,或者很快的化,本人再加分(100分)!!谢谢
第一题:
这是个老问题了,不难。下面的程序给出了一个非负十进制整数转换为2-16进制数的代码,加了注释。这个问题其它的方法还有很多,就不一一给出了。
#include <stdio.h>
#include <stdlib.h>
#define M sizeof(unsigned int)*8
int trans(unsigned n, int d, char s[])/* 函数trans将无符号整数n翻译成d(2<=d<=16)进制表示的字符串s */
{
static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符 */
char buf[M+1];
int j, i = M;
if(d<2||d>16)
{
s[0]='\0'; /* 不合理的进制,置s为空字符串 */
return 0; /* 不合理的进制,函数返回0 */
}
buf[i]='\0';/* 这个是关键,它不但是字符串的结束标志,也是(s[j]=buf[i])!='\0'结束的条件 */
do
{
buf[--i]=digits[n%d]; /*译出最低位,对应字符存入对应工作数组中*/
n/=d;
}while(n);
/* 将译出在工作数组中的字符串复制到s */
for(j=0;(s[j]=buf[i])!='\0';j++,i++);
/* 其中控制条件可简写成s[j]=buf[i] */
return j;
}
/* 主函数用于测试函数 trans() */
int main()
{
unsigned int num;
int i,scale[]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; /* 如果只需要2,4,8,16进制转换,去掉其它数字 */
char str[33];
system("cls");
printf("Please input an unsigned digit:\n");
scanf("%u",&num);
for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++)
{
if(trans(num,scale[i],str))
printf("%5d = %s(%d)\n",num,str,scale[i]);
else
printf("%5d => (%d) Error! \n",num,scale[i]);
}
system("pause");
return 0;
}
第二题:
这个问题有点意思,比上一个难些。下面的程序是一个师哥写的,有详细的注释,总体上思路和方法不错。只是程序中他用的是选择排序,而且不是最有效的选择排序方法,我把它改成速度最快的快速排序,程序我已测试通过。这个问题是C++ primer书上的实例,可以查阅该书这个问题的C++代码,这里就不列出了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1000 /* 设文件不超过1000词数,可更改 */
int comp(const void* a,const void* b)
{
return *(int* )b-*(int* )a;
}
int main(void)
{
FILE *fp1,*fp2;
char ch,s[N][21];/* 设每个单词不超过20个字符长度,可更改 */
int i=0,j=0,k,max,flag=0,t[N],tt[N];/*flag=0*/
system("cls");
if((fp1=fopen("001.txt","r"))==NULL)/* 设要统计的文件名为001.txt */
{ printf("Cannot open this file!\n");
system("pause");
exit(0);
}
fp2=fopen("002.txt","w");/* 设结果写入文件002.txt */
ch=fgetc(fp1);/* 读文件 */
while(ch!=EOF) /* 当文件未结束时循环 */
{
if(ch==' '||ch=='\t'||ch=='.'||ch==','||ch=='?'||ch=='!'
||ch==':'||ch==';'||ch=='-'||ch=='\n') /* 设定英文的标点符号,如文件含各种标点符号加入其中即可,这里只列出常用标点符号 */
{
if(flag==1)/* flag单词词内标记 */
{ flag=0;
i++; /* i表示单词个数 */
}
}
else if(flag==0)
{
flag=1;
j=0; /* 重置单词词内位置标记 */
s[i][j]=ch;
}
else
{ j++;
s[i][j]=ch;
}
ch=fgetc(fp1);
}
max=i; /* max为文章实际的最大单词数 */
for(i=0;i<max;i++)
t[i]=1;
for(i=0;i<max-1;i++)
for(j=i+1;j<max;j++)
if(t[i]!=0&&strcmp(s[j],s[i])==0){t[i]++;t[j]=0;}/* 判断单词是否重复,如用重复则设定标记t[] */
j=0;
for(i=0;i<max;i++)
if(t[i]>0) tt[j++]=t[i]; /* tt[]是t[]的一个下标连续递增的副本 */
qsort(tt,j,sizeof(tt[0]),comp);
fprintf(fp2,"word:%d\n",max);/*输出文章单词数*/
printf("word:%d\n",max);
for(i=0;i<j;i++)
for(k=0;k<max;k++)
if(t[k]==tt[i])
{fprintf(fp2,"%-3d:%s\n",t[k],s[k]);/* 输出到文件 */
printf("%-3d:%s\n",t[k],s[k]); /*输出到屏幕显示*/
t[k]=0; /* 处理统计次数相同的情况,避免重复打印 */
}
fclose(fp1);
fclose(fp2);
system("pause");
return 0;
}
这是个老问题了,不难。下面的程序给出了一个非负十进制整数转换为2-16进制数的代码,加了注释。这个问题其它的方法还有很多,就不一一给出了。
#include <stdio.h>
#include <stdlib.h>
#define M sizeof(unsigned int)*8
int trans(unsigned n, int d, char s[])/* 函数trans将无符号整数n翻译成d(2<=d<=16)进制表示的字符串s */
{
static char digits[] ="0123456789ABCDEF"; /* 十六进制数字的字符 */
char buf[M+1];
int j, i = M;
if(d<2||d>16)
{
s[0]='\0'; /* 不合理的进制,置s为空字符串 */
return 0; /* 不合理的进制,函数返回0 */
}
buf[i]='\0';/* 这个是关键,它不但是字符串的结束标志,也是(s[j]=buf[i])!='\0'结束的条件 */
do
{
buf[--i]=digits[n%d]; /*译出最低位,对应字符存入对应工作数组中*/
n/=d;
}while(n);
/* 将译出在工作数组中的字符串复制到s */
for(j=0;(s[j]=buf[i])!='\0';j++,i++);
/* 其中控制条件可简写成s[j]=buf[i] */
return j;
}
/* 主函数用于测试函数 trans() */
int main()
{
unsigned int num;
int i,scale[]={2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; /* 如果只需要2,4,8,16进制转换,去掉其它数字 */
char str[33];
system("cls");
printf("Please input an unsigned digit:\n");
scanf("%u",&num);
for(i=0;i<sizeof(scale)/sizeof(scale[0]);i++)
{
if(trans(num,scale[i],str))
printf("%5d = %s(%d)\n",num,str,scale[i]);
else
printf("%5d => (%d) Error! \n",num,scale[i]);
}
system("pause");
return 0;
}
第二题:
这个问题有点意思,比上一个难些。下面的程序是一个师哥写的,有详细的注释,总体上思路和方法不错。只是程序中他用的是选择排序,而且不是最有效的选择排序方法,我把它改成速度最快的快速排序,程序我已测试通过。这个问题是C++ primer书上的实例,可以查阅该书这个问题的C++代码,这里就不列出了。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 1000 /* 设文件不超过1000词数,可更改 */
int comp(const void* a,const void* b)
{
return *(int* )b-*(int* )a;
}
int main(void)
{
FILE *fp1,*fp2;
char ch,s[N][21];/* 设每个单词不超过20个字符长度,可更改 */
int i=0,j=0,k,max,flag=0,t[N],tt[N];/*flag=0*/
system("cls");
if((fp1=fopen("001.txt","r"))==NULL)/* 设要统计的文件名为001.txt */
{ printf("Cannot open this file!\n");
system("pause");
exit(0);
}
fp2=fopen("002.txt","w");/* 设结果写入文件002.txt */
ch=fgetc(fp1);/* 读文件 */
while(ch!=EOF) /* 当文件未结束时循环 */
{
if(ch==' '||ch=='\t'||ch=='.'||ch==','||ch=='?'||ch=='!'
||ch==':'||ch==';'||ch=='-'||ch=='\n') /* 设定英文的标点符号,如文件含各种标点符号加入其中即可,这里只列出常用标点符号 */
{
if(flag==1)/* flag单词词内标记 */
{ flag=0;
i++; /* i表示单词个数 */
}
}
else if(flag==0)
{
flag=1;
j=0; /* 重置单词词内位置标记 */
s[i][j]=ch;
}
else
{ j++;
s[i][j]=ch;
}
ch=fgetc(fp1);
}
max=i; /* max为文章实际的最大单词数 */
for(i=0;i<max;i++)
t[i]=1;
for(i=0;i<max-1;i++)
for(j=i+1;j<max;j++)
if(t[i]!=0&&strcmp(s[j],s[i])==0){t[i]++;t[j]=0;}/* 判断单词是否重复,如用重复则设定标记t[] */
j=0;
for(i=0;i<max;i++)
if(t[i]>0) tt[j++]=t[i]; /* tt[]是t[]的一个下标连续递增的副本 */
qsort(tt,j,sizeof(tt[0]),comp);
fprintf(fp2,"word:%d\n",max);/*输出文章单词数*/
printf("word:%d\n",max);
for(i=0;i<j;i++)
for(k=0;k<max;k++)
if(t[k]==tt[i])
{fprintf(fp2,"%-3d:%s\n",t[k],s[k]);/* 输出到文件 */
printf("%-3d:%s\n",t[k],s[k]); /*输出到屏幕显示*/
t[k]=0; /* 处理统计次数相同的情况,避免重复打印 */
}
fclose(fp1);
fclose(fp2);
system("pause");
return 0;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2009-06-26
楼主要自己独立地编写,编程时要考自己不断地编写代码而有所进步的,不能连作业题都要别人帮自己做的。
第2个回答 2009-06-26
找人做作业确实有点困难
第3个回答 2009-06-26
第一题:
#include <stdio.h>
void num_10_to_2(int *num10, char *num2)
{
int n = 0;
int i = 0;
int temp_num = *num10;
char temp[30] = {0};
if(NULL == num2)
{
return;
}
if(0 == temp_num)
{
*num2 = '0';
*(num2 + 1) = '\0';
return;
}
while(0 != temp_num)
{
temp[n] = temp_num % 2;
n++;
temp_num = temp_num / 2;
}
while(0 < n)
{
*(num2++) = '0' + temp[n-1];
n--;
}
*num2 = '\0';
return;
}
void num_10_to_8(int *num10, char *num8)
{
int n = 0;
int i = 0;
int temp_num = *num10;
char temp[30] = {0};
if(NULL == num8)
{
return;
}
if(0 == temp_num)
{
*num8 = '0';
*(num8 + 1) = '\0';
return;
}
while(0 != temp_num)
{
temp[n] = temp_num % 8;
n++;
temp_num = temp_num / 8;
}
while(0 < n)
{
*(num8++) = '0' + temp[n-1];
n--;
}
*num8 = '\0';
return;
}
void num_10_to_16(int *num10, char *num16)
{
int n = 0;
int i = 0;
int temp_num = *num10;
char temp[30] = {0};
if(NULL == num16)
{
return;
}
if(0 == temp_num)
{
*num16 = '0';
*(num16 + 1) = '\0';
return;
}
while(0 != temp_num)
{
temp[n] = temp_num % 16;
n++;
temp_num = temp_num / 16;
}
while(0 < n)
{
*(num16) = temp[n-1];
if(*num16 == 10)
{
*num16 = 'A';
}
else if(*num16 == 11)
{
*num16 = 'B';
}
else if(*num16 == 12)
{
*num16 = 'C';
}
else if(*num16 == 13)
{
*num16 = 'D';
}
else if(*num16 == 14)
{
*num16 = 'E';
}
else if(*num16 == 15)
{
*num16 = 'F';
}
else
{
*(num16) = '0' + temp[n-1];
}
num16++;
n--;
}
*num16 = '\0';
return;
}
int main()
{
int num10 = 0;
char num2[30] = {0};
char num8[30] = {0};
char num16[30] = {0};
printf("输入10进制数:");
scanf("%d",&num10);
num_10_to_2(&num10, num2);
num_10_to_8(&num10, num8);
num_10_to_16(&num10, num16);
printf("你输入的10进制数为%d\n",num10);
printf("它的2进制为:%s\n",num2);
printf("它的8进制为:%s\n",num8);
printf("它的16进制为:%s\n",num16);
return 0;
}
VC上测试过,确实是可以用的。没有考虑小数的情况,想必老师也不会这么变态的要你去做。
第二题比较简单,就不做了,string.h里有现成的函数,自己调用下就ok了。
=====================
回楼下的,在单位加班,无聊啊。
就顺便写下。
#include <stdio.h>
void num_10_to_2(int *num10, char *num2)
{
int n = 0;
int i = 0;
int temp_num = *num10;
char temp[30] = {0};
if(NULL == num2)
{
return;
}
if(0 == temp_num)
{
*num2 = '0';
*(num2 + 1) = '\0';
return;
}
while(0 != temp_num)
{
temp[n] = temp_num % 2;
n++;
temp_num = temp_num / 2;
}
while(0 < n)
{
*(num2++) = '0' + temp[n-1];
n--;
}
*num2 = '\0';
return;
}
void num_10_to_8(int *num10, char *num8)
{
int n = 0;
int i = 0;
int temp_num = *num10;
char temp[30] = {0};
if(NULL == num8)
{
return;
}
if(0 == temp_num)
{
*num8 = '0';
*(num8 + 1) = '\0';
return;
}
while(0 != temp_num)
{
temp[n] = temp_num % 8;
n++;
temp_num = temp_num / 8;
}
while(0 < n)
{
*(num8++) = '0' + temp[n-1];
n--;
}
*num8 = '\0';
return;
}
void num_10_to_16(int *num10, char *num16)
{
int n = 0;
int i = 0;
int temp_num = *num10;
char temp[30] = {0};
if(NULL == num16)
{
return;
}
if(0 == temp_num)
{
*num16 = '0';
*(num16 + 1) = '\0';
return;
}
while(0 != temp_num)
{
temp[n] = temp_num % 16;
n++;
temp_num = temp_num / 16;
}
while(0 < n)
{
*(num16) = temp[n-1];
if(*num16 == 10)
{
*num16 = 'A';
}
else if(*num16 == 11)
{
*num16 = 'B';
}
else if(*num16 == 12)
{
*num16 = 'C';
}
else if(*num16 == 13)
{
*num16 = 'D';
}
else if(*num16 == 14)
{
*num16 = 'E';
}
else if(*num16 == 15)
{
*num16 = 'F';
}
else
{
*(num16) = '0' + temp[n-1];
}
num16++;
n--;
}
*num16 = '\0';
return;
}
int main()
{
int num10 = 0;
char num2[30] = {0};
char num8[30] = {0};
char num16[30] = {0};
printf("输入10进制数:");
scanf("%d",&num10);
num_10_to_2(&num10, num2);
num_10_to_8(&num10, num8);
num_10_to_16(&num10, num16);
printf("你输入的10进制数为%d\n",num10);
printf("它的2进制为:%s\n",num2);
printf("它的8进制为:%s\n",num8);
printf("它的16进制为:%s\n",num16);
return 0;
}
VC上测试过,确实是可以用的。没有考虑小数的情况,想必老师也不会这么变态的要你去做。
第二题比较简单,就不做了,string.h里有现成的函数,自己调用下就ok了。
=====================
回楼下的,在单位加班,无聊啊。
就顺便写下。
参考资料:
第4个回答 2009-06-26
3楼很县