C语言第二次实验报告

时间:2021-01-11 01:41:48

一.实验题目,设计思路与实现方法


题目一

11-6 方阵循环右移(20 分)
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。

输入格式:

输入第一行给出两个正整数m和n(1≤n≤6)。接下来一共n行,每行n个整数,表示一个n阶的方阵。

输出格式:

按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。

实现方法:

利用数组矩阵,采用m余数的方法,b[i][(j+m)%n]=a[i][j],来实现移动。

题目二

12-8 删除重复字符(20 分)
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。

输入格式:

输入是一个以回车结束的非空字符串(少于80个字符)。

输出格式:

输出去重排序后的结果字符串。

实现方法:

利用for循环,直到找到对应的非空字符串,从这个非空字符串开始,每位从前移动一位,即可实现。

题目三
13-4 使用函数的选择法排序(25 分)

本题要求实现一个用选择法对整数数组进行简单排序的函数。

函数接口定义:
'''void sort( int a[], int n );

其中a是待排序的数组,n是数组a中元素的个数。该函数用选择法将数组a中的元素按升序排列,结果仍然在数组a中。

实现方法:

选择排序法是课本要求的需要掌握的一种排序方法,利用两个嵌套循环实现排序。

题目四

14-5 指定位置输出字符串(20 分)
本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。

函数接口定义:

‘’‘’char match( char s, char ch1, char ch2 );

函数match应打印s中从'ch1'到'ch2'之间的所有字符,并且返回'ch1'的地址。

实现方法:

利用指针,利用for循环先查找ch1,若找ch1,则指针指向ch1的地址后,继续查找ch2,最后返回ch1的首地址。

题目五
15-5 建立学生信息链表(20 分)

本题要求实现一个将输入的学生成绩组织成单向链表的简单函数。

函数接口定义:

```void input();

该函数利用'scanf'从输入中获取学生的信息,并将其组织成单向链表。链表节点结构定义如下:

struct stud_node {
    int              num;     
    char             name[20]; 
    int              score;    
    struct stud_node *next;  
};

单向链表的头尾指针保存在全局变量'head'和'tail'中,输入为若干个学生的信息(学号、姓名、成绩),当输入学号为0时结束。

部分源代码

11-6 方阵循环右移

int m,n,i,j;
    scanf("%d %d",&m,&n);
    int a[n][n],b[n][n];
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
            b[i][(j+m)%n]=a[i][j];
        }
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            printf("%d ",b[i][j]);
            if(j==n-1)
            printf("\n");
        }
        }

12-8 删除重复字符

char s[80],b[80];
    int i,j,len,t;
    gets(s);
    len=strlen(s);
    for(i=0;i<len;i++)
    for(j=i+1;j<len;j++)
        if(s[i]>s[j]){
            t=s[i];
            s[i]=s[j];
            s[j]=t;
        }
        b[0]=s[0];
        j=0;
        for(i=1;i<len;i++){
            if(b[j]==s[i])
            continue;
            else {
                j++;
                b[j]=s[i];
            }
        }
    j++;
    b[j]='\0';  
    puts(b);

13-4 使用函数的选择法排序
裁判测试程序样例:

void sort( int a[], int n );
int main()
{
    int i, n;
    int a[MAXN];

    scanf("%d", &n);
    for( i=0; i<n; i++ )
        scanf("%d", &a[i]);

    sort(a, n);

    printf("After sorted the array is:");
    for( i = 0; i < n; i++ )
        printf(" %d", a[i]);
    printf("\n");

    return 0;
}

代码如下:

void sort( int a[], int n ){
    int index,k,i,t;
    for(k=0;k<n-1;k++){
        index=k;
        for(i=k+1;i<n;i++)
        if(a[i]<a[index]) index=i;
        t=a[index];
        a[index]=a[k];
        a[k]=t;
    }
}

14-5 指定位置输出字符串
裁判测试程序样例:

#include <stdio.h>
#define MAXS 10
char *match( char *s, char ch1, char ch2 );
int main()
{
    char str[MAXS], ch_start, ch_end, *p;
    scanf("%s\n", str);
    scanf("%c %c", &ch_start, &ch_end);
    p = match(str, ch_start, ch_end);
    printf("%s\n", p);

    return 0;
}

代码如下:

char *match( char *s, char ch1, char ch2 ){
    char str[MAXS]; 
    char *p,*q, *t;
    int i;
    p = s;
    while(*p!=ch1&&*p!='\0'){//
        p++;
    }
    q = p;
    for(i=0;i<MAXS && *p !='\0' && *p != ch2;i++,p++){
        str[i] = *p;    
    }
    if(*p != '\0'){
        str[i] = ch2;
        str[++i] = '\0';
    }
    str[i] = '\0';  
    printf("%s\n",str);
    
    return q;
}

15-5建立学生信息链表
裁判测试程序样例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct stud_node {
     int    num;
     char   name[20];
     int    score;
     struct stud_node *next;
};
struct stud_node *head, *tail;
void input();
int main()
{
    struct stud_node *p;
    head = tail = NULL;
    input();
    for ( p = head; p != NULL; p = p->next )
        printf("%d %s %d\n", p->num, p->name, p->score);
    return 0;
}

代码如下:

void input(){
    struct stud_node *p;
    head = (struct stud_node*)malloc(sizeof(struct stud_node));
    head->next = NULL;
    p = head;
    while(1)
    {
        tail = (struct stud_node*)malloc(sizeof(struct stud_node));
        scanf("%d", &tail->num);
        if (!tail->num) break;
        scanf("%s%d", tail->name, &tail->score);
        p->next = tail;
        p=tail;
    }
    head = head->next;
}

遇到的问题,解决方法和心得体会

指针的难度让我明显感受到这五次作业的难度,对指针还是要多加练习,要学会灵活运用getchar()解除缓冲区,利用gets(),puts()输入输出函数。