c语言学习进阶-C语言程序性能优化

本文介绍了一个C语言程序,该程序能够读取输入文件中的数据,并计算这些数据的任意次方,然后将结果输出到另一个文件中。通过命令行参数传递输入文件名、输出文件名及计算次方数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题C语言程序性能优化

(1)进一步提升程序的计算能力。使之能计算任意实数的任意次方的输出结果,我们
将计算的次方数也放在命令行参数中,作为第3 个命令行参数,例如:d:>p.exe inputdata.txt myoutput2.txt 5, 那么就意味着计算inputdata.txt 中的所有数据的5 次方,并将结果输出到myoutput2.txt 文件中。
提升程序的计算能力,使之能计算任意实数的任意次方只需在程序中再加入一个输
入次幂的命令行参数即可,即加入下面代码中的第70 行,argv[3] 是字符串格式,sscanf 与scanf类似,都是用于输入的,只是后者以屏幕(stdin) 为输入源,前者以固定字符串为输入源。从一个字符串中读进与指定格式相符的数据,相应的对72 行以及第9 行做出调整即可。

#include<stdio.h>
#include<math.h>
#include<string.h>
#include <ctype.h> 
#include <stdlib.h> 
int main(int argc,char*argv[])
{
	FILE*fp1,*fp2;//文件指针表示的两个流
	if (argc!=4)
	{
		printf("参数输入不正确!");	
		printf("提示:命令 输入文件 输出文件 幂次");
	}
		if(fp1==NULL)
	{
		printf("输入文件打开失败");
		return 0;
	}
	fp1=fopen(argv[1],"r");//打开并读取参数argv[1]对应的输入文件
	int a,c, i=0,j=0;
	int lines = 0; //行数
	int temp;//用于求幂
	float x,y;//x为输入的数字,y为输出的数字
	//fp2=fopen(argv[2],"w");//打开并写入参数argv[2]对应的输出文件,与“w”相比“a”也可以写入文件,但是写之前文件不进行格式化
	
	//检测行数//////////////////////////////////////////
	while((c = fgetc(fp1))!= EOF)
	{
		if(c=='\n') 
		lines++; 
	} 
	lines = lines+1; 
	fclose(fp1);
    
	int data[ lines ]; //存放运算结果 
	char sdigit [ lines*2]; //检测格式数组

	//判断文件格式/////////////////////////////////////	
	fp1=fopen(argv[1],"r");//打开并读取参数argv[1]对应的输入文件
	while(!feof(fp1))//feof本身是一个非负的整型常量,表明以达到文件末尾
	{
		fscanf(fp1,"%s",sdigit);
		for(j=0;sdigit[j];++j)
		{
			if(isdigit(sdigit[j]))
			{
			//x=sdigit[j];
			//y=pow(x,3);
			//fprintf(fp2,"%f\n",y);//格式化的文件输出,读入并且赋值给实际参数,从第一个参数fp2指定的流中输出内容
			}//返1
			else
			{
				printf("文件中有字母或汉字");
			    //fprintf(fp2,"%c\n",sdigit[j]);//格式化的文件输出,读入并且赋值给实际参数,从第一个参数fp2指定的流中输出内容	
			    exit(0);
			}
		
		}
	}
	fclose(fp1);
	//写入文件/////////////////////////////////////////////
	//float x,y;//x为输入的数字,y为输出的数字
	fp1=fopen(argv[1],"r");//打开并读取参数argv[1]对应的输入文件
	fp2=fopen(argv[2],"w");//打开并写入参数argv[2]对应的输出文件,与“w”相比“a”也可以写入文件,但是写之前文件不进行格式化
	while(!feof(fp1))//feof本身是一个非负的整型常量,表明以达到文件末尾
	{
		fscanf(fp1,"%f\n",&x);//格式化的文件输入,读入并且赋值给实际参数,从第一个参数fp1指定的流中读入内容
		//scanf("%d",&x);//总是从标准输入流stdin中读入内容
		//y=x*x*x;//计算x的三次方
		sscanf(argv[3],"%d",&temp); //argv[3]是字符串格式,sscanf与scanf类似,都是用于输入的,只是后者以屏幕(stdin)为输入源,前者以固定字符串为输入源。从一个字符串中读进与指定格式相符的数据
		printf("temp:%d",temp);
		data[i]=pow(x,temp);
		printf("data[%d]:%d",i,data[i]);
		//fprintf(fp2,"%f\n",y);//格式化的文件输出,读入并且赋值给实际参数,从第一个参数fp2指定的流中输出内容
		//prinf("%d",&y);//总是从标准输入流stdin中输出内容
	    fprintf(fp2,"%d\n",data[i]);//格式化的文件输出,读入并且赋值给实际参数,从第一个参数fp2指定的流中输出内容
		i++;
	}
	fclose(fp1);
	fclose(fp2);
	return 0;
	if (fclose(fp1)!=0);//关闭文件成功关闭则返回值为0
	{
		printf("文件 %s\n 关闭错误",argv[1]);
	}
	if (fclose(fp2)!=0);
	{
		printf("文件 %s\n 关闭错误",argv[2]);
	}
}
/////////////////////
//验证
//gcc p.c -o p.exe
//p.exe myinput.txt myoutput2.txt 5

计算输入文件数据的5 次幂:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值