Archive for C语言

照着别人写的js库,重新写了一个c版本的,也学了一下其中的算法。为什么需要松圆盘采样这个算法进行采样,是因为存随机其实也不是纯随机,随机分布不均匀。而这样生成的伪随机(psuedorandom)数列,很大程度保证了随机的均匀性。 开始以为很难,边写边学发现其实原理不太难。 基本思想就是,初始点可以给定或者随机。 第二步根据初始点,按照一定角度生成不同方向的新点,其中这个角度是关键。通过三角函数,保证生成的新点到初始点的距离为r。 第三步判断新生成点跟周围两个区域的点的距离,保证距离大于r。如果点不合法,则改变角度,重新生成。有一个重试次数保证重新生成上限,如果达到上限还没有找到一个新点,就说明这个点有问题,进行删除。如果合法,生成的点作为一个选择点并插入队列,作为下一次判断的初始点 第四步,队列中有其他生成点,继续上边第二第三步,直到没有生成点可以用。 期间我看js版本生成随机数的时候用的自己写的伪随机生成数,然后我就看了一下用的库,发现里边用了一个Thomas Wang写的 hash生成随机数,又简单看了一下。都是位操作,也懒得找原理看。先记一下,以后用到再看原理吧。

Continue

clear主要作用是清屏 ax=0600h初始化屏幕 cx起始位置 dx结束位置 然后调用bios中断 clear下边是设置光标的位置 ah=02h dh行,dl列 DispStr主要打印hello world 详细介绍google搜索得到。 boot/boot.asm代码:

org 07c00h
mov ax,cx
mov ds,ax
mov es,ax
call clear
call DispStr
jmp $

clear:
    mov cx,00h
    mov dx, 2580h
    mov bh, 00h
    mov ax, 0600h
    int 10h

    mov bh, 00h
    mov dh, 11h
    mov dl, 00h
    mov ah, 02h
    int 10h
    ret

DispStr:
    mov ax,BootMessage
    mov bp, ax
    mov cx, 12
    mov ax, 1301h
    mov bx, 000ch
    mov dl, 0
    int 10h
    ret

BootMessage:    db  "hello, world!"
times 510-($-$$) db 0
dw 0xaa55

Continue

lisp群里有人写操作系统,我又想起了以前写的。以前写的没做完,当时有很多不明白的,现在决定看书再做一遍。 环境搭建:系统是ubuntu,编译器gcc,make,nasm,虚拟机bochs,然后应该没了。 bochsrc.txt文件配置 floppya: image=./img/a.img, status=inserted,加载软盘镜像 ata0-master: type=disk, path="./img/c.img", mode=flat, cylinders=20, heads=16, spt=63, 硬盘镜像,这个还没用,建了个10M的文件 boot: floppy,,启动顺序 #boot: disk log: ./log/bochsout.txt 日志记录 parport1: enabled=1, file="./log/parport.out"# 并口的数据记录文件 应该在没啥了,有错误可以再改。 Makefile文件配置

build/boot : boot/boot.asm
	nasm boot/boot.asm -o build/boot

a.img : build/boot
	dd if=build/boot of=img/a.img bs=512 count=1 conv=notrunc

run : a.img
	bochs

clean :
	rm build/boot
每次直接make run就可以了
~/code/os$ tree
.
├── bochsrc.txt
├── boot
│   └── boot.asm
├── build
│   └── boot
├── img
│   ├── a.img
│   └── c.img
├── log
│   ├── bochsout.txt
│   └── parport.out
└── Makefile

目录结构,先这样了。慢慢添加

Continue

啃了python源代码,从python.c开始慢慢看到token获取,学到很多东西,但是我看到python源代码也有很多可以优化的地方。很多参数、变量可以不要的,同样的判断在不同地方使用的不同方法,我靠看的我晕头转向。一到晕头转向的时候,我就重新从有疑问的地方再走一遍,认真看关键代码,然后才能看懂这一部分的功能。 语言的基本语法想个差不多了,天马行空了一下,与开始想的差距太大。

Continue

1 安装 下载的最新的3.4, http://llvm.org/releases/download.html#3.4 Clang source code (.sig) LLVM source code (.sig) Compiler RT source code (.sig) 官方安装文档:http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary 下载的源码主要解压到正确目录就行了. mkdir build cd build ../configure make make install 编译的二进制文件在llvm-3.4/build/Release+Asserts/bin 搞定了 clang --version clang version 3.4 (tags/RELEASE_34/final) Target: x86_64-unknown-linux-gnu Thread model: posix 源里边最新的是3.3的 2 写一个c的hello world

#include 

int main() {
  printf("hello world\n");
  return 0;
}
听说clang比gcc速度快。 clang hello.c -o hello 这里和gcc生成一样的系统执行文件 生成llvm的字节码文件 clang -O3 -emit-llvm hello.c -c -o hello.bc 两种形式运行 ./hello lli hello.bc

Continue

