我想写一个备忘录程序。这个备忘录是给自己学习用的。我把每天所学的内容(例如‘英语书第三课第一段背诵’)
输入程序中,它自动按照艾宾浩斯记忆曲线给我安排复习日期。这个程序通过建立以年月日命名的txt文件来保存每日所学盒盖复习的内容。在当天他会自动打开与当天同名的txt文件。提取里面的内容并显示出来。程序通过向该复习的日期对应的同名txt文件追加内容来安排复习内容。
关于艾宾浩斯的介绍:艾宾浩斯.赫尔曼(Ebbinghaus.Hermann 185O~1909)德国心理学家。
出生于德国波恩附近,先在波恩大学学习历史与哲学,后进入哈雷大学和柏林大学深造,1873年获哲学博士学位。普法战争时在军队服务。战后,在柏林、英国、法国致力于研究,兴趣转向科学。1867年,艾宾浩斯在巴黎一家书摊上买了一本旧的费希纳的《心理物理学纲要》,这一偶然的事情对他产生了深深的影响,不久也影响了新心理科学。费希纳研究心理现象的数学方法使年轻的艾宾浩斯顿开茅塞,他决心像费希纳研究心理物理学那样,通过严格的系统的测量来研究记忆。在这之前,W.冯特曾宣布过学习和记忆等高级心理过程不能用实验研究,加之当时艾宾浩斯既没有大学教学职位,没有老师,也没有进行研究的专门设备和实验室。但是,即便如此,他还是花了5年时间,用自己做被试,独自进行实验,完成了一系列有控制的研究。
艾宾浩斯的研究方法是客观的、实验的、通过细致观察和记录可以量化的。他的程序是把数据基础置于经过时间考验的联想和学习的研究之上。他推想出,对于学习材料的难度,可以用学习材料时所需要重复的次数来测量它,而计算起来的这个重复的次数也可以作为完全再现的标准。为使实验有条不紊,他甚至调节了自己的个人习惯,尽量使个人习惯保持常态,按照同样严格的日常做法去工作,学习材料时总是恰在每天的同一时间。艾宾浩斯为记忆材料发明了无意义音节。他发觉,用散文或诗词作为记忆材料存在着一定的困难,因为各人的文化背景和知识经验不同,且理解语言的人容易把意义或联想跟词形成联系,这些已形成的联想可以有助材料的学习,这样便不能在意义方面加以控制。为此,艾宾浩斯寻找一些没有形成联想的、完全同类的、对被试来说同样不熟悉的材料,用这些材料做实验就不可能有任何过去的联想。这种材料便是无意义音节。无意义音节是由两个辅音夹一个元音构成,如lef,bok或gat。他把辅音和元音一切可能的组合写在不同的卡片上,使他得到了2300个音节,从中随机地抽出用来学习的那些音节。
艾宾浩斯在记忆心理学领域的研究,主要涉及下述几个方面:
(1)查明识记无意义音节的速度与识记有意义材料的速度之间的差异。为了确定这种差异,他识记拜伦的《唐?璜》一诗中的节段,每一段有8O个音节。他发现大约需要读9次能记住一段。然后他识记8O个无意义音节,发现完成这个任务几乎需要重复8O次。于是他得出结论说,无意义材料的学习比有意义材料的学习在难度上几乎达到9倍。(2)材料的长度和数量对完全再现所必需的重复次数的影响。他发现,较长的材料需要次数较多的重复,也即需要较多的学习时间。而增加了所学音节的数量,使学习每一音节的平均时间显著增加。结论是,我们学习的材料愈多,所用的时间就愈长。(3)学习和回忆之间的时间历程。材料在学习后头几小时遗忘最快,随着时间的推延,材料遗忘越来越少,也即著名的艾宾浩斯遗忘曲线。除了这几个主要方面外,艾宾浩斯还研究过一些能影响学习和保持的其他变量,例如过度学习的影响、重复学习或复习的形响、音节表内的近距联想与远距联想的影响,等等。
1880年,艾宾浩斯受聘于柏林大学,在那里继续研究记忆,并重复和验证了他的早期研究。1885年,他出版《论记忆》一书,这本书是实验心理学史上最为卓越的研究成果之一,它开创了全新的研究领域。心理学史家E.G.波林评论道:“这是划时代的,不仅由于它所涉及的范围和文章风格的新颖,而且因为它立即被看作是实验心理学突破了研究高级心理过程的障碍。艾宾浩斯开创了一个新的领域……”
1885年后,艾宾浩斯没有继续研究记忆,发表的著述也相当少。1886年他被柏林大学提升为副教授。1890年,他创建了一个实验室,创办了《感觉器官的心理学和生理学》杂志。然而,由于艾宾浩斯缺少著述,他在柏林大学再也没有得到提升。 1894年,他应聘于布雷斯劳大学担任较为低级的职务,在那里一直工作到19O5年。期间,他发展了句子填充测验,这也是第一个研究高级心理过程的成功测验,其变式为现今许多普通智力测验所采用。 1902年,艾宾浩斯出版了极为成功的教科书《心理学原理》,1908年出版了更受人欢迎的教科书《心理学概论》。两本书都数次再版,艾宾浩斯去世后又由别人修改了几次。19O5年,艾宾浩斯离开布雷斯劳大学去哈雷大学,4年后突然死于肺炎,享年59岁。
艾宾浩斯虽然没有建立学派,也没有形成正式的理论体系。但是,他在心理学史上的重要地位可由心理学史家D.舒尔茨的一段评论看出:"对一个科学家总的历史价值的一种衡量方法是看他的观点和研究成果是否经受得住时间的考验。根据这样的标准来看,可以认为艾宾浩斯比冯特更加重要。他的研究给联想或学习的研究带来了客观性、数量化和实验方法。正是由于艾宾浩斯的研究,才使联想的概念从只是对它的特性进行思辨改变为借助于科学方法对它进行实验研究。另外,他对学习和记忆的许多发现在百年后的今天仍然可靠。在心理学史上能够得到这种评价的心理学家真是凤毛麟角"。
代码如下:
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define yes 1
#define no 0
#define len sizeof(struct tm)
char ihuanc(int x)
{char b;
switch(x)
{
case 0: b=48;break;
case 1: b=49;break;
case 2: b=50;break;
case 3: b=51;break;
case 4: b=52;break;
case 5: b=53;break;
case 6: b=54;break;
case 7: b=55;break;
case 8: b=56;break;
case 9: b=57;break;
default: printf("error/n");
}
return(b);
}
char back[10]="";
char *izhuanc(int x)
{
int a,b,c;
a=x/100;
b=(x-a*100)/10;
c=x-(a*100+b*10);
if(a!=0)
{
back[0]=ihuanc(a);
back[1]=ihuanc(b);
back[2]=ihuanc(c);
}
else
{
if(b!=0)
{
back[0]=ihuanc(b);
back[1]=ihuanc(c);
}
else
{
back[1]=ihuanc(b);
}
}
return(back);
}
/*以下为c 计算日期差的函数*/
typedef struct date
{
int year;
int month;
int day;
}DATE;
/*判断闰年*/
int leap(int year)
{
if(year%400==0 ||(year%4==0&&year%100!=0))
return yes;
else
return no;
}
/*两个日期相减*/
int timedef(DATE d1,DATE d2)/*date1应该比date2要小*/
{
int i;
int day=0,dayt1=0,dayt2=0;
int d[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
for(i=d1.year;i<d2.year;i++)/*从这看出date1的时间落后于 data2*/
{
if(leap(i)==no) day+=365;/*判断d1的年份是否闰年*/
else day+=366;
}
for(i=1;i<d1.month;i++)dayt1+=d[leap(d1.year)][i];/*dayt1的值为date1的月份总天数*/
dayt1+=d1.day;
for(i=1;i<d2.month;i++)dayt2+=d[leap(d2.year)][i];/*dayt2的值为date2的月份总天数*/
dayt2+=d2.day;
return day+dayt2-dayt1;
}
/*这才是时间差的函数date1要比date2前*/
int timecha(int date1year,int date1month,int date1day,int date2year,int date2month,int date2day)
{
DATE date1,date2;
date1.year=date1year;
date1.month=date1month;
date1.day=date1day;
date2.year=date2year;
date2.month=date2month;
date2.day=date2day;
return(timedef(date1,date2));
}
void main()
{
flag1:int a,i,c;
int b[7]={2,4,7,14,28,60,120};
char *a1=NULL,*xianshi=NULL;
int cha,chang;
char cun[2],shuru[50];
FILE *fp1=NULL,*fp2=NULL,*fp3=NULL,*fp4=NULL;
time_t timer;
struct tm *p1=NULL;
struct tm *p2=NULL;
/* gets time of day */
timer = time(NULL);
/* converts date/time to a structure */
p1= localtime(&timer);
/*打开首页,求出第一次写入到当前时间的日期差*/
fp1=fopen("shouye.txt","a+");
if(fp1==NULL){printf("不能打开文件/n");exit(0);};
fscanf(fp1,"%d%d%d%d%d%d%d%d%d",(*p2).tm_sec,(*p2).tm_min,(*p2).tm_hour,(*p2).tm_mday,(*p2).tm_mon,(*p2).tm_year,(*p2).tm_wday,(*p2).tm_yday,(*p2).tm_isdst);
cha=timecha((*p2).tm_year,(*p2).tm_mon,(*p2).tm_mday,(*p1).tm_year,(*p1).tm_mon,(*p1).tm_mday);
fclose(fp1);
/*显示当天应该记忆的内容*/
a1=izhuanc(cha);
fp2=fopen(strcat(a1,".txt"),"a+");
if(fp2==NULL){printf("不能打开文件/n");exit(0);};
/*求全文件的长度,然后整个文件一块输出*/
fseek(fp2,0L,SEEK_END);
chang=ftell(fp2);
rewind(fp2);
fread(xianshi,chang,1,fp2);
if(xianshi==NULL)printf("今天放假/n");
/*如果文件为空会怎样?cun取何值?*/
/*fread() bug 的地方!!*/
printf("%s",xianshi);
fclose(fp2);
printf("1.输入今日所学的内容/n0.退出本程序/n");
scanf("%d",&a);
/*.输入今日所学的内容*/
if(a=1)
{
c=cha;
fp3=fopen(strcat(a1,".txt"),"a+");
if(fp3==NULL){printf("不能打开文件/n");exit(0);};
gets(shuru);
fwrite(shuru,50*sizeof(char),1,fp3);
/*get同fwrite bug 的地方*/
for(i=0;i<=6;i++)
{
cha=c+b[i];
a1=izhuanc(cha);
fp4=fopen(strcat(a1,".txt"),"a+");
if(fp4==NULL){printf("不能打开文件/n");exit(0);};
fwrite(shuru,50*sizeof(char),1,fp4);
/*bug 的地方三*/
fclose(fp4);
}
free(shuru);
fclose(fp3);
}
else if(a=0)exit(0);
else printf("error/n");
goto flag1;
}
已通过vc++6.0的调试与编译 但在运行的时候系统报错:0x004xxxxx指令引用的0x00000020内存 该内存不能为read
百思不得其解 郁闷!
后来我用printf("2.11.输入今日所学的内容/n0.退出本程序/n");来做标志
逐行调试程序,发现程序试运行到以下程序段时出现的问题:
time_t timer;
struct tm *p1=NULL;
struct tm *p2=NULL;
/* gets time of day */
timer = time(NULL);
/* converts date/time to a structure */
p1= localtime(&timer);
/*打开首页,求出第一次写入到当前时间的日期差*/
fp1=fopen("shouye.txt","a+");
printf("2.11.输入今日所学的内容/n0.退出本程序/n");
if(fp1==NULL){printf("不能打开文件/n");exit(0);};
printf("2.21.输入今日所学的内容/n0.退出本程序/n");
fscanf(fp1,"%d%d%d%d%d%d%d%d%d",(*p2).tm_sec,(*p2).tm_min,(*p2).tm_hour,(*p2).tm_mday,(*p2).tm_mon,(*p2).tm_year,(*p2).tm_wday,(*p2).tm_yday,(*p2).tm_isdst);
printf("2.31.输入今日所学的内容/n0.退出本程序/n");
cha=timecha((*p2).tm_year,(*p2).tm_mon,(*p2).tm_mday,(*p1).tm_year,(*p1).tm_mon,(*p1).tm_mday);
printf("2.41.输入今日所学的内容/n0.退出本程序/n");
fclose(fp1);
程序运行时只显示到printf("2.21.输入今日所学的内容/n0.退出本程序/n");
故判定是fscanf()函数出了问题。
但是怎样解决呢?