c语言实验报告
一.实验题目,设计思路,实现方法
1.实验题目
11-6 方阵循环右移
本题要求编写程序,将给定n×n方阵中的每个元素循环向右移m个位置,即将第0、1、⋯、n−1列变换为第n−m、n−m+1、⋯、n−1、0、1、⋯、n−m−1列。
12-7 输出大写英文字母
本题要求编写程序,顺序输出给定字符串中所出现过的大写英文字母,每个字母只输出一遍;若无大写英文字母则输出“Not Found”。
13-4 使用函数的选择法排序
本题要求实现一个用选择法对整数数组进行简单排序的函数。
14-2 删除字符
本题要求实现一个删除字符串中的指定字符的简单函数。
15-6 按等级统计学生成绩
本题要求实现一个根据学生成绩设置其等级,并统计不及格人数的简单函数。
2.设计思路
11-6 方阵循环右移
定义两个二维数组a b,a存放输入的数组,将右移后数组的值赋值到b的相应下标。这里的重点是新列下标的计算。
12-7 输出大写英文字母
此题主要难点在于大写字母的不重复输出。通过定义第二个字符数组存放。加一个循环判断重复的不在放入。
13-4 使用函数的选择法排序
与数组选择法排序相同,通过循环比较大小在交换字符串数组元素的值。
14-2 删除字符
录入要删除的指定字符,通过指针的移动*取元素值,遇到需要删除的元素跳过赋值,达到删除效果。
15-6 按等级统计学生成绩
按照题目设定标准将成绩转换成等级保存到结构体的grade中。
3.实现方法
11-6 方阵循环右移
我采用求余的办法,原本的列下标加上位移数求余列数得到新的下标然后保存到新的数组中。
12-7 输出大写英文字母
用一个flag变量来标记,j计数并用j循环查找是否有相同的大写字母,不同写入新字符串数组,有相同则flag为1跳过下一个语句。末尾flag归0.最后打印新数组。
13-4 使用函数的选择法排序
一个外循环进行字符串数组的单个元素读取,index标记外循环下标。内循环从index开始并找出后续最大或者最小的值并赋给index下标。交换index下标与i下标元素的值。
14-2 删除字符
新定义一个与传递过来指针地址相同的指针,判断指针如果不为空则在定义一个新的指针。第一个用来记录字符串首地址,第二个与传递的指针移动赋值,遇到制定字母跳过,最后返回第一个指针。
15-6 按等级统计学生成绩
一个变量计数计不及格的人数,还是通过指针的变化来对分数判断并赋值给grade.
二. 源程序(可只截取最关键的部分)
11-6 方阵循环右移
for(i=0;i<n;i++){
for(j=0;j<n;j++){
x=(j+m)%n;
b[i][x]=a[i][j];
}
}
12-7 输出大写英文字母
for(i=0;s[i]!='\0';i++)
{
if(s[i]<='Z'&&s[i]>='A')
{
k=1;
for(a=0;a<j;a++)
{
if(ss[a]==s[i])
flag=1;
}
if(flag==0)
{
ss[j]=s[i];
j++;
}
flag=0;
}
}
13-4 使用函数的选择法排序
int index,t;
for(int i=0;i<n-1;i++){
index=i;
for(int j=i+1;j<n;j++)if(a[j]<a[index])index=j;
t=a[index];
a[index]=a[i];
a[i]=t;
}
14-2 删除字符
void delchar( char *str, char c )
{
char* ret = str;
if( str != NULL ){
char* p = str;
while( *str ){
if( *str != c ){
*p = *str;
p++;
}
str++;
}
*p = *str;
}
return ret;
}
15-6 按等级统计学生成绩
int set_grade( struct student *p, int n )
{
int i,cnt=0;
for(i=0;i<n;i++)
{
if(p->score>=85)p->grade='A';
if(p->score>=70&&p->score<85)p->grade='B';
if(p->score>=60&&p->score<70)p->grade='C';
if(p->score>=0&&p->score<60)
{
p->grade='D';
cnt++;
}
p++;
}
return cnt;
}