2.18作业

文章讲述了如何使用C语言中的fgets和fopen函数进行文件操作,包括统计文件行数、实现文件之间的拷贝,以及完成简单的注册和登录功能,涉及多路分支选择和文件读写的流程控制。

作业要求:使用fgets统计给定文件的行数

程序代码:

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
 
int main(int argc, const char *argv[])
{
	if(argc!=2)
	{
		printf("input file error\n");
		printf("usage:./a.out filename\n");
		return -1;
	}
	FILE *fp=NULL;
	if((fp=fopen(argv[1],"r"))==NULL)//只读形式打开传入文件
	{
		perror("fopen error");
		return -1;
	}
	char str[50]="";    //搬运字符
	int line=0;  //统计行号
	while(1)
	{
		char *p=fgets(str,sizeof(str),fp);//循环获取文件内每一行字符,并存入str
		if(NULL==p)
		{	
			break;
		}
			line++;
	}
	printf("line=%d\n",line);//循环结束输出行数;
	fclose(fp);
	return 0;
}

运行结果:

作业要求: 使用fputs和fgets完成两个文件的拷贝。

程序代码:

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
 
int main(int argc, const char *argv[])
{
	if(argc!=3)
	{
		printf("input file error\n");
		printf("usage:./a.out filename\n");
		return -1;
	}
	FILE *srcfp=NULL; //定义两个文件指针;
	FILE *destfp=NULL; 
    //只读形式打开argv[1];只写模式打开argv[2]
	if((srcfp=fopen(argv[1],"r"))==NULL || (destfp=fopen(argv[2],"w"))==NULL)
	{
		perror("fopen error");
		return -1;
	}
	char str[50]="";//搬运字符
	while(1)
	{		
		char *p=fgets(str,sizeof(str),srcfp);//将argv[1]中每行字符存入str;
		if(p==NULL)//如果返回NULL;则结束循环
		{
			break;
		}
		fputs(str,destfp);//将每行获取的字符输入到文件argv[2]中;
	}
	return 0;
}

运行结果:

作业要求:

完成注册登录功能

做个小菜单,功能1是注册功能,输入注册账户和注册密码,将账户和密码写入文件中

功能2是登录功能,提示并输入登录账户和登录密码,并用其遍历文件中的每一组账户和密码,如果匹配成功,则登录成功,如果全部不匹配则提示登录失败。

程序代码:

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
 
int main(int argc, const char *argv[])
{
	int num=0;
	FILE *fp=NULL;
	char str[50]="";
	while(1)
	{
		system("clear");//执行终端指令
		printf("\t\t-----登录界面------\n");
		printf("\t\t------1.注册-------\n");
		printf("\t\t------2.登录-------\n");
		printf("\t\t------3.退出-------\n");
		printf("pelese input option:");
		scanf("%d",&num);
		getchar();
 
		//对menu进行多分支选择
		switch(num)
		{
		case 1:
			{
				if((fp=fopen("./1.txt","a"))==NULL)
				{
					perror("fopen eerror");
					return -1;
				}
				printf("请输入注册账号:");
				scanf(" %s",str);
				fprintf(fp,"%s\n",str);
				printf("请设置注册密码:");
				scanf(" %s",str);
				fprintf(fp,"%s\n",str);
				fclose(fp);
			}break;
		case 2:
			{
				if((fp=fopen("./1.txt","r"))==NULL)
				{
					perror("fopen eerror");
					return -1;
				}
				char input_str[20]="";
ZHIN:
				printf("请输入账号:");
				scanf(" %s",input_str);
				int flag=0;
				while(1)
				{
					char *p=fgets(str,sizeof(str),fp);
					if(NULL==p)
					{	
						break;
					}
					str[strlen(str)-1]='\0';//结尾添加\0作为字符串标志
					int sub=strcmp(str,input_str); //比较两个字符串
					if(!sub)
					{
						flag++;
						printf("账号存在\n");
						break;
					}
				}
 
				if(0==flag)
				{
					printf("输入的账号不存在\n");
					goto 	ZHIN;
				}
MMIN:
				printf("请输入密码:");
				char input_str1[20]="";
				scanf(" %s",input_str1);	
				while(1)
				{
					char *p=fgets(str,sizeof(str),fp);
					if(NULL==p)
						break;
					str[strlen(str)-1]='\0';
					int sub=strcmp(str,input_str1);
					if(!sub)
					{
						flag++;
						printf("登陆成功\n");
						break;
					}
				}
				if(0==flag)
				{
					printf("输入的密码不正确\n");
					goto 	MMIN;
				}
				fclose(fp);
			}break;
		case 3:goto END;
		default:
			   printf("选择的功能有误,请重新输入\n");
		}
		printf("请输入任意按键回车结束\n");
		while(getchar()!='\n');
	}
END:
	return 0;
}

运行结果:

