存档

文章标签 ‘C语言’

使用正则表达式删除/* */型单行注释

2009年4月7日 Slyar 8 条评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

刚才有个代码需要清除注释,又因为注释很多,于是便想到了正则表达式。可能是很长时间不用正则表达式的缘故,当我用Editplus打开代码勾选"正则表达式"查找替换的时候总也不成功...哎,还是要复习一下正则表达式的语法才行...

看过语法写起来就比较轻松了,因为我的注释都是单行的 /* */ 型注释,这样只要简单地使用下面这条正则表达式就可以快速清除所有的/* */ 型单行注释了。

/\*.*\*/

简单解释一下好了,大致思路就是匹配 /* 和 */ 之间的任意字符。

1、 / 的意思就是 /* 前面的那个 /

2、 \* 的意思是 /* 后面的那个 * ,只是因为 * 是通配符,所以要匹配 * 的时候必须使用它的转义字符 \*

3、 . 的意思是匹配字符

4、 * 的意思就是任意字符,连起来 .* 的意思就是匹配任意字符

5、 \* 的意思是 /* 后面的那个 * ,只是因为 * 是通配符,所以要匹配 * 的时候必须使用它的转义字符 \*

6、 / 的意思就是 /* 前面的那个 /

POJ 1664 放苹果 C语言版

2009年4月6日 Slyar 没有评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

阅读全文...

分类: POJ题解 标签: ,

约瑟夫问题(猴子选大王)循环链表C语言实现

2009年3月31日 Slyar 7 条评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

昨天数据结构课讲循环链表和双向链表,双向链表没什么意思,不写了;循环链表有个典型应用就是解约瑟夫问题(Josephus),这里用的典型题目是"猴子选大王"。

题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照顺序围成一圈,从第 k 个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。

输入数据:猴子总数n,起始报数的猴子编号k,出局数字m

输出数据:猴子的出队序列和猴子大王的编号

代码修改了一天才完成,第一次是用多个函数写的,但是发觉C语言没有引用参数这个特性,使得形参指针不能被直接修改,必须靠返回值来修改才行,这样太麻烦了...于是第二次写的时候就没有使用函数,直接在main()里完成了循环链表的操作,感觉应该没什么问题,哪位大牛看出问题跟我说下,thx...

阅读全文...

分类: 编程相关 标签: ,

线性表玩具之链表版本(C语言)

2009年3月26日 Slyar 2 条评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

本来不想发这么水的代码,可是最近也没什么好写的...纯当凑文章数目吧...

这是一个线性表操作的小玩具,此篇为链表版本,也就是用指针和动态内存分配的。

阅读全文...

分类: 编程相关 标签: ,

线性表玩具之顺序表版本(C语言)

2009年3月25日 Slyar 没有评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

本来不想发这么水的代码,可是最近也没什么好写的...纯当凑文章数目吧...

这是一个线性表操作的小玩具,此篇为顺序表版本,也就是用数组的。

阅读全文...

分类: 编程相关 标签: ,

单链表的操作C语言版

2009年3月24日 Slyar 2 条评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

昨天数据结构课在讲单链表,所以写了一份单链表的操作C语言实现代码。如果代码有什么不完善的地方,还请指出,谢谢。

操作中包括单链表的创建、插入、查找、删除和销毁等。

阅读全文...

分类: 编程相关 标签: ,

矩阵乘法C语言实现

2009年3月20日 Slyar 13 条评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

这段代码是我刚写的,不是什么技巧性很强的东西,完全都是基础。上午线性代数讲了矩阵乘法,下午没课,寻思着自己也好久没写程序了,不如就拿矩阵乘法开刀,熟悉一下C语言...顺便也可以用来做线性代数的作业...=_=

恩,代码有些长,我只是想多回顾一下以前的知识...这段代码用到了函数、指向指针的指针、函数指针、文件操作...加了注释方便需要的童鞋理解...

代码可能还不完善...以后学得更多了再改吧...

2009.3.23    增加内存释放函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
/*
矩阵乘法C语言实现
Slyar 2009.3.20
*/
 
#include <stdio.h>
#include <stdlib.h>
 
/* 给 int 类型定义别名 datatype */
typedef int datatype;
 
/* 函数声明部分 */
datatype** Create(int m, int n);
void Reset(datatype**, int, int);
void Input(datatype**, int, int);
void Output(datatype**, int, int);
void MatrixMutiply(datatype**, datatype**, datatype**);
void MatrixFree(datatype** , int);
 
/* 定义三个矩阵的行列大小 */
int row_a, col_a;
int row_b, col_b;
int row_c, col_c;
 
/* 定义文件指针 */
FILE *fp;
 
