栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

C语言程序设计 字符串处理——文件合并排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言程序设计 字符串处理——文件合并排序

题目:字符串处理

        文本文件 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机械键盘等精美礼品!
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1016634.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号