C语言第二次实验作业

PTA

=================

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≤6)。接下来一共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
```
1.设计思路
- 定义两个大小相同的二维数组
- 用一个数组存储初始数组,用另一个数组存储循环右移后的数组
2.源代码
```
#include<stdio.h>
int main(){

int a[7][7],b[7][7],m,n,i,j;

scanf("%d %d",&m,&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]);
 
}
  printf("\n");

}

 
return 0;

}
```
3.遇到的问题和解决方法
- 答案错误:两个数组对应数的列位置关系弄反了
  解决方法:更正两个数组对应数的列位置关系
***
12-8 删除重复字符
---------------------
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
```
ad2f3adjfeainzzzv
```
输出样例:
```
23adefijnvz
```
1.设计思路
- 定义两个数组,a[80]存储输入数据并作为b[200]的下标
- 将下标为a[80]中数值的b[200]数组元素赋同值
- 输出b[200]数组的下标值转化为字符输出
2.源代码
```
#include<stdio.h>
#include<string.h>
int main(){
  char a[80],b[200]={0};
  gets(a);
  int i;
  for(i=0;a[i]!='\0';i++){
    b[a[i]]=1;
  }
for(i=0;i!=200;i++){
    if(b[i]==1) printf("%c",i);
  }
  return 0;
}
```
3.遇到的问题和解决方法
- 答案错误:定义过多数组,使用混乱
  解决方法:重新整理思路,只定义两个数组,将a数组转化为下标
***
13-6 数组循环右移
-------------------
本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a?0??a?1???a?n?1??)变换为(a?n?m???a?n?1??a?0??a?1???a?n?m?1??)(最后m个数循环移至最前面的m个位置)。
函数接口定义:
```
int ArrayShift( int a[], int n, int m );
```
其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。
裁判测试程序样例:
```
#include <stdio.h>
#define MAXN 10

int ArrayShift( int a[], int n, int m );

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

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

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */
```
输入样例:
```
6 2
1 2 3 4 5 6
```
输出样例:
```
5 6 1 2 3 4
```
1.设计思路
- 定义一个数组存储数据
- 定义另一个数组存储循环右移后的结果并输出
2.源代码
```
int ArrayShift( int a[], int n, int m ){
  int b[100],i;
  for(i=0;i<n;i++){
    b[(i+m)%n]=a[i];
  }
  for(i=0;i<n;i++){
    a[i]=b[i];
  }
 
}
```
3.遇到的问题和解决方法
- 答案错误:将两个数组对应数值所在列数关系弄反,导致新数组列顺序出错
  解决方法:更正两个数组对应数值所在列数关系式
***
14-5 指定位置输出字符串
--------------------------
本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。
函数接口定义:
char *match( char *s, char ch1, char ch2 );
函数match应打印s中从ch1到ch2之间的所有字符,并且返回ch1的地址。
裁判测试程序样例:
```
#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;
}

/* 你的代码将被嵌在这里 */
```
输入样例1:
```
program
r g
```
输出样例1:
```
rog
rogram
``
输入样例2:
```
program
z o
```
输出样例2:
```
(空行)
(空行)
```
输入样例3:
```
program
g z
```
输出样例3:
```
gram
gram
```
1.设计思路
- 运用while()函数寻找第一个指定字符和第二个指定字符
- 运用指针记录第一个字符首次出现的地址
2.源代码
```
char *match( char *s, char ch1, char ch2 ){
  int i=0;
   char *p;
  while(s[i]!=ch1) {i++;if(s[i]=='\0') break;}
  if(s[i]=='\0') {p="\n";}
  else{
   p=&s[i];
  while(s[i]!=ch2){
  if(s[i]=='\0') break;   
  printf("%c",s[i]);
  i++;
  }
  if(s[i]==ch2) printf("%c",s[i]);
  printf("\n");
  }
  return p;
}
```
3.遇到的问题和解决方法
- 答案错误:ch1找不到, ch2找到的的情况多输出一行空行
  解决方法:没找到ch1的情况删去多输出的一个回车
- 答案错误:ch1找到, ch2找不到的情况输出乱码
  解决方案:找到ch1后再将ch1的地址赋给指针p
***
15-3 函数实现字符串逆序
------------------------
本题要求实现一个字符串逆序的简单函数。
函数接口定义:
```
void f( char *p );
```
函数f对p指向的字符串进行逆序操作。要求函数f中不能定义任何数组,不能调用任何字符串处理函数。
裁判测试程序样例:
```
#include <stdio.h>
#define MAXS 20

void f( char *p );
void ReadString( char *s ); /* 由裁判实现,略去不表 */

int main()
{
    char s[MAXS];

    ReadString(s);
    f(s);
    printf("%s\n", s);

    return 0;
}

/* 你的代码将被嵌在这里 */
```
输入样例:
```
Hello World!
```
输出样例:
```
!dlroW olleH
```
1.设计思路
- 对字符数组是元素个数为奇数或偶数进行讨论
- 将前后对称位置的字符对调
2.源代码
```
void f( char *p ){
  int i=0,k;
  char t;
  while(p[i]) i++;
  if(i%2==1){
  for(k=0;k<=i/2;k++){
    t=p[k];
   p[k]=p[i-k-1] ;
   p[i-k-1]=t;
  }
  }
  else {
    for(k=0;k<i/2;k++){
    t=p[k];
   p[k]=p[i-k-1] ;
   p[i-k-1]=t;
  }
  }
}
```
3.遇到的问题和解决方法
- 答案错误:输出字符串乱序
  解决方法:将数组元素个数为奇数和偶数的情况分开
***
心得体会
-------------
1.遇到不懂的地方要多找人问问
2.要考虑清楚特定输出数据赋值语句摆放位置,若摆放位置不当可能出现乱码

posted @ 2018-01-25 21:43  兰景晖  阅读(2858)  评论(0编辑  收藏  举报