# 题目重述 请使用 MATLAB 编程完成生产经济学课程实验作业中的两个 DEA 模型: - **作业一**:CCR 投入导向 - 乘数模型(对单输出情形进行建模) - **作业二**:CCR 投入导向 - 包络模型(对多输入多输出情形进行建模) 并填写各决策单元(DMU)的效率值。 --- # 给出答案(答案为带注释的代码块) ```matlab % 姓名:张三 % 学号:2023123456 % 生产经济学课程实验作业 % 使用MATLAB求解CCR投入导向模型(乘数法和包络法) clear; clc; %% 作业一:CCR 投入导向 - 乘数模型(单输出) % 数据输入 X1 = [10; 15; 32; 48; 24; 54; 50; 24]; % 输入1 X2 = [40; 25; 24; 16; 48; 27; 60; 50]; % 输入2 Y = [10; 10; 16; 16; 16; 18; 18; 20]; % 输出 n = length(X1); % 决策单元数量 efficiency1 = zeros(n, 1); for k = 1:n % 构造线性规划问题 f = [-ones(2,1); zeros(2,1)]; % 目标函数系数(最大化 u*Yk) A = [-Y(k), 0, X1(k), 0; % 约束矩阵 0, -Y(k), 0, X2(k)]; b = [0; 0]; Aeq = []; beq = []; lb = [0; 0; 0; 0]; % v1, v2 >= 0, u1 >= 0 ub = []; options = optimoptions('linprog','Algorithm','dual-simplex'); [sol, ~, exitflag] = linprog(f, A, b, Aeq, beq, lb, ub, [], options); if exitflag > 0 u = sol(1) + sol(2); v1 = sol(3); v2 = sol(4); efficiency1(k) = u * Y(k) / (v1*X1(k) + v2*X2(k)); else efficiency1(k) = NaN; end end disp('作业一:CCR乘数模型效率值'); disp(efficiency1); %% 作业二:CCR 投入导向 - 包络模型(多输入多输出) % 数据输入 X1_2 = [14.10; 8.76; 8.99; 6.67; 24.61; 9.58; 7.84; 2.14; 18.75; 23.98; ... 12.94; 15.21; 16.84; 9.46; 22.17; 8.72; 17.10; 7.29; 2.20; 1.86; ... 28.04; 11.07; 11.43; 8.75; 21.15; 4.08; 0.63; 9.74; 12.63; 16.29; 7.48]; X2_2 = [13.27; 12.86; 9.39; 5.31; 28.94; 10.58; 6.93; 2.63; 18.37; 23.11; ... 12.74; 14.76; 15.29; 8.63; 21.49; 9.33; 15.69; 7.42; 2.18; 1.67; ... 28.17; 11.67; 12.35; 9.52; 19.48; 5.35; 0.58; 8.42; 9.03; 18.71; 6.67]; Y1_2 = [63.34; 104.34; 72.06; 27.72; 293.78; 64.45; 29.11; 12.69; 82.49; 114.08; ... 47.96; 84.01; 63.24; 38.09; 166.94; 46.38; 70.27; 31.38; 12.37; 8.92; ... 134.72; 37.39; 52.69; 113.67; 110.48; 52.16; 4.00; 37.38; 62.33; 181.66; 38.73]; Y2_2 = [43.92; 18.83; 30.88; 17.11; 79.93; 32.58; 24.33; 6.12; 56.75; 70.44; ... 29.93; 48.05; 53.94; 22.59; 64.34; 30.01; 40.32; 17.48; 6.02; 4.70; ... 83.54; 23.33; 32.37; 22.83; 64.89; 10.37; 1.21; 31.15; 37.36; 48.99; 21.17]; n2 = length(X1_2); efficiency2 = zeros(n2, 1); for k = 1:n2 % 目标函数:最小化 theta f = [1; zeros(n2, 1)]; % [theta; lambda] % 不等式约束:sum(lambda_j * x_ij) <= theta * x_ik A = [-X1_2(k); -X2_2(k)]'; % 投入约束左侧系数 b = -[X1_2(k); X2_2(k)]'; % 右侧为 -x_ik % 输出约束:sum(lambda_j * y_rj) >= y_rk A = [A; Y1_2', Y2_2']; % 添加产出约束 b = [b; Y1_2(k); Y2_2(k)]; Aeq = []; beq = []; lb = [-inf; zeros(n2, 1)]; % theta自由,lambda>=0 ub = []; options = optimoptions('linprog','Algorithm','dual-simplex'); [sol, ~, exitflag] = linprog(f, A, b, Aeq, beq, lb, ub, [], options); if exitflag > 0 efficiency2(k) = sol(1); else efficiency2(k) = NaN; end end disp('作业二:CCR包络模型效率值'); disp(efficiency2); ``` --- # 代码解析 1. **作业一(乘数模型)** 使用对偶形式(乘数法),通过定义权重 $ u, v_1, v_2 $ 来最大化单位虚拟产出与投入之比。利用 `linprog` 解线性规划问题,逐个计算每个 DMU 的效率值。 2. **作业二(包络模型)** 使用原始模型(包络法),目标是最小化投入缩放因子 $ \theta $,满足在保持产出不低于当前水平的前提下,寻找可实现的技术前沿面。同样调用 `linprog` 实现优化。 3. **循环结构** 对每一个 DMU 分别建模求解,确保其相对效率独立评估。 4. **优化设置** 使用 `'dual-simplex'` 算法以提高数值稳定性,适用于大规模或病态约束系统。 5. **输出显示** 最终将两组效率值打印出来,可用于填表。 --- # 知识点(列出该代码中遇到的知识点) 1. **线性规划(Linear Programming)** 使用 `linprog` 求解最优化问题,建模为标准形式 $ \min f^T x $,受限于不等式约束。 2. **数据包络分析(DEA)- CCR模型** CCR模型衡量决策单元的相对效率,基于投入导向或产出导向,假设规模报酬不变。 3. **MATLAB优化工具箱** 调用 `optimoptions` 和 `linprog` 进行线性规划求解,需正确设定目标函数与约束矩阵。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值