C语言第二次实验报告
一.实验题目,设计思路,实现方法。
*实验题目:
11-6 方阵循环左移
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
输入格式:
输入第一行给出两个正整数m和n(1)。接下来一共n行,每行n个整数,表示一个n阶的方阵。
输出格式:
按照输入格式输出移动后的方阵:即输出n行,每行n个整数,每个整数后输出一个空格。
输入样例:
|
输出样例:
|
设计思路、实现方法
首先定义两个数组a[100][100],b[100][100],先输入一个n*n的数组储存在a中,欲使每个元素右移m个位置,即行数i不变,列数变为就取(m+j)%n为其新列数循环到前面去。 |
12-4 字符串字母大小写转换
本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。
输入格式:
输入为一个以“#”结束的字符串(不超过30个字符)。
输出格式:
在一行中输出大小写转换后的结果字符串。
输入样例:
|
输出样例:
|
设计思路、实现方法
这道题就是利用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:
|
输出样例1:
|
输入样例2:
|
输出样例2:
|
设计思路、实现方法
从开始处与最后面的地方进行比较,发现不一样就返回false,循环次数也只需要n/2次就好了 |
14-8 字符串排序
本题要求编写程序,读入5个字符串,按由小到大的顺序输出。
输入格式:
输入为由空格分隔的5个非空字符串,每个字符串不包括空格、制表符、换行符等空白字符,长度小于80。
输出格式:
按照以下格式输出排序后的结果:
After sorted:
每行一个字符串
输入样例:
|
输出样例:
|
设计思路、实现方法
定义两个二维数组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; } /* 你的代码将被嵌在这里 */
输入样例:
|
输出样例:
|
设计思路、实现方法
这道题考的是结构体,定义了一个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语言就是要多打代码才能熟练,通过这几次的实验我觉得我收获特别多 |