算法竞赛入门经典第2章【读书笔记】

本文旨在深入浅出地讲解编程基础,从掌握for循环和while循环的使用方法,到学会计数器和累加器的运用,再到调试输出中间结果的技巧。同时,文章还介绍了如何测试程序效率、使用重定向进行文件读写、理解算法竞赛中的文件命名规则等。此外,内容还包括了矩阵转置操作的实现,以及如何在本地环境和提交代码时使用条件编译指示。文章最后介绍了使用计时函数测试程序效率的方法,为读者提供了全面的编程技能提升路径。

【学习目标】

01掌握for循环的使用方法(OK)

02掌握while循环的使用方法(OK)

03学会使用计数器和累加器(OK)

04学会使用输出中间结果的方法调试(OK)

05学会用计时函数测试程序效率(不熟悉)

06学会用重定向的方法读写文件(基本不会)

07学会用fopen的方式读写文件(基本不会)

08了解算法竞赛对文件读写方式和命名的严格性(嗯)

09记住变量在赋值之前的值是不确定的(OK)

10学会使用条件编译指示构架本地运行环境(不会)




P18

注意浮点数的运算(包括返回浮点数的函数)可能有误差!

编写一个程序判断输出的数(n<10^9)是不是完全平方数,是输出yes,否则输出no;

#include <stdio.h>
#include <math.h>

int
main(void)
{
	int n;
	double r;

	scanf("%d", &n);
	r = sqrt(n);//or r = sqrt((double)n);
	printf(floor(r+0.5) == r ? "yes\n" : "no\n");	
	return 0;
}


for (i = 0; i != N; i++)
break;语句退出循环时,i++还会执行么?continue呢?

#include <stdio.h>
#define N 100

int
main(void)
{
	int i;

	for (i = 0; i != N; i++) {
		if (i == 5)
			continue;
			
		if (i == 10)
			break;
	}
	printf("%d\n",i);
	return 0;
}

执行这个程序,输出会是10,说明退出循环时i++没有执行,而continue执行后,如果i++不执行,那么必定陷入无限循环了。所以i++必须要执行。

可见循环出口一旦执行,i++肯定不会再执行;而继续循环(中途就继续或者正常继续),i++肯定会执行。


05学会用计时函数测试程序效率

#include <stdio.h>
#include <time.h>
int
main(void)
{	
	int n, i, j;
	clock_t star, end;
	
	scanf("%d", &n);
	star = clock();
	for (i = 0; i != n; i++)
		for (j = 0; j != n; j++)
			;
	end = clock();
	printf("%lf\n", (double)(end-star) / CLOCKS_PER_SEC);
	//notice! is CLOCKS including 'S'
	return 0;
}

这样写可以避免把等待输入的时间也算上,注意常量CLOCKS_PER_SEC带'S'。

linux中重定向输入是echo 12321 | ./program_name


06学会用重定向的方法读写文件

学会这个主要是可以把输入输出放在一个文本,省的在终端输入或粘贴测试数据,特别是输入一些矩阵时。

下面默认输入文件名是test.in,输出文件名是test.out

下面写一个程序,输入一个n*n的矩阵(n<=100),输出矩阵的转置矩阵;

比如,

输入:

3

1 2 3

1 2 3

1 2 3

输出:

1 1 1

2 2 2

3 3 3

(注意:每一行最后一个元素后面没有空格)

【普通版本】

#include <stdio.h>
#define N 110
int a[N][N];

int
main(void)
{
	int i, j, n;
	
	scanf("%d", &n);
	for (i = 0; i != n; i++)
		for (j = 0; j != n; j++) {
			scanf("%d", &a[i][j]);
		}
	
	for (j = 0; j != n; j++)
		for (i = 0; i != n; i++) {
			printf(i == n-1 ? "%d\n" : "%d ", a[i][j]);
		}
				
	return 0;
}


【重定向版本】

#include <stdio.h>
#define N 110
int a[N][N];

