华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
break; case 2: p = strcat; break; case 3:
gotodowm; }
getchar();
printf(\ i = 0;
printf(\ i = 0;
result = (a, b);
printf(\dowm:
; return 0; }
【分析】(1)通过下面关于result的的操作可以看出,前面是用两个函数来
控制选择哪个菜单来执行,因此p的作用就是等于不同的函数来起到开关的作用,所以前面需要声明p的存在,由此填出三个空上的内容。第一个是char *(*p)(char *a,char *b);第二个是gets(a),第三个是gets(b),第四个是p。
(2)由(1)可得正确的源程序,按照要求输入则可得到输出结果。 【程序】
#include
char *(*p)(char *a,char *b);
char a[80],b[80],c[160],*result=c; int choice,i; do{
printf(\ printf(\ printf(\
printf(\ scanf(\ }while(choice<1||choice>5); switch(choice){ case 1:
p=strcpy; break; case 2:
p=strcat;
46
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
break; case 3:
goto down; }
getchar();
printf(\ i=0; gets(a);
printf(\ i=0; gets(b);
result=p(a,b);
printf(\ down: ; return 0; }
【测试】程序运行结果如下,程序正确。
6.2.3跟踪调试
请按下面的要求对所给的源程序进行操作,并回答问题和排除错误。 (1)单步执行源程序。进入strcpy时,watches窗口中s为何值?返回main时,watches 窗口中s为何值? 进入函数时
返回main时,无s的值。
(2)排除源程序中的错误,使程序输出结果为:there is a bote on the lake. 题目程序代码: #include
char *strcpy(char *, char*); int main(void) {
char a[20], b[60] = \printf(\ return 0; }
char *strcpy(char *s, char *t) {
while(*s++ = *t++)
47
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
; return (s); }
【修改后的源程序】
#include
char *strcpy(char *,char *); int main() {
char a[20],b[60]=\ printf(\ return 0; }
char *strcpy(char *s,char *t) {
while((*s++=*t++)) ; return(s); }
6.2.4 程序设计
编写并上机调试运行能实现以下功能的程序:
(1)已知一个长整型变量占4个字节,其中每个字节又分成高4位和低4位。试编写一 个程序,从该长整型变量的高字节开始,依次取出每个字节的高4位和低4位并以数字字符的形式记性显示。
(2)利用大小为n的指针数组指向用gets函数输入的n行,每行不超过80个字符。试编 写一个函数,它将每一行中连续的多个空格字符压缩为一个空格字符。在调用函数中输出压缩空格后的各行,空行不予输出。
(3)编写一个程序,输入n个整数,排序后输出。排序的原则由命令行可选参数-的-d决 定,并且有参数-d时按递减顺序排序,否则按递增顺序排序。要求将排序算法定义成函数,利用指向函数的指针使该函数实现递增或递减排序。
(4)设某个班有N个学生,每个学生修了M门课程。输入M门课程的名称,然后依次 输入N个学生中每个学生所修M门课程的成绩,并且都存放到相应的数组中。试编写下列函数:
① 计算每个学生各门课程平均成绩。 ② 计算全班没门课程的平均成绩。
③ 分别统计低于全班各门课程平均成绩的人数。
④ 分别统计全班各门课程不及格的人数和90分以上的人数。 在调用函数中输出上面各函数的计算结果(要求都用指针操作,不得使用下下标操作)
【程序】
(1)
#include
48
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
long int a;
printf(\ scanf(\ litoc(a); return 0; }
void litoc(long int a) {
char *p,low,high; p=&a; p=p+3; int i;
for (i=0;i<4;i++) {
low=(*p)&0x0f; if(low<10)
low=low+'0'; else
low=low+'A'-10; high=(*p >> 4)&0x0f; if (high<10)
high=high+'0'; else
high=high+'A'-10;
printf(\ p--; } }
(2)
#include
void DeleteSpace (char *p[],int n); int main(void) {
int i,j,n;
printf( \ scanf(\ n=n+1;
char a[n][N],*p[n]; for(i=0;i change(p,n); return 0; } void change(char *p[],int n) { int i,j,k,t; 49 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 for(i=0;i for(j=0;p[i][j]!='\\0';j++){ if(p[i][j]==' '&&p[i][j+1]==' '){ k=j+1; while(p[i][k++]==' '); k--; t=j+1; while(p[i][t++]=p[i][k++]); } } if(strlen(p[i])>0) printf(\ } } (3)#include void down_sort( int * , int ) ; void up_sort( int * , int ) ; int main( int argc , char * argv[] ) { int n , i ; void (*p)(int * , int ) ; printf( \请输入要输入整数的个数:\ scanf( \ int a[n] ; for( i = 0 ; i < n ; i++ ){ scanf( \ } if( argc > 1 && !strcmp(argv[1] , \ p = down_sort ; else p = up_sort ; p( a , n ) ; printf( \排序后:\\n\ for( i = 0 ; i < n ; i++ ){ printf( \ } return 0 ; } void down_sort( int *a , int m ) { int i , j , t ; for( i = 0 ; i < m - 1 ; i++ ){ for( j = 0 ; j < m-1-i ; j++ ){ if( *(a+j) < *(a+j+1) ){ t = *(a+j) ; *(a+j) = *(a+j+1) ; *(a+j+1) = t ; 50