老师说要实现一个在线c语言学习的网站,引导用户一步一步编程。 找到这个网站:http://www.codecademy.com,准备以这个网站为原型设计。这个也不错http://www.paomianba.com/astar/ 需要一个一步一步的引导语,一个代码框,再一个代码保存的功能。代码运行这个先不考虑,安全性我还没考虑好。 加入用户登录功能,记录学习进度。加入每个步骤的提问,评论功能。 后台能够添加教程。 难度主要在代码输入编辑框中后,检测输入是否正确。 代码框准备使用http://ace.ajax.org/。前端使用js与服务器进行数据交互,判断是否正确。 后台代码用python写,框架不准备用django了,笨了点,使用tornado或者web.py,这两个文档都有看,就是没有实践一下了。数据库还是用mysql,查查资料,看看换个,借机学学其他数据库。

Continue

解决问题的方法真的有好多种,有的可以用很少的代码实现,好佩服。 自己写的代码:

/*
ID:
LANG:C
TASK:friday
*/
#include
int main()
{
int i,j,n,a[7]={0},t;//t
FILE *fin=fopen("friday.in","r");
FILE *fout=fopen("friday.out","w");
fscanf(fin,"%d",&n);
for(i=0;i

看到蔡勒公式,感觉有意思 记录一下,说不定会用到
    蔡勒公式是一种计算任何一日属一星期中哪一日的算法,由蔡勒(Julius Christian Johannes Zeller)推算出。


公式都是基于公历的置闰规则来考虑。
公式中的符号含义如下:

    w:星期
    c:世纪(前两位数)
    y:年(后两位数)
    m:月(m 的取值范围为 3 至 14,即在蔡勒公式中,某年的 1、2月要看作上一年的 13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算)
    d:日
    [ ]:称作高斯符号,代表取整,即只要整数部份。
    mod:‎‎同余‎(这里代表括号里的答案除以 7 后的余数)(请注意前面是负数取模的情况,取模只可以是正数)

若要计算的日期是在1582年10月4日或之前,公式则为

(因罗马教皇修改历法,把1582年10月4日的下一天改为1582年10月15日) 

Continue

今天做完百度acm的题,群里几个人在讨论各个学校的acm队伍、学习等。说到一起做USACO Training上的题目。我遍开始做了,以为这个网站是训练,是一个循序渐进的过程。做到Greedy Gift Givers这个题目,学到很多东西,记录一下。 这个题目很简单,不需要神马高深的算法,主要学到许多c语言的用法,先上我自己写的代码。

/*
ID:
LANG:C
TASK:gift1
*/
#include
struct gift
{
char name[15];
int get;
int give;
}g[10];
int main()
{FILE *fin=fopen("gift1.in","r");
FILE *fout=fopen("gift1.out","w");
int i,np;
fscanf(fin,"%d",&np);
for(i=0;i
这里学到的几点:
结构体里的get和give可以只用一个最后结果表示就行。
我自己写的查找字符串的操作遍历了结构图数组所有元素,可以直接break退出循环,看别人写的代码用while很好,记录下。
j=0;
while(strcmp(a[j],b)) j++;

Continue

今天把操作系统作业做完了,本来以为很简单的一个程序几十行就写完了。没想到写了有二百行,各种添加变量,各种添加if,各种添加for,直接晕菜了。 写得很乱,说不定明天就忘记写得神马意思了。先贴出来,等上机的时候在优化一下。<操作系统课程设计--短作业优先作业调度> code:

#include
#include
#include
#define MAXNUM 5
#define MAXTIME 20
struct sjf 
{
	char name[8];
	int arrivetime;
	int servicetime;
	int runtime;
	int is_over;//是否运行完
	int starttime;
	int finishtime;
	int turnaroundtime;
	float rightturnaroundtime;
}p[MAXNUM];


static int j=0,k=0,l=0;//j当前正在执行的进程	k当前时间已经到达的最大进程 l是否没有进程运行


//读取进程数据
void readProcess()
{
	int i;
	char str[200];
	FILE *fp;
	char *token;
	if ((fp=fopen("Process","rt"))==NULL)
	{
		printf("读取文件失败!\n");
		getchar();
		exit(1);
	}
	printf("|--------------------------------------|\n");
	printf("|--进程名称--|--到达时间--|--服务时间--|\n");
	for (i=0;i

Continue

#include  
/* 用于将输入复制到输出的程序;第2个版本 */
main ( )
{
int  c;
while ( (c = getchar ( ) ) != EOF )
putchar ( c );
}
g e t c h a r函数在没有输入时返回一个特殊值,这个特殊值不能与任何实际字符相混淆。这个值叫做E O F(End Of File,文件结束) 。必须把c说明成一个大到足以存放g e t c h a r函数可能返回的各种值的类型。之所以不把c说明成c h a r类型,是因为c必须大到除了能存储任何可能的字符外还要能存储文件结束符E O F。因此,把c说明成i n t类型的。 VC6.0打印输出EOF值发现是-1

Continue