int
main(void)
{
	int i, j, n;

	freopen("test.in", "r", stdin);
	freopen("test.out", "w", stdout);
	
	scanf("%d", &n);
	for (i = 0; i != n; i++)
		for (j = 0; j != n; j++) {
			scanf("%d", &a[i][j]);
		}
	
	for (j = 0; j != n; j++)
		for (i = 0; i != n; i++) {
			printf(i == n-1 ? "%d\n" : "%d ", a[i][j]);
		}
				
	return 0;
}
可以看到重定向版本就多了两行代码!就是读取test.in的内容作为标准输入流(stdin),把标准输出流(stdout)的内容写入到test.out。


【fopen版】

#include <stdio.h>
#define N 110
int a[N][N];

int
main(void)
{
	int i, j, n;

	FILE *fin, *fout;//file pointer indicated file name;
	fin = fopen("test.in", "r");
	fout = fopen("test.out", "w");
		
	fscanf(fin, "%d", &n);
	for (i = 0; i != n; i++)
		for (j = 0; j != n; j++) {
			fscanf(fin, "%d", &a[i][j]);
		}
	
	for (j = 0; j != n; j++)
		for (i = 0; i != n; i++) {
			fprintf(fout, i == n-1 ? "%d\n" : "%d ", a[i][j]);
		}
	
	fclose(fin);
	fclose(fout);
	
	return 0;
}
其实这个版本也很容易理解,首先打开文件,fin是文件的指针,并且可以读文件,然后scanf()改为fscanf(),即从文件中读取,参数也相应加了一个,并在最开始部分指定文件的地址(指针);写入的原理以此类推。


感觉重定向相当好用哦!

书中介绍本地用重定向,提交则删除“重定向”语句,感觉不是太实用,但不妨一学。

10学会使用条件编译指示构架本地运行环境

#include <stdio.h>
#define N 110
int a[N][N];

int
main(void)
{
	int i, j, n;

#ifdef LOCAL
	freopen("test.in", "r", stdin);
	freopen("test.out", "w", stdout);
#endif
	
	scanf("%d", &n);
	for (i = 0; i != n; i++)
		for (j = 0; j != n; j++) {
			scanf("%d", &a[i][j]);
		}
	
	for (j = 0; j != n; j++)
		for (i = 0; i != n; i++) {
			printf(i == n-1 ? "%d\n" : "%d ", a[i][j]);
		}
				
	return 0;
}
上述程序文件名为test.c

那么我们通过编译命令:(注意是:-DLOCAL)

gcc -g -Wall -DLOCAL test.c -o test
就会执行重定向那两句代码了,反之去掉-DLOCAL就不会执行



基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)内容概要:本文围绕“基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究”,介绍了利用Matlab代码实现配电网可靠性的仿真分析方法。重点采用序贯蒙特卡洛模拟法对配电网进行长时间段的状态抽样与统计,通过模拟系统元件的故障与修复过程,评估配电网的关键可靠性指标,如系统停电频率、停电持续时间、负荷点可靠性等。该方法能够有效处理复杂网络结构与设备时序特性,提升评估精度,适用于含分布式电源、电动汽车等新型负荷接入的现代配电网。文中提供了完整的Matlab实现代码与案例分析,便于复现和扩展应用。; 适合人群:具备电力系统基础知识和Matlab编程能力的高校研究生、科研人员及电力行业技术人员,尤其适合从事配电网规划、运行与可靠性分析相关工作的人员; 使用场景及目标:①掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的基本原理与实现流程;②学习如何通过Matlab构建配电网仿真模型并进行状态转移模拟;③应用于含新能源接入的复杂配电网可靠性定量评估与优化设计; 阅读建议:建议结合文中提供的Matlab代码逐段调试运行,理解状态抽样、故障判断、修复逻辑及指标统计的具体实现方式,同时可扩展至不同网络结构或加入更多不确定性因素进行深化研究。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值