1.简单计算器(不支持括号) // 本计算器只适合,加减乘除的混合运算,包括浮点数的运算,不支持带括号的运算式 # include <stdio.h> # define N 5 // 声明计算函数 double calc ( double * , char * , int ) ; int main ( ) { double a[ N] ; char s1[ N] ; // 计算结果 double result; int i= 0 , temp= 0 ; while ( i< N) { // 输入计算数字 scanf ( "%lf" , a+ i) ; // 输入计算符号 scanf ( "%c" , s1+ i) ; temp++ ; // 输入等于号 结束 if ( s1[ i] == '=' ) break ; i++ ; } printf ( "\n\n" ) ; printf ( "要计算的表达式为:" ) ; for ( i= 0 ; i< temp; i++ ) { if ( a[ i] == ( int ) ( a[ i] ) ) { printf ( "%d" , ( int ) a[ i] ) ; } else { printf ( "%f" , a[ i] ) ; } printf ( "%c" , s1[ i] ) ; } // 计算表达式 函数 result= calc ( a, s1, temp) ; if ( result== ( int ) ( result) ) { printf ( "%d\n" , ( int ) result) ; } else { printf ( "%f\n" , result) ; } return 0 ; } double calc ( double * a, char * s, int t) { //a -> 3 9 1 //s -> * - // t = 2 int i; double re= 0 ; for ( i= 0 ; i< t- 1 ; i++ ) { if ( ( s[ i] == '*' || s[ i] == '/' ) ) { switch ( s[ i] ) { case '*' : a[ i+ 1 ] = a[ i] * a[ i+ 1 ] ; a[ i] = 0 ; break ; case '/' : a[ i+ 1 ] = a[ i] / a[ i+ 1 ] ; a[ i] = 0 ; break ; } } } re= a[ 0 ] ; for ( i= 0 ; i< t- 1 ; i++ ) { switch ( s[ i] ) { case '*' : case '/' : case '+' : re+= a[ i+ 1 ] ; break ; case '-' : if ( a[ i+ 1 ] != 0 ) { re-= a[ i+ 1 ] ; break ; } else { s[ i+ 1 ] = '-' ; } } } return re; } 2. 动态链表(学生管理系统) # include <stdio.h> # include <stdlib.h> // #include<malloc.h> # define NULL 0 //NULL表示"空地址",即不指向任何类型的数据 # define LEN sizeof ( struct student ) // 用"LEN"表示要动态开辟存储空间的的大小,sizeof(struct student)求出结构体的长度 struct student // 定义结构体 { long num; float score; struct student * next; //定义了指向本身的指针成员 } ; int n; //定义全局变量n,用来存放动态链表节点的个数 struct student * creat ( void ) //定义动态链表函数 { struct student * head; //定义头指针 struct student * p1, * p2; //指针p1,p2用在节点的产生 n= 0 ; p1= p2= ( struct student * ) malloc ( LEN) ; //初始化p1,p2,(struct student *)malloc(LEN)表示将malloc 函数的返回值 强行转化为指向 struct // student 类型的指针,因为 malloc 函数本身返回值为 void 类型的指针,所以这里要进行转化 scanf ( "%ld,%f" , & p1-> num, & p1-> score) ; //输入 结构体成员 num score head= NULL ; //初始化 头指针 while ( p1-> num!= 0 ) //用0表示输入结束,所以这里当num不等于零时,继续输入 { n+= 1 ; //n在这里记录节点的个数 if ( n== 1 ) { head= p1; //如果n==1,表示第一个节点,应使得 head==p1 } else { p2-> next= p1; //这里不再是第一个节点,因此让p2的next成员指向下一个节点的首地址 } p2= p1; //在将p1的值给p2,使得p1和p2指向同一个节点 p1= ( struct student * ) malloc ( LEN) ; //开辟下一个节点,使得p1指向它 scanf ( "%ld,%f" , & p1-> num, & p1-> score) ; //输入下一个节点的数据 } p2-> next= NULL ; //当成员num==0时,表示输入结束因此将p2 的next成员为空,即当链表收尾 return head; //返回链表的头指针 } /*链表的输出*/ void print ( struct student * head) // 定义链表输出函数 { struct student * p; //定义指向该结构的指针 printf ( "\nNow,These %d record are:\n" , n) ; p= head; //将头指针赋给该指针 if ( head!= NULL ) //如果链表不为空则访问整个链表 { do { printf ( "%ld %5.1f\n" , p-> num, p-> score) ; p= p-> next; } while ( p!= NULL ) ; } } /*链表的删除操作*/ struct student * del ( struct student * head, long num) { struct student * p1, * p2; //定义两个指向结构体的指针 if ( head== NULL ) //判断是否为空链表 { printf ( "\nlist null!\n" ) ; goto end; //如果为空则结束 } p1= head; //令p1指向第一个节点 while ( num!= p1-> num&& p1-> next!= NULL ) // 查找链表的每一个元素 { p2= p1; p1= p1-> next; } if ( num== p1-> num) //找到了要删除的元素 { if ( p1== head) //判断该元素是否为第一个节点元素 { head= p1-> next; } else { p2-> next= p1-> next; } printf ( "delete:%ld\n" , num) ; n= n- 1 ; //节点数目减一 } else { printf ( "%ld not been found! \n" , num) ; } end: return head; } /*链表的插入操作*/ struct student * insert ( struct student * head, struct student * stud) { struct student * p0, * p1, * p2; //定义三个结构体指针变量,p0指向要插入的节点 p1= head; p0= stud; //p0指向要插入的节点 if ( head== NULL ) //判断链表是否为空,若是空链表,则将该元素直接插入 { head= p0; p0-> next= NULL ; } else { while ( ( p0-> num> p1-> num) && ( p1-> next!= NULL ) ) //查找该元素要插入的位置 { p2= p1; p1= p1-> next; } if ( p0-> num<= p1-> num) //找到该元素要插入的位置 { if ( head== p1) //判断该元素的插入位置是否在第一个元素之前 { head= p0; } else //该元素的位置不是在第一个元素之前 { p2-> next= p0; } p0-> next= p1; } else //该元素的位置在最后一个元素位置之后 { p1-> next= p0; p0-> next= NULL ; } } n+= 1 ; return head; } # if ( 0 ) /**************************************************************************************/ void main ( ) { struct student * head, stu; long del_num; printf ( "input records:\n" ) ; head= creat ( ) ; //建立链表,返回头指针 print ( head) ; //打印全部节点 printf ( "\ninput the deleted number:" ) ; scanf ( "%ld" , & del_num) ; //输入要删除的学号 head= del ( head, del_num) ; //调用删除函数删该节点 print ( head) ; //打印删除后的链表 printf ( "\ninput the inserted record:" ) ; scanf ( "%ld,%f" , & stu. num, & stu. score) ; //输入要插入的节点 head= insert ( head, & stu) ; //调用插入函数,将节点插入 print ( head) ; } /***************************************************************************************/ /*该程序只插入了一个节点,若要插入多个节点,如果将程序的最后四行重写一遍,再次输入则会出错*/ //因为 上述程序主函数定义要插入的节点的地址是固定的,所以要想插入多个节点,则每个节点必须用 //malloc 函数从新开辟一个动态存储空间 /***************************************************************************************/ # else /***************************************************************************************/ int main ( ) { struct student * head, * stu; long del_num; printf ( "input records:\n" ) ; head= creat ( ) ; //建立链表 print ( head) ; printf ( "input delete number: " ) ; scanf ( "%ld" , & del_num) ; //输入要删除的元素 while ( del_num!= 0 ) { head= del ( head, del_num) ; //调用删除函数 print ( head) ; printf ( "input delete number: " ) ; scanf ( "%ld" , & del_num) ; } printf ( "\ninput the insert number: " ) ; stu= ( struct student * ) malloc ( LEN) ; //利用 malloc函数开辟动态存储空间 scanf ( "%ld,%f" , & stu-> num, & stu-> score) ; //输入要插入的元素 while ( stu-> num!= 0 ) { head= insert ( head, stu) ; //调用插入函数 print ( head) ; printf ( "input the insert record: " ) ; stu= ( struct student * ) malloc ( LEN) ; //将 malloc函数的返回值转化为 指向结构体类型的指针 scanf ( "%ld,%f" , & stu-> num, & stu-> score) ; } return 0 ; } # endif /**************************************************************************************************/ 3.静态链表 # include <stdio.h> # define NULL_ 0 struct student { long num; float score; struct student * next; } ; int main ( ) { struct student a, b, c, * head, * p; a. num= 10101 ; a. score= 89.5 ; b. num= 10103 ; b. score= 90 ; c. num= 10107 ; c. score= 85 ; head= & a; a. next= & b; b. next= & c; c. next= NULL ; p= head; do { printf ( "%ld %5.1f\n" , ( * p) . num, p-> score) ; p= ( * p) . next; } while ( p!= NULL_) ; return 0 ; } 4.从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个"#"为止 //从键盘输入一些字符,逐个把它们送到磁盘上去,直到输入一个"#"为止 # include <stdio.h> # include <stdlib.h> int main ( ) { FILE* fp; char ch, filename[ 10 ] ; scanf ( "%s" , filename) ; if ( ( fp= fopen ( filename, "w" ) ) == NULL ) { printf ( "can not open file \n" ) ; exit ( 0 ) ; } ch= getchar ( ) ; ch= getchar ( ) ; while ( ch!= '#' ) { fputc ( ch, fp) ; putchar ( ch) ; ch= getchar ( ) ; } putchar ( 10 ) ; fclose ( fp) ; return 0 ; } 5.文件复制 //将一个磁盘文件中的信息复制到另一个磁盘文件中 # include <stdio.h> # include <stdlib.h> int main ( ) { FILE* in, * out; char ch, infile[ 10 ] , outfile[ 10 ] ; printf ( "Enter the infile name:\n" ) ; scanf ( "%s" , infile) ; printf ( "Enter the outfile name:\n" ) ; scanf ( "%s" , outfile) ; if ( ( in= fopen ( infile, "r" ) ) == NULL ) { printf ( "can not open infile \n" ) ; exit ( 0 ) ; } if ( ( out= fopen ( outfile, "w" ) ) == NULL ) { printf ( "can not open outfile \n" ) ; exit ( 0 ) ; } while ( ( ch= fgetc ( in) ) != EOF ) { fputc ( ch, out) ; } fclose ( in) ; fclose ( out) ; return 0 ; }