题目:字符串处理
文本文件 num1.txt 和 num2.txt 中各有一组用空格分隔的整数,将 num1.txt 和 num2.txt 联合排序,并将结果保存在 num3.txt 中,例如图1 所示。 图 1 举例: a) num1.txt b) num2.txt c) num3.txt这是大一的一道程序设计题,题目本身并不是很难。
下面是思路:
1.先读取两个文件,将两个字符串都转化为数字数组
2.将两个数组合并且排序
3.将数字数组转化为字符串且写入文件
根据思路,先写出main函数并声明需要用到的函数
#include#include #include //读取文件 void readText(char strNumb[]); //将字符串转化为数字数组并计数 int tranToNumb(char strNumb[],int intNumb[]); //合并 void toOneArray(int intNumbSum[],int intNumb1[],int intNumb2[],int count1,int count2); //排序 void sort(int intNumbSum[],int countSum); //将数字数组转化为字符串 void tranToString(int intNumbSum[],char strNumbSum[],int countSum); //写入文件 void writeText(char strNumbSum[]); int main(void){ //文件字符串与转化后的数字数组 char strNumb1[1000]="num1.txt",strNumb2[1000]="num2.txt"; int intNumb1[100]={0},intNumb2[100]={0}; //计数 int count1=0,count2=0; //整合后的数字数组 int intNumbSum[200]={0}; //转化为字符串写入文件 char strNumbSum[2000]={0}; //读取文件 readText(strNumb1); readText(strNumb2); //将字符串转化为数字数组并计数 count1=tranToNumb(strNumb1,intNumb1); count2=tranToNumb(strNumb2,intNumb2); //合并 toOneArray(intNumbSum,intNumb1,intNumb2,count1,count2); //排序 sort(intNumbSum,count1+count2); //将数字数组转化为字符串 tranToString(intNumbSum,strNumbSum,count1+count2); //写入文件 writeText(strNumbSum); }
再根据要求写函数内容
1.读取文件
将文件内容转化为程序中字符串
//读取文件
void readText(char strNumb[]){
//定义文件指针,只读文件
//上面将字符串初始化为了打开的文件名
FILE *fp=fopen(strNumb,"r");
//清空
memset(strNumb,' ',sizeof(strNumb));
//读取文件
fgets(strNumb,1000,fp);
}
2.将字符串转化为整型数组并计算有效数字多少
这也是这道题唯一较难的点,也可以不使用atoi函数,直接采用(‘字母’-‘0’)的方式也可以转化为数字
//将字符串转化为数字数组并计数
int tranToNumb(char strNumb[],int intNumb[]){
int count=0;
char temp[10]={0};
int i=0,j=0;
while(strNumb[i]!=EOF&&strNumb[i]!=' '&&strNumb[i]!='n'){//非终止符
while(strNumb[i]!=' '){//空格前暂存为一个字符串
if(strNumb[i]==EOF||strNumb[i]==' '){//最后一个数字
break;
}
temp[j++]=strNumb[i++];
}
if(strNumb[i]==' '||strNumb[i]==EOF||strNumb[i]==' '){//空格结算一次
intNumb[count++]=atoi(temp);//将暂存的字符串用arrayToInt函数转为数字
//清空,位移到下一位
j=0;
i++;
memset(temp,' ',sizeof(temp));
}
}
return count;
}
3.合并
//合并
void toOneArray(int intNumbSum[],int intNumb1[],int intNumb2[],int count1,int count2){
int i;
for(i=0;i
4.排序
冒泡算法
//排序
void sort(int intNumbSum[],int countSum){
int i,j;
int temp=0;
//引入数字个数,进行冒泡排序
for(i=1;iintNumbSum[j+1]){
temp=intNumbSum[j];
intNumbSum[j]=intNumbSum[j+1];
intNumbSum[j+1]=temp;
}
}
}
}
5.将数字数组转化为字符串
//将数字数组转化为字符串
void tranToString(int intNumbSum[],char strNumbSum[],int countSum){
int i;
char temp[100]={0};
for(i=0;i
6.写入文件
//写入文件
void writeText(char strNumbSum[]){
//定义文件指针,只写文件
FILE *fp=fopen("num3.txt","w");
//写入文件
fputs(strNumbSum,fp);
}
运行效果:
运行后:
总结与思考:
这是在暑假期间重新写的,原先在学校写的交上去的作业,有的函数甚至超过了70行,重复代码太多,比如写了两个函数来打开文件,而且还有一些类似于定义了count[1]这种一个单位的数组。
更改后减少了至少一半的代码,但我在写的过程中,似乎想到了更为简单的方法,因为字符串的拼接更为简单——只需要一个strcat函数,是否可以先让两个字符串拼接,然后再转化为整型数组进行排序,这个改动应该不是很难。
还有没有什么更简单的方法呢?
暑期编程PK赛
得CSDN机械键盘等精美礼品! 


