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.要考虑清楚特定输出数据赋值语句摆放位置,若摆放位置不当可能出现乱码

C语言第二次实验作业的更多相关文章

  1. C语言第二次实验报告

    1.实验题目 题1:11-7 找鞍点(20 分) 一个矩阵元素的"鞍点"是指该位置上的元素值在该行上最大.在该列上最小. 本题要求编写程序,求一个给定的n阶方阵的鞍点    题2: ...

  2. c语言 第二次实验报告

    一·实验题目,设计思路,实现方法 11-7 找鞍点 一个矩阵元素的"鞍点"是指该位置上的元素值在该行上最大.在该列上最小. 本题要求编写程序,求一个给定的n阶方阵的鞍点. 利用双重 ...

  3. SDN2017 第二次实验作业

    安装floodlight 参考链接:http://www.sdnlab.com/19189.html 从github下载源码,并编译安装 $ sudo apt-get install build-es ...

  4. C语言第二次博客作业---分支结构

    一,PTA实验作业 题目1.计算分段函数 本题目要求计算下列分段函数f(x)的值: 1.实验代码 double x,result; scanf("%lf",&x); if( ...

  5. C语言第二次作业

    一.PTA实验作业 题目1:7-1 计算分段函数[2] 1.实验代码 double x,y; scanf("%lf",&x); if (x>=0) { y=sqrt( ...

  6. C语言第二次博客作业—分支结构

    一.PTA实验作业 题目1:计算分段函数 1.实验代码 double x,y; scanf("%lf",&x); if(x>=0){ y=sqrt(x); print ...

  7. C语言第二周作业

    一.PTA实验作业 题目一:7-1 计算分段函数 1.实验代码 double x,y; scanf("%lf", &x); if(x >= 0){ y=pow(x,0 ...

  8. C语言第二次博客作业——分支结构

    一.PTA实验作业 题目1:计算分段函数 1.实验代码 #include<stdio.h> #include<math.h> int main(void) { double x ...

  9. C语言第二次博客作业

    一.PTA实验作业 题目1:计算分段函数[2] 本题目要求计算下列分段函数f(x)的值: 1.实验代码 int main (void) { double x,y; scanf("%lf&qu ...

随机推荐

  1. IMP导入小记

    1.创建表空间 create tablespace example_tablespace datafile 'e:\****.dbf' size 10m reuse autoextend on nex ...

  2. Android深度探索(卷1)HAL与驱动开发 虚拟环境的安装

    前言: 最近在看<Android深度探索(卷1)HAL与驱动开发>安装随书带的虚拟环境浪费了很多时间,说是虚拟环境的安装倒不如说是虚拟环境的导入,其实没什么技术含量,也没有什么复杂的,只是 ...

  3. Spring初学之bean之间的关系和bean的作用域

    一.bean之间的关系 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="h ...

  4. JavaScript 正则表达收集整理

    JavaScript 正则表达收集整理 //可为空 /^\s*$/ //密码验证,必须且只含有数字和字母,可以拥有英文符号,6-17位 /(?=.{,})(?=.*\d)(?=.*[a-z])[\x2 ...

  5. UML类图(三)-------实例

    实例分析1——登录模块 某基于C/S的即时聊天系统登录模块功能描述如下: 用户通过登录界面(LoginForm)输入账号和密码,系统将输入的账号和密码与存储在数据库(User)表中的用户信息进行比较, ...

  6. WPF中的事件及冒泡事件和隧道事件(预览事件)的区别

    WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别   WPF快速指导10:WPF中的事件及冒泡事件和隧道事件(预览事件)的区别 本文摘要: 1:什么是路由事件: 2:中断事件路 ...

  7. MVC3 ajax功能

    微软mvc3框架的项目使用微软自带的ajax 必须引用下面 <script src="/Scripts/jquery.unobtrusive-ajax.js" type=&q ...

  8. 2015 Benelux Algorithm Programming Contest (BAPC 15)E - Excellent Engineers

    这题想了很久没思路,不知道怎么不sort维护二维的最小值 emmmm原来是线段树/树状数组,一维sort,二维当成下标,维护三维的最小值 #include<bits/stdc++.h> # ...

  9. MAMP软件的安装和使用

    MAMP Pro软件是一款很好的在MAC下面运行的网站集成环境软件,功能强大,配置简单,十分便于本地调试,其由Apache+MySQL+PHP+动态DNS配置构成,PHP的版本可以动态切换到最新版.无 ...

  10. POJ--1094--Sorting It All Out||NYOJ--349--Sorting It All Out(拓扑排序)

    NYOJ的数据水一点,POJ过了是真的过了 /* 拓扑排序模板题: 每次输入都要判断有环与有序的情况,如果存在环路或者已经有序可以输出则跳过下面的输入 判断有序,通过是否在一个以上的入度为0的点,存在 ...