int main()
{
        int i;
        datatype **a, **b, **c;
 
        /* 以只读方式打开输入文件 in.txt */
        if((fp = fopen("in.txt","r")) == NULL)
        {
                printf("Cannot open this file.\n");
                exit(0);
        }
 
        /* 创建并读入矩阵a */
        fscanf(fp,"%d%d", &row_a, &col_a);
        a=Create(row_a, col_a);
        Input(a,row_a, col_a);
 
        /* 创建并读入矩阵b */
        fscanf(fp,"%d%d", &row_b, &col_b);
        b = Create(row_b, col_b);
        Input(b,row_b, col_b);
 
        /* 关闭输入文件 */
        fclose(fp);
 
        /* 以写入方式打开输出文件 out.txt */
        if((fp = fopen("out.txt","w")) == NULL)
        {
                printf("Cannot open this file.\n");
                exit(0);
        }
 
        /* 判断两个矩阵能否相乘 */
        if(col_a == row_b)
        {
                row_c = row_a;
                col_c = col_b;
        }
        else
        {
                fprintf(fp,"Matrix Can't Mutiply !\n");
                exit(0);
        }
 
        /* 创建并初始化结果矩阵c */
        c = Create(row_c, col_c);
        Reset(c, row_c, col_c);
 
        /* 进行矩阵乘法运算 */
        MatrixMutiply(a, b, c);
 
        /* 输出结果矩阵C */
        Output(c, row_c, col_c);
 
        /* 关闭输出文件 */
        fclose(fp);
 
        /* 释放矩阵内存 */
        MatrixFree(a,row_a);
        MatrixFree(b,row_b);
        MatrixFree(c,row_c);
 
        //system("pause");
        return 0;
}
 
/* 为矩阵动态分配内存的函数 */
datatype** Create(int m, int n)
{
        int i;
        datatype **Matrix;
        Matrix = (datatype **) malloc(sizeof(datatype *) * m);
        for(i = 0; i < m; i++)
        {
                Matrix[i] = (datatype *) malloc(sizeof(datatype) * n);
        }
        return Matrix;
}
 
/* 初始化矩阵函数 */
void Reset(datatype** Matrix, int m, int n)
{
        int i,j;
        for(i = 0; i < m; i++)
        {
                for(j = 0; j < n; j++)
                {
                        Matrix[i][j] = 0;
                }
        }
}
 
/* 读入数据函数 */
void Input(datatype** Matrix, int m, int n)
{
        int i,j;
        for(i = 0; i < m; i++)
        {
                for(j = 0; j < n; j++)
                {
                        fscanf(fp,"%d", &Matrix[i][j]);
                }
        }
}
 
/* 输出数据函数 */
void Output(datatype** Matrix, int m, int n)
{
        int i,j;
        for(i = 0; i < m; i++)
        {
                for(j = 0; j < n; j++)
                {
                        fprintf(fp,"%d ", Matrix[i][j]);
                }
                fprintf(fp,"\n");
        }
}
 
/* 矩阵乘法运算函数 */
void MatrixMutiply(datatype** a, datatype** b, datatype** c)
{
        int i,j,k;
        for(i = 0; i < row_c; i++)
        {
                for(j = 0; j < col_c; j++)
                {
                        for(k = 0; k < col_a; k++)
                        {
                                c[i][j] += a[i][k] * b[k][j];
                        }
                }
        }
}
 
/* 释放矩阵内存函数 */
void MatrixFree(datatype** Matrix, int m)
{
        int i;
        for(i = 0; i < m; i++)
        {
                free(Matrix[i]);
        }
        free(Matrix);
}
分类: 编程相关 标签: ,

几个复杂指针类型的分析与对比

2009年2月10日 Slyar 1 条评论

文章作者:Slyar 文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作。

上星期某个夜深人静的夜里Slyar小研究了一下C语言中的指针,对于复杂指针类型的分析偶有所得,写出来谨供互相讨论学习。

int p;

p是一个普通的整型变量。

int *p;

1、p与*结合,说明p是一个指针。
2、*p与int结合,说明指针所指向的内容的类型是整型的。

所以p是一个返回整型数据的指针。

int p[5];

1、p与[]结合,说明p是一个数组。
2、p[5]与int结合,说明数组里的元素是整型的。

所以p是一个由整型数据组成的数组。

int *p[5];

1、p与[]结合(因为其优先级比*高),说明p是一个数组。
2、p[5]与*结合,说明数组里的元素是指针类型。
3、*p[5]与int结合, 说明指针所指向的内容的类型是整型的。

所以p是一个由返回整型数据的指针所组成的数组。

int (*p)[5];

1、p与*结合,说明p是一个指针。
2、*p与[]结合,说明指针所指向的内容是一个数组。
3、(*p)[5]与int结合,说明数组里的元素是整型的。

所以p是一个指向由整型数据组成的数组的指针。

int **p;

1、p与*结合,说明p是一个指针。
2、*p与*结合,说明指针所指向的元素是指针。
3、**p与int结合,说明指针所指向的内容的类型是整型的。

所以p是一个指向整型指针的指针。

int p(int);

1、p与()结合,说明p是一个函数。
2、p()与()里的int结合,说明函数有一个int型的参数。
3、p(int)与外面的int结合,说明函数的返回类型是整型。

所以p是一个有一个整型参数且返回类型为整型的函数。

int (*p)(int);

1、p与指针结合,说明p是一个指针。
2、*p与()结合,说明指针指向的是一个函数。
3、(*p)()与()里的int结合,说明函数有一个int型的参数。
4、(*p)(int)与最外层的int结合,说明函数的返回类型是整型。

所以p是一个指向有一个整型参数且返回类型为整型的函数的指针。

int *(*p(int))[5];

1、从p处开始,先与()结合,说明p是一个函数.
2、p()与()里的int结合,说明函数有一个int型的参数。
3、p(int)与外面的*结合,说明函数返回的是一个指针。
4、(*p(int))与[]结合,说明返回的指针指向的是一个数组。
5、(*p(int))[5]与*结合,说明数组里的元素是指针。
6、*(*p(int))[5]与int结合,说明指针所指向的内容的类型是整型的。

所以p是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数。

分类: 编程相关 标签: ,
bnuep:0801010047