一 . 实验题目
二 . 实现方法
三 . 心得体会
题目一 11-6方阵循环右移
11-6 方阵循环右移(20 分)
本题要求编写程序,将给定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
问题:把循环右移想得过于复杂。
方法:采用 b[i][(j+m)%n]=a[i][j];的方法,通过寻找规律,巧妙解决问题
心得:写程序有时要结合数学规律。换种思路很重要。
源程序
#include<stdio.h> int main() { int m,n; int i,j; scanf("%d %d",&m,&n); int a[n][n],b[n][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]); if(j==n-1)printf("\n"); }} return 0;}
题目二 12-8 删除重复字符(20 分)
本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。
输入格式:
输入是一个以回车结束的非空字符串(少于80个字符)。
输出格式:
输出去重排序后的结果字符串。
输入样例:
ad2f3adjfeainzzzv
输出样例:
23adefijnvz
问题:找到重复的之后不知道怎么把它删除。
解决方法:先把原数组进行排序,再定义一个新数组存放没有重复的字符。
源程序
char a[1000]; char b[1000]; int j,i,len; char temp; gets(a); len=strlen(a); for(i=0;i<len;i++)//排序 for(j=i+1;j<len;j++) if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } b[0]=a[0];j=0;//滤去重复的,赋值给新数组 for(i=1;i<len;i++) { if(b[j]==a[i]) continue; else j++;b[j]=a[i]; } b[j+1]='\0'; puts(b);
题目三 13-5 判断回文字符串(20 分)
本题要求编写函数,判断给定的一串字符是否为“回文”。所谓“回文”是指顺读和倒读都一样的字符串。如“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
实现方法:将循环从头,从尾开始进行比较
bool palindrome( char *s ) { int i=0,k=strlen(s)-1; while(i<k){ if(s[i]!=s[k]) break; i++; k--; } if(i>=k){ return true; } else { return false; } }
题目四 14-2 删除字符
本题要求实现一个删除字符串中的指定字符的简单函数。
函数接口定义:
void delchar( char *str, char c );
其中
char *str
是传入的字符串,c
是待删除的字符。函数delchar
的功能是将字符串str
中出现的所有c
字符删除。
裁判测试程序样例:
#include <stdio.h> #define MAXN 20 void delchar( char *str, char c ); void ReadString( char s[] ); /* 由裁判实现,略去不表 */ int main() { char str[MAXN], c; scanf("%c\n", &c); ReadString(str); delchar(str, c); printf("%s\n", str); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
a
happy new year
输出样例:
hppy new yer
问题:不知如何删除字符
实现方法:采用与滤去重复字符的方式相同,建立一个新数组存放
源程序:
void delchar( char *str, char c ) { int i,k=0; for(i=0;str[i];i++) if(str[i]!=c) str[k++]=str[i]; str[k]='\0'; }
题目五:利用函数字符串实现字符串逆序
本题要求实现一个字符串逆序的简单函数。
函数接口定义:
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
实现方法:通过指针返回多个结果,并从头,从尾开始交换信息
心得:指针是很巧妙的工具
源程序
#include <string.h> void f( char *p ) { int i; char *temp; int len=strlen(p); for(i=0;i<len/2;i++) { temp=*(p+i); *(p+i)=*(p+len-1-i); *(p+len-i-1)=temp; } }