前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >8个小时8个小时的上机课!!

8个小时8个小时的上机课!!

作者头像
phith0n
发布2020-10-16 10:39:40
5440
发布2020-10-16 10:39:40
举报
文章被收录于专栏:离别歌 - 信息安全与代码审计

8个小时8个小时的上机课!!

    今天经历了惨无人道的上机课,整整八个小时,面对着C语言,老泪纵横……

    一个寒假没写C了。

    记录一下今天大概弄了这么几件事:

    1.大数的乘法:

    两个数组lin1[100],lin2[100]保存两个大数,结果保存在lout[201]中。公式是lout[i+j] = lin1[i] * lin2[j]; a、b的实际长度保存在lin1[0],lin2[0]中。

代码语言:javascript
复制
	for (i = 0 ; i < lin1[0] ; i++)
	{//注意i和j要从0开始,否则不能用公式了
		for (j = 0 ; j < lin2[0] ; j++)
		{//因为i,j从0开始,而lin1/lin2[0]不是第一个数字,所以要进行处理
			lout[i+j] += lin1[lin1[0] - i] * lin2[lin2[0] - j];
			lout[i+j+1] += lout[i+j]/10;
			lout[i+j] %= 10;
		}//后两个表达式表示进位,保证每位都只有一个数字
	}

    2.大数整除普通数(我这里是2,因为我做的题目是进制转换)

    将大数a[]整除2后保存在b[]中,这里以一个函数给出。如果除以其他数将2更换即可。

代码语言:javascript
复制
void div2(int a[] , int b[]) //大数除法(除以2)
{//a[0]中保存大数a的长度
	int i,n,mod = 0;
	for (i = 1 ; i <= a[0] ; i++ )
	{
		n = a[i] + mod * 10;
		b[i] = n / 2;
		mod = n % 2;
	}
	b[0] = a[0];
	return ;
}

    思路跟小学在草稿纸上算除法一样(实际上我就是拿着笔在草稿纸上边算边想的程序)。

    3.重定向函数freopen

    以前用过这个函数,函数原型是:

FILE *freopen(const char *filename,const char *type, FILE *stream);

用法:freopen("01.in","w",stdin); 将标准输入流重定向到01.in。意思是将以前从命令提示符输入的东西改用文件01.in输入。同理输出则第三个参数为stdout。好处:输入输出时用printf、scanf就可以向文件中读、写东西了,不用再用文件操作fprintf..

    这里讲一下把它改回来的用法(把标准输入输出流改回命令提示符):

freopen("CON","r",stdin); 和 freopen("CON","w",stdout);

    4.Linux下文件复制(即不用API)

    每次拷贝1024字节,直到文件拷贝完成。使用的I/O文件流。

代码语言:javascript
复制
#include <stdio.h>
#include <fcntl.h> 
#include <io.h>
#include <string.h>

//文件复制,未使用Windows API,即可以在不同平台下使用
int main(int argc, char *argv[])
{
	char buffer[1024];
	char * ptr;
	int rlen,wlen;
	if (4 != argc || strcmp(argv[1],"HCOPY") != 0)
	{
		printf("正确格式为:HCOPY filename1 filename2\n");
		return 0;
	}
	int hin = open(argv[2],O_RDONLY);
	if(hin < 0)
	{
		printf("打开来源文件错误,请检查输入\n");
		return 0;
	}
	int hout = open(argv[3],O_WRONLY | O_CREAT);
	if(hin < 0)
	{
		printf("打开目标文件错误,请检查输入\n");
		return 0;
	}	

	while(rlen = read(hin,buffer,sizeof(buffer))) //循环读取来源文件,每次读取1024字节
	{
		if (rlen == -1)
		{
			printf("读取文件出错\n");
			return 0;
		}
		else if(rlen > 0) //得到的结果大于0则进行复制
		{
			ptr = buffer;
			while(wlen = write(hout,ptr,rlen))
			{
				if(wlen == -1)
				{
					printf("写入文件错误\n");
					return 0;
				}
				else if (wlen == rlen) //如果写入的和读出的字节相同,则说明全部写完了,就跳出本循环
				{
					break;
				}
				else if(wlen > 0) //没有全部写完,继续写
				{
					ptr += wlen;
					rlen -= wlen;
				}
			}
		}

	}
	printf("操作成功\n");
	close(hin); //勿忘关闭文件
	close(hout);	
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 8个小时8个小时的上机课!!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档