#include<stdioh>
#include<malloch>
#include<stringh>
#include<stdlibh>
#include<ctypeh>
#define NULL 0
#define MAX 100
typedef struct lnode{
char date[MAX]; //存放数据
struct lnode prior ; //前驱
struct lnode next ; //后继
int number ; //记录一个节点的字符数!如果是头节点就记录他的节点个数
int quese ; //记录节点在链表中的位置
}lnodetype;
lnodetype l ; //设置两个全局变量,分别是头节点指针和尾节点指针
lnodetype end ;
//这个函数是用来初始化的//
int iniatelist (lnodetype l , lnodetype end)
{
(l) = (lnodetype )malloc (sizeof (lnodetype) ) ;
if ( (l) == NULL )
{
printf ("没有只够的内存空间!程序即将退出!");
return 0 ;
}
(l)->prior =(l)->next = NULL ; //这是双链表
(l)->number = (l)->quese = 0;
(end) = (l) ;
printf ("程序初始化完毕!");
return 0;
}
//这个函数是用来建立节点,并且插入元素的//
int link(lnodetype l, lnodetype end)
{
lnodetype s ;
s = (lnodetype )malloc ( sizeof (lnodetype) ) ;
if ( s == NULL ){
printf ("内存空间不够,程序即将退出!") ;
return 0 ;
}
(end)->next = s ;
s->prior = (end) ;
(end) = (end)->next ;
(l)->number++ ; //增加一个节点,头节点的number就加1
s->quese = (l)->number ; //这个是记录节点在链表中的位置
printf ("%d行", s->quese ) ; //这个是节点在整个链表中的位置
gets(s->date) ;
s -> number = strlen(s->date) ;
return 0 ;
}
//这个是打印链表的函数//
int prin (lnodetype l, lnodetype end)
{
lnodetype p ;
int i ;
int j = 0;
int couter = (l)->number ;
p = (l)->next ;
for (i=0; i < couter; i++){
printf ( "%d行" , i+1 ) ;
j = 0;
while ( ( p->date[j]>='a' && p->date[j]<='z') ||
(p->date[j]>='A' && p->date[j]<='z') ||
p->date[j]>='0' && p->date[j]<='9')
{
printf ( "%c" , p->date[j] ) ;
j++ ;
}
printf ("n") ;
p = p->next ;
}
return 0 ;
}
//这个查找和编辑相应行的函数//
int search (lnodetype l, lnodetype end )
{
int number ;
scanf ("%d" , &number) ;
int i ;
lnodetype p ;
p = (l)->next ;
for ( i=0; i<number-1; i++ )
p = p->next ;
printf ("%d行" , number ) ;
gets (p->date) ;
return 0 ;
}
//这个是在文本文件里搜索字符串的函数//
int searchstr(lnodetype l , lnodetype end)
{
char ptr[100] ;
int arrycouter ;
int mystrcmp( char , char , int ) ;
printf ( "ok!现在输入你查找的字符串!" ) ;
scanf ( "%s" , ptr ) ;
arrycouter = strlen (ptr) ;
lnodetype s ;
s = (l)->next ;
char p ;
int i = 1 ;
int couter = 0 ;
int number = (l)->number ;
p = (char )s->date ;
while ( i && number ){
// i=1是,证明没有找到,向第二个节点继续寻找
while ( i && ( ( (p >= 'a') && (p <= 'z') ) || ( (p >= 'A') && (p <= 'Z') ) ) ){
i = mystrcmp ( p , ptr , arrycouter );
if ( i == 1 ){
printf ("字符串已经在第%d行,第%d个字符开始,",s->quese, couter+1 );
i = 0 ;
}
else
{
p++ ;
couter++;
i = 1 ;
}
}
s = s->next ;
p = (char )s->date ;
number -- ;
}
if ( i == 1 )
printf ("字符串在本文档中不存在!");
return 0 ;
}
//(1)这个函数是用来实现退出不保存功能的//
int exitunsave(lnodetype l, lnodetype end)
{
lnodetype s ;
while( (l) != (end) ){ //如果不保存的话,最好是把节点的空间都释放,节省空间
s = (end) ;
(end) = (end)->prior ;
free( s ) ;
}
return 0 ;
}
//(2)这个函数是用来实现退出但保存功能的//
int quitandsave( lnodetype l , lnodetype end )
{
FILE fp ;
char ch ;
char filename[20] ;
lnodetype p;
int i ;
int j ;
int couter = (l)->number ;
p = (l)->next ;
printf ("请输入文件名:") ;
scanf ("%s" , filename ) ;
if ( (fp = fopen( filename , "w" )) == NULL ){
printf ("文件不能打开!n");
return 0 ;
}
for ( i=0; i<couter; i++ ){ //有几个节点就进行多少次的存贮
ch = p->date[0] ;
j = 1 ;
while (ch != '\0'){
fputc (ch , fp) ;
ch = p->date[j] ;
j++ ;
}
p = p->next ;
fputc ( '#' , fp ) ; //注意在每个节点的后面加上结束的符号
}
fputc ( '@' , fp ) ; //整个文件关闭的标志
fclose ( fp ) ; //注意关闭文件,
return 0 ;
}
//由于库函数比较字符串提供的功能不满足要求,故自己写了一个/
int mystrcmp( char p ,char sour ,int number )
{
while ( number && (p) == (sour) &&
( ( (p >= 'a') && (p <= 'z') ) || ( (p >= 'A') && (p <= 'Z') ) )){
p++ ;
sour++ ;
number-- ;
}
if ( number == 0 )
return 1 ;
else
return 0 ;
}
//这个函数是用来实现统计字符串功能的//
int coutword(lnodetype l , lnodetype end)
{ //考虑到只统计一行的单词没有意义,故统计整个文本
int yes = 1 ; //这个是进入单词的标志
int no = 0 ; //在单词外面的时候的标志
int i , j ,inaword ,count = 0 ;
inaword = no ;
lnodetype s = (l)->next ;
for (j=0; j<(l)->number; j++){
for ( i=0; (s->date[i]>='a' && s->date[i]<='z') ||
(s->date[i]>='A' && s->date[i]<='z') ||
(s->date[i]>='0' && s->date[i]<='9' ) ||
(s->date[i]==' '); i++ )
{
if ( s->date[i] == ' ' )
inaword = no ;
else
if ( inaword == no )
{
inaword = yes ;
count++ ; //计算单词
}
}
s = s->next ;
inaword = 0 ; //注意这里,把标志置为0了!
}
printf ( "n文本一共有 %d 行" , (l)->number ) ;
printf ("n此文本一共有 %d 个单词!" , count ) ;
return count ;
}
//这个函数是用来实现计算文本行数功能的//
int linecouter(lnodetype l , lnodetype end )
{
int couter ;
couter = (l)->number ;
return couter ;
}
//这个函数是整和一上所有功能的菜单函数//
int editmenu(lnodetype l , lnodetype end )
{
char choice ;
char p = "cls" ;
int i = 1 ; //这两个变量是用来控制循环的
int j= 1 ;
system (p) ;
prin (&(l) , &(end)) ;
while (j){
printf (" e: 编辑相应行 n") ;
printf (" s: 搜索字符串 n") ;
printf (" t: 统计单词个数 n") ;
printf (" q: 退出编辑 n") ;
scanf("%c",&choice);
scanf("%c" , &choice) ; //????莫名其妙的问题,非要两个请求输入语句才肯停下来!
switch (choice)
{
case 'e' : {
i = 1 ;
while (i)
{
search( &(l) , &(end) );
system (p) ;
prin( &(l) , &(end) ) ;
printf ("n1 继续编辑 0 结束编辑n") ;
scanf ("%d" , &i) ;
}
}
break;
case 's' : {
i = 1 ;
while (i)
{
searchstr( &(l) , &(end) );
getchar();
getchar();
system (p) ;
prin( &(l) , &(end) ) ;
printf ("n1 继续搜索 0 结束搜索n") ;
scanf ("%d" , &i) ;
}
}
break;
case 't' : {
coutword ( &(l) , &(end) ) ;
getchar() ;
}break;
default : return 0 ;
}
system (p) ;
prin( &(l) , &(end) ) ;
printf ("n1 回到编辑菜单 0 结束编辑n") ;
scanf ("%d" , &j) ;
if (j == 1)
system (p) ;
else
return 0 ;
}
return 0 ;
}
//实现第一个模块:新建空白文档//
int newtext( lnodetype l ,lnodetype end )
{
printf ( "新文本文件:n" ) ;
int i = 1 ;
char judstr[MAX] ;
lnodetype temp ;
char jud ;
char p = "cls" ;
while ( 1 ){
link( &(l) , &(end) ) ;
jud = (end)->date[0] ;
if ( jud == '5' ){ //输入‘5’结束一切
temp = (end) ;
(end) = (end)->prior ;
free (temp) ;
while (1){
printf ( " out :退出不保存 n") ;
printf ( " edit :编辑信息 n") ;
printf ( " quit :退出而不存盘 n") ;
printf ( " qas :退出且存盘 n") ;
printf ( " con :继续输入! n") ;
gets(judstr) ;
if ( !strcmp(judstr , "out") )
{
exitunsave( &(l) , &(end) ) ;
return 0 ;
}
else
if ( !strcmp(judstr , "qas") )
{
quitandsave( &(l) , &(end) ) ;
return 0 ;
}
else
if ( !strcmp(judstr , "edit") )
{
editmenu (l , end) ;
return 0;
}
system (p) ;
}
return 0 ;
}
}
return 0 ;
}
//这个是装入文件的函数//
int loadtaxt( char filename )
{
FILE fp ;
lnodetype l ;
char ch ;
int i = 0 ;
char p = "cls" ;
char judstr[MAX] ;
lnodetype head ;
lnodetype end ;
iniatelist ( &head , &end) ;
l = end = head ;
if ( (fp = fopen( filename, "r+")) == NULL ){
printf ("文件不能打开!n") ;
return 0 ;
}
ch = fgetc ( fp ) ;
while ( ch != '@' ){
lnodetype s ;
s = (lnodetype )malloc ( sizeof (lnodetype) ) ;
if ( s == NULL ){
printf ("内存空间不够,程序即将退出!") ;
return 0 ;
}
end->next = s ;
s->prior = end ;
end = end->next ;
l->number++ ;
s->quese = l->number ;
printf ("%d行", s->quese ) ;
while ( ch != '#'){
s->date[i] = ch ;
ch = fgetc (fp) ;
i++ ;
}
i = 0;
while ( (end->date[i]>='a' && end->date[i]<='z') ||
(end->date[i]>='A' && end->date[i]<='z') ||
(end->date[i]>='0' && end->date[i]<='9' ) ||
(end->date[i]==' ') )
{
printf ( "%c" , end->date[i] ) ;
i++ ;
}
end->date[i] = '\0' ; //注意在节点的最好加上这个,以让退出保存功能函数知道此节点已结束
printf ( "n" ) ;
i = 0;
ch = fgetc ( fp ) ;
}
fclose (fp) ;
printf ("n文件成功装入!n") ;
while (1){
printf ( " out :退出不保存 n") ;
printf ( " edit :编辑信息 n") ;
printf ( " qas :退出且存盘 n") ;
printf ( " con :继续输入! n") ;
scanf("%s",judstr);
if ( !strcmp(judstr , "out") )
{
exitunsave( &l , &end ) ;
return 0 ;
}
else
if ( !strcmp(judstr , "qas") )
{
quitandsave( &l , &end ) ;
return 0 ;
}
else
if ( !strcmp(judstr , "edit") )
{
editmenu (&l , &end) ;
return 0 ;
}
system (p) ;
}
return 0 ;
}
//主函数//
void main ( void )
{
//iniatelist (&l , &end) ;
//newtext(&l , &end) ;
char filename[MAX] ;
scanf ( "%s" , filename ) ;
loadtaxt( filename ) ;
}
很不容易做的程序!!!
通过编译
利用C语言编写一个求两数相加的和的编程思想和方法如下:
1首先需要定义三个变量a,b,c,两个为相加的数,第三个为相加后得到的和。
2然后使用scanf()语句接收从键盘输入的两个数,为变量a,b赋值。
3接着进行a和b的加法运算,将结果赋值给变量c。
4最后使用printf()语句将计算结果显示在屏幕上。
5代码编写完毕后,点击运行后即可在调试窗口看到程序的运行结果。
C语言源代码,就是依据C语言规则所写出的程序代码,常见的存储文件扩展名为c文件和h文件,分别对应C源文件(source file)和C头文件(header file)。
C语言是一门编程语言,简单点说,就是由人类书写按照一定规范书写的字符,通过一定手段(编译链接)转换后,可以让电脑或者其它电子芯片"读懂",并按照其要求工作的语言。
在所有的编程语言中,C语言是相对古老而原始的,同时也是在同类语言中更接近硬件,最为高效的编程语言。
扩展资料:
C语言广泛应用于底层开发。它的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。
它能提供了许多低级处理的功能,可以保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
其编译器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
参考资料:
源代码需经过编译和链接,才可生成可执行文件。
由汇编程序生成的目标文件并不能立即就被执行,其中可能还有许多没有解决的问题。 例如,某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用等);在程序中可能调用了某个库文件中的函数,等等。所有的这些问题,都需要经链接程序的处理方能得以解决。
链接程序的主要工作就是将有关的目标文件彼此相连接,也即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够诶 *** 作系统装入执行的统一整体。
根据开发人员指定的同库函数的链接方式的不同,链接处理可分为两种:
(1)静态链接
在这种链接方式下,函数的代码将从其所在地静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。
(2) 动态链接
在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。
对于可执行文件中的函数调用,可分别采用动态链接或静态链接的方法。使用动态链接能够使最终的可执行文件比较短小,并且当共享对象被多个进程使用时能节约一些内存,因为在内存中只需要保存一份此共享对象的代码。但并不是使用动态链接就一定比使用静态链接要优越。在某些情况下动态链接可能带来一些性能上损害。
以上就是关于C语言编写的记事本源代码全部的内容,包括:C语言编写的记事本源代码、用c语言怎样编一个程序、C语言的源代码是什么意思啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)