博文
计算日期(2008-12-07 13:19:00)
摘要:// 给定一个天数,查询该天之后的日期
//例如
//当前日期是 2008 11 10 则5050天后是 2022 9 8
#include <iostream>
using namespace std;
class DAY
{
private:
int y;
int m;
int d;
int days[12];
public:
DAY()
{
cout<<"请输入当前日期"<<endl;
cout <<"year"<<endl;
cin >> y;
cout << "mouth"<<endl;
cin >>m;
cout << "day"<<endl;
cin >> d;
int i;
for( i = 1 ; i <= 12 ; i++)
{
switch(i)
{
case 2:
days[i-1] = isLeapYear() ? 29:28; //设置2月天数
break;
case 4:
case 6:
case 9:
case 11:
days[i-1] = 30;
break;
&n......
好久没有写了,故,今日特写(2008-11-29 22:37:00)
摘要:好久都没有写博客了,觉得今天是应该写些什么。
暑假期间我用了一个月的时间把<C++ primer plus >5th看了一遍,这估计是我这辈子看技术类书籍最快的一次了,看完之后总觉得应该用C++做个什么来稍微练练,后来有一次在上微处理课时突然就想到了做一个类似于电子宠物的小程序。
经过慢腾腾的编写过程后终于将这个程序写完了(仅实现了大体的功能),而这次代码行数也终于突破一千大关(之前一直都因自己学了这么久的编程了,写的代码都是百行的而郁闷)
说实话,我一直都想写个大一些的程序,但最终不是因为难度太大就是因为找不到题目而最终不了了之。唉,看着那些牛人在上学期间就已写了很多程序了,而我至今仍停留在百行当中。唉,已然大三了!
P.S : 关于暑假看的那本书的速度,说实话我当时那么快的想看完那本书仅仅只是为了想快点看《C++ Primer》,后来被证明是有些不太好,因为有好些东西不够并没有较好的记住。以后看技术类书的时候,最好还是不要看的太快。......
代码高亮的小程序(2008-07-06 11:22:00)
摘要:
之前在论坛上见有人做了一个代码高亮的程序,于是我也有些心动。
这是样本代码:
#include <stdio.h>
#include <conio.h>
int main()
{
int a=0,n=0,c=0;
char ch;
printf("请输入字符串\n");
while ((ch=getchar())!='\n')
{
//printf("请输入字符\n");
if (ch=='i')
a=1;
if (ch!='e'&&ch!='i'&&a==1||ch=='*')
c++;
if (ch=='e'&&a==1) //当a为1时表示在e之前有i
{
if (c==1) //当c等于1时表示i与e之间只有一个其他字符
{
n++;
a=0;
}
c=0; //如果此处不重新赋值为0,则下次c会在1的基础上继续递增
}
}
printf("刚才的字符中有%d次",n);
getch();
return 0;
}
转换后:
[color=red]#include <stdio.h>[/color]
[color=red]#include <conio.h>[/color]
[color=blue]int[/co......
用状态机实现对代码中注释的清除(2008-07-03 14:11:00)
摘要:之前写了一个同样功能的一段程序http://blog.programfan.com/article.asp?id=34327
这次模仿别人的思路,我自己又重新写了一个用状态机实现的。相比之前我写的那个,这次的代码明显短了很多。
/*
用状态机实现对代码中注释的清除.
Visual C++ 2005 编译
08.6.26
zhaoyg
*/
#include <stdio.h>
#include <string.h>
#define SCREEN
void initialize_fsm(char fsm[7][256]);
int main()
{
int ch , temp = 0 ;
int state = 0;
char fsm[7][256];
FILE *pfin ;
pfin = fopen("sweep-comments.txt","r");
#ifdef SCREEN
#define OUT stdout
#else
FILE *pfout;
pfout = fopen("result.txt","w");
#define OUT pfout
#endif
initialize_fsm(fsm);
#pragma region FSM ///尝试#pragma region功能. Visual C++ 2005
while ((ch = fgetc(pfin)) !=EOF)
{
state = fsm[state][ch];
if ( state != 2 && ch !='*' && temp == '/')
fputc(temp,OUT);
temp = ch;
&......
[转载]内存区划分、内存分配、常量存储区、堆、栈、自由存储区、全局区(2008-05-15 01:00:00)
摘要:一. 在c中分为这几个存储区
1.栈 - 由编译器自动分配释放
2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收
3.全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放
4.另外还有一个专门放常量的地方。- 程序结束释放
&nbs......
[转贴]void及void指针深层探索(2008-05-13 13:14:00)
摘要:
void及void指针深层探索
1.概述
许多初学者对C/C++语言中的void及void指针类型不甚理解,因此在使用上出现了一些错误。本文将对void关键字的深刻含义进行解说,并详述void及void指针类型的使用方法与技巧。
2.void的含义
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:
void a;
这行语句编译时会出错,提示“illegal use of type 'void'”。不过,即使void a的编译不会出错,它也没有任何实际意义。
void真正发挥的作用在于:
(1) 对函数返回的限定;
(2) 对函数参数的限定。
我们将在第三节对以上二点进行具体说明。
众所周知,如果指针p1和p2的类型相同,那么我们可以直接在p1和p2间互相赋值;如果p1和p2指向不同的数据类型,则必须使用强制类型转换运算符把赋值运算符右边的指针类型转换为左边指针的类型。
例如:
float *p1;
int *p2;
p1 = p2;
其中p1 = p2语句会编译出错,提示“'=' : cannot convert from 'int *' to 'float *'”,必须改为:
p1 = (float *)p2;
而void *则不同,任何类型的指针都可以直接赋值给它,无需进行强制类型转换:
void *p1;
int *p2;
p1 = p2;
但这并不意味着,void *也可以无需强制类型转换地赋给其它类型的指针。因为“无类型”可以包容“有类型”,而“有类型”则不能包容“无类型”。道理很简单,我们可以说“男人和女人都是人”,但不能说“人是男人”或者“人是女人”。下面的语句编译出错:
void *p1;
int *p2;
p2 = p1;
提示“'=' : cannot convert from 'void *' to 'int *'”。 ......
[转贴]水滴石穿C语言之正确使用const(2008-05-13 13:13:00)
摘要:基本解释
const是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
虽然这听起来很简单,但实际上,const的使用也是c语言中一个比较微妙的地方,微妙在何处呢?请看下面几个问题。
问题:const变量 & 常量
为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?
const int n = 5;
int a[n];
答案与分析:
1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。
2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它。
3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。
来自:弘少 http://www.bansun.com/bbs/thread-4878-1-5.html......
清除代码中的注释(2008-04-19 23:29:00)
摘要:昨天在一个人的blog中看到他做了一个清除代码中的注释的小程序,于是我自己也来了兴趣。
以下是我自己做的,完全是我独立思考的。
不过相比之下我的代码比人家的多了很多,唉,心痛呀!!!
stack_push、stack_pop 、cope_string与cope_comment这四个函数的代码都copy于我做的那个代码缩排程序里的代码,只有局部做了些删除。
----------------------------------------------------------------------------
/*
清除代码中的注释
zhaoyg 08.4.19
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
char item;
stack *next;
}stack;
void stack_push( stack **,char );
stack *stack_pop (stack **);
stack *cope_string(FILE *fout,stack *current_node_string);
stack *cope_comment(FILE *fout,stack *current_node_comment);
int main()
{
char current_char;
FILE *pfin,*pfout;
stack *current_node=NULL ,*head=NULL;
pfin = fopen("test.txt","r");
pfout = fopen("out.txt","w");
////////////////////////////////////////////////////////
while (fscanf(pfin,"%c",¤t_char)!=EOF)
{......
做了一个选择、插入、冒泡与shell这四种排序的比较(2008-04-17 16:53:00)
摘要:#include <iostream>
#include <cstdlib>
#include <ctime>
inline void exch(int &A, int &B){int temp = A; A = B; B = temp;}
inline void compexch(int &A, int &B){if (A > B) exch(A,B);}
void selection_sort(int src[],int lengh);
void insertion_sort(int src[],int lengh);
void insertion_sort_adv(int src[],int lengh);
void bubble (int src[] , int lengh);
void quick_sort(int src[],int l, int lengh);
int partition(int src[],int l, int lengh);
void shell_sort(int src[], int lengh);
using namespace std;
int main()
{
int *src;
int index_i;
clock_t start, finish;
clock_t save[10];
int max;
cout <<"enter\n";
cin >>max;
src = (int *) malloc (max*sizeof(int));
for (index_i = 0; index_i < max ; index_i++)
src[index_i] =max - index_i;
start = clock();
selection_sort( src, max-1);
finish = ......
<数据结构>:137-3(2008-04-07 22:17:00)
摘要:/*
<数据结构>
Page: 137 exercise:3
description:
编写一个函数insert_left,在线索二叉树中,插入一个新节点child,作为节点parent的左儿子.节点parent的左儿子指针变为节点child的左儿子指针
*/
void insert_right(tree_node *parent,tree_node *child)
{
tree_node *temp;
child->left = parent->left;
child->right = parent;
parent->left = child;
child->left_thread = parent->left_thread;
child->right_thread = true;
parent->left_thread = false;
if ( ! child->left_thread)
{
temp = insucc(child);
&n......