【3.46】输入N个整数,储存输入的数及对应的序号,并将输入的数按从小到大的顺序进行排列。要求:当两个整数相等时,整数的排列顺序由输入的先后次序决定。例如:输入的第3个整数为5,第7个整数也为5,则将先输入的整数5排在后输入的整数5的前面。程序如下:
#include "stdio.h"
#define N 10
struct
{ int no;
int num;
} array[N];
main( )
{ int i,j,num;
for( i=0;i { printf("enter No. %d:",i); scanf("%d",&num); for( ① ;j>=0&&array[j].num ② num; ③ ) array[j+1]=array[j]; array[ ④ ].num=num; array[ ⑤ ].no=i; } for( i=0;i printf("%d=%d,%d\n",i,array[i].num,array[i].no); } 【3.47】以下程序的功能是:读入一行字符(如:a、...y、z),按输入时的逆序建立一个链接式的结点序列,即先输入的位于链表尾(如下图),然后再按输入的相反顺序输出,并释放全部结点。 #include main( ) { struct node { char info; struct node *link; } *top,*p; char c; top=NULL; while((c= getchar( )) ① ) { p=(struct node *)malloc(sizeof(struct node)); p->info=c; p->link=top; top=p; } while( top ) { ② ; top=top->link; putchar(p->info); free(p); } } 【3.48】下面函数将指针p2所指向的线性链表,串接到p1所指向的链表的末端。假定p1所指向的链表非空。 #define NULL 0 struct link { float a; struct link *next; }; concatenate ( p1,p2 ) struct list *p1,*p2; { if( p1->next==NULL ) p1->next=p2; else concatenate( ① ,p2); } 【3.49】下面程序的功能是从键盘输入一个字符串,然后反序输出输入的字符串。 #include struct node { char data; struct node *link; }*head; main() { char ch; struct node *p; head = NULL; while(( ch=getchar())!='\n' ) { p = (struct node *)malloc(sizeof(struct node)); p->data = ch; p->link = ① ; head = ② ; } ③ ; while( p!=NULL ) { printf("%c ", p->data); p = p->link; } } 【3.50】下面程序的功能是从键盘上顺序输入整数,直到输入的整数小于0时才停止输入。然后反序输出这些整数。 #include struct data { int x; struct data *link; }*p; input() { int num; struct data *q; printf("Enter data:"); scanf("%d", &num); if( num<0 ) ① ; q = ② ; q->x = num; q->link = p; p=q; ③ ; } main() { printf("Enter data until data<0:\n"); p=NULL; input(); printf("Output:"); while( ④ ) { printf("%d\n", p->x); ⑤ ; } } 【3.51】下面函数的功能是创建一个带有头结点的链表,将头结点返回给主调函数。链表用于储存学生的学号和成绩。新产生的结点总是位于链表的尾部。 struct student { long num; int score; struct student *next; }; struct student *creat() { struct student *head=NULL,*tail; long num; int a; tail= ① malloc(LEN); do { scanf("%ld,%d",&num,&a); if(num!=0) { if(head==NULL) head=tail; else ② ; tail->num=num; tail->score=a; tail->next=(struct student *)malloc(LEN); } else tail->next=NULL; }while(num!=0); return( ③ ); } 【3.52】下面create函数的功能是建立一个带头结点的单向链表,新产生的结点总是插入在链表的末尾。单向链表的头指针作为函数值返回。 #include #define LEN sizeof(struct student) struct student { long num; int score; struct student *next; }; struct student *creat() { struct student *head=NULL,*tail; long num; int a; tail=( ① )malloc(LEN); do { scanf("%ld,%d",&num,&a); if(num!=0) { if(head==NULL) head=tail; else tail=tail->next; tail->num=num; tail->score=a; tail->next=( ② )malloc(LEN); } else tail->next=NULL; }while(num!=0); ③ ; } 【3.53】下面程序的功能是统计文件中的字符的个数。 #include main() { long num=0; ① *fp; if((fp=fopen("fname.dat", "r"))==NULL) { printf("Can't open the file! "); exit(0); } while( ② ) { fgetc(fp); num++; } printf("num=%d\n",num); fclose(fp); } 【3.54】下面程序的功能是把从键盘输入的文件(用 @ 作为文件结束标志)复制到一个名为second.txt的新文件中。 #include FILE *fp; main() { char ch; if((fp=fopen( ① ))==NULL) exit(0); while((ch=getchar())!='@') fputc(ch,fp); ② ; } 【3.55】下面程序的功能是将磁盘上的一个文件复制到另一个文件中,两个文件名在命令行中给出(假定给定的文件名无误)。 #include main(int argc,char *argv[]) { FILE &f1,*f2; if(argc< ① ) { printf("The command line error! "); exit(0); } f1=fopen(argv[1], "r"); f2=fopen(arhv[2], "w"); while( ② ) fputs(fgetc(f1), ③ ); ④ ; ⑤ ; } 【3.56】下面程序的功能是根据命令行参数分别实现一个正整数的累加或阶乘。例如:如果可执行文件的文件名是sm,则执行该程序时输入:"sm + 10",可以实现10的累加;输入:"sm - 10",可以实现求10的阶乘。 #include #include main (int argc,char *argv[]) { int n; void sum(),mult(); void (*funcp)(); n=atoi(argv[2]); if(argc!=3 || n<=0) dispform( ); switch ( ① ) { case '+': funcp=sum; break; case '-': funcp=mult; break; default: dispform( ); } ② ; } void sum(int m) { int i,s=0; for(i=1;i ③ ; printf("sum=%d\n",s); } void mult(int m) { long int i, s=1; for(i=1;i<=m;i++ ) s *= i; printf("mult= %ld\n";s); } dispform( ) { printf ("usage:sm n(+/!) (n>0)\n"); exit (0); } 【3.57】下面程序的功能是键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。 #include main() { char str[100]; int i=0; FILE *fp; if((fp=fopen("test.txt", ① ))==NULL) { printf("Can't open the file.\n"); exit(0); } printf("Input a string:\n"); gets(str); while(str[i]) { if(str[i]>= 'a'&&str[i]<= 'z') str[i]= ② ; fputc(str[i],fp); i++; } fclose(fp); fp=fopen("test.txt", ③ ); fgets(str,strlen(str)+1,fp); printf("%s\n",str); fclose(fp); } 【3.58】下面程序的功能是将从终端上读入的10个整数以二进制方式写入名为"bi.dat"的新文件中。 #include FILE *fp; main() { int i, j; if(( fp=fopen( ① , "wb" )) == NULL ) exit (0); for( i=0;i<10;i++ ) { scanf("%d", &j ); fwrite( ② , sizeof(int), 1, ③ ); } fclose( fp); } 【3.59】以字符流形式读入一个文件,从文件中检索出六种C语言的关键字,并统计、 输出每种关键字在文件中出现的次数。本程序中规定:单词是一个以空格或'\t'、 '\n'结束的字符串。 #include #include FILE *cp; char fname[20], buf[100]; int num; struct key { char word[10]; int count; }keyword[]={ "if", 0, "char", 0, "int", 0, "else", 0, "while", 0, "return", 0}; char *getword (FILE *fp) { int i=0; char c; while((c=getc(fp)) != EOF && (c==' '||c=='\t'||c=='\n')) ; if( c==EOF ) return (NULL) ; else buf[i++]=c; while((c = ① && c!= ' ' && c!= '\t' && c!= '\n' ) buf[i++] = c; buf[i]= '\0'; return(buf); } lookup(char *p) { int i; char *q, *s; for(i=0;i { q = ② ; s=p; while( *s && (*s==*q) ) { ③ } if( ④ ) { keyword[i].count++; break; } } return; } main() { int i; char *word; printf("Input file name:"); scanf("%s", fname); if((cp=fopen(fname, "r")) ==NULL ) { printf("File open error: %s\n", fname); exit(0); } num = sizeof(keyword) / sizeof(struct key); while( ⑤ ) lookup(word); fclose(cp); for(i=0;i printf("keyword:%-20scount=%d\n",keyword[i].word,keyword[i].count); } 【3.60】下面程序的功能是从键盘接受姓名(例如:输入"ZHANG SAN"),在文件"try.dat"中查找,若文件中已经存入了刚输入的姓名,则显示提示信息;若文件中没有刚输入的姓名,则将该姓名存入文件。要求:⑴若磁盘文件"try.dat",已存在,则要保留文件中原来的信息;若文件"try.dat"不存在,则在磁盘上建立一个新文件;⑵当输入的姓名为空时(长度为0),结束程序。 #include main() { FILE *fp; int flag; char name[30], data[30]; if((fp=fopen("try.dat", ① ))==NULL ) { printf("Open file error\n"); exit(0); } do { printf("Enter name:"); gets(name); if( strlen(name)==0 ) break; strcat(name, "\n"); ② ; flag=1; while( flag && (fgets(data, 30, fp) ③ ) ) if( strcmp(data, name) == 0 ) ④ ; if( flag ) fputs(name, fp); else printf("\tData enter error !\n"); } while( ⑤ ); fclose(fp); }