C语言第二次实验报告

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

*实验题目:

11-6 方阵循环左移

本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n1列变换为第nm、nm+1、⋯、n1、0、1、⋯、nm1列。

输入格式:

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

输出格式:

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

输入样例:

2 3
1 2 3
4 5 6
7 8 9

 

 

 

 

输出样例:

2 3 1

5 6 4

8 9 7

 

 

 

 

 

设计思路、实现方法

   首先定义两个数组a[100][100],b[100][100],先输入一个n*n的数组储存在a中,欲使每个元素右移m个位置,即行数i不变,列数变为就取(m+j)%n为其新列数循环到前面去。

 

 

 

 

12-4 字符串字母大小写转换

本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。

输入格式:

输入为一个以“#”结束的字符串(不超过30个字符)。

输出格式:

在一行中输出大小写转换后的结果字符串。

输入样例:

Hello World! 123#

 

 

输出样例:

hELLO wORLD! 123

 

 

 

设计思路、实现方法

这道题就是利用ASCII码表的顺序,如果是a~z,则减去32就能得到A~Z,如果是A~Z,则加上32就能得到a~z

 

 

 

13-5 判断回文字符串

本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“XYZYX”和“xyzzyx”都是回文。

函数接口定义:

bool palindrome( char *s );

函数palindrome判断输入字符串char *s是否为回文。若是则返回true,否则返回false

裁判测试程序样例:

#include <stdio.h>
#include <string.h>

#define MAXN 20
typedef enum {false, true} bool;

bool palindrome( char *s );

int main()
{
    char s[MAXN];

    scanf("%s", s);
    if ( palindrome(s)==true )
        printf("Yes\n");
    else
        printf("No\n");
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例1:

thisistrueurtsisiht

 

 

输出样例1:

Yes
thisistrueurtsisiht

 

 

 

输入样例2:

thisisnottrue

 

 

输出样例2:

No
thisisnottrue

 

 

 

 

设计思路、实现方法

从开始处与最后面的地方进行比较,发现不一样就返回false,循环次数也只需要n/2次就好了

 

 

 

14-8 字符串排序

本题要求编写程序,读入5个字符串,按由小到大的顺序输出。

输入格式:

输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。

输出格式:

按照以下格式输出排序后的结果:

After sorted:
每行一个字符串

输入样例:

red yellow blue green white

 

 

输出样例:

After sorted:
blue
green
red
white
yellow

 

 

 

 

 

 

设计思路、实现方法

定义两个二维数组a[102][81],b[102][81],利用strcmp函数进行字符串之间的比较,用的是冒泡排序,再使用strcpy进行字符串交换

 

 

 

15-6 按等级统计学生成绩

本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。

函数接口定义:

int set_grade( struct student *p, int n );

其中p是指向学生信息的结构体数组的指针,该结构体的定义为:

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

n是数组元素个数。学号num、姓名name和成绩score均是已经存储好的。set_grade函数需要根据学生的成绩score设置其等级grade。等级设置:85-100为A,70-84为B,60-69为C,0-59为D。同时,set_grade还需要返回不及格的人数。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

struct student{
    int num;
    char name[20];
    int score;
    char grade;
};

int set_grade( struct student *p, int n );

int main()
{   struct student stu[MAXN], *ptr;
    int n, i, count;

    ptr = stu;
    scanf("%d\n", &n);
    for(i = 0; i < n; i++){
       scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score);
    } 
   count = set_grade(ptr, n);
   printf("The count for failed (<60): %d\n", count);
   printf("The grades:\n"); 
   for(i = 0; i < n; i++)
       printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
    return 0;
}

/* 你的代码将被嵌在这里 */

 

输入样例:

10
31001 annie 85
31002 bonny 75
31003 carol 70
31004 dan 84
31005 susan 90
31006 paul 69
31007 pam 60
31008 apple 50
31009 nancy 100
31010 bob 78

 

 

 

 

 

 

 

 

输出样例:

The count for failed (<60): 1
The grades:
31001 annie A
31002 bonny B
31003 carol B
31004 dan B
31005 susan A
31006 paul C
31007 pam C
31008 apple D
31009 nancy A
31010 bob B

 

 

 

 

 

 

 

 

 

 

设计思路、实现方法

这道题考的是结构体,定义了一个student类型的指针p,再用p去访问其中的成员变量,至于等级那些就使用if判断了,由于是指针p,所以需要用->。

 

 

 

二.源程序

11-6方阵循环左移

#include<stdio.h>
int main()
{
    int i,j,m,n;
    int a[100][100],b[100][100];
    scanf("%d %d",&m,&n);
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;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]);
        }
    }
    return 0;
}

 

12-4 字符串字母大小写转换

#include<stdio.h>
int main()
{
    int i;
    char str[81];
    i=0;
    while((str[i]=getchar())!='#')
    {
        i++;
    }
    str[i]='\0';
    for(i=0;str[i]!='\0';i++)
    {
        if(str[i]>='a'&&str[i]<='z')
        {
            str[i]-=32;
        }
        else if(str[i]>='A'&&str[i]<='Z')
        {
            str[i]+=32;
        }
        printf("%c",str[i]);
    }
    return 0;
}

13-5 判断回文字符串

bool palindrome( char *s )
{
    int i,n;
    n=strlen(s);
    for(i=0;i<n/2;i++)
        if(s[i]!=s[n-i-1])
        {
             return false;
        }
     return true;
}

14-8 字符串排序

#include<stdio.h>
#include<string.h>
int main()
{
    int i,j;
    char a[102][81],b[102][81];
    for(i=0;i<5;i++)
        scanf("%s",&a[i]);
    for(i=0;i<4;i++)
    {
        for(j=i+1;j<5;j++)
            if(strcmp(a[i],a[j])>0)
            {
                strcpy(b[j],a[j]);
          strcpy(a[j],a[i]);
          strcpy(a[i],b[j]);
            }
    }
    printf("After sorted:\n"); 
    for(i=0;i<5;i++)
        printf("%s\n",a[i]);
    return 0;
} 

15-6 按等级统计学生成绩

int set_grade( struct student *p, int n ){
    int count = 0, i;
    for(i = 0;i<n;i++,p++){
        if(p->score<60){
            p->grade = 'D';
            count++;
        }
        else if((p->score<70)&&(p->score>=60)){
            p->grade = 'C';
        }
        else if((p->score<85)&&(p->score>=70)){
            p->grade = 'B';
        }
        else{
            p->grade = 'A';
        }
    }
    return count;
}

 

 

三.遇到的问题及解决方法,心得体会

第11-15次的实验难度明显比之前的大,因此做起来比较吃力,特别是14、15两次的实验,碰到指针方面的知识点就比较吃力,不知道从何下手,但是又必须踏过这个坎,因此我就去看视频,找别人教我,把指针基本的使用方法弄懂了,

比如实验15的那道题,定义一个结构体指针的时候,刚开始以为还是用.去访问成员变量,之后发现是用->访问的

C语言就是要多打代码才能熟练,通过这几次的实验我觉得我收获特别多

posted @ 2018-01-25 12:14  木桐  阅读(2190)  评论(0编辑  收藏  举报