一 . 實驗題目c++
二 . 實現方法數組
三 . 心得體會app
11-6 方陣循環右移(20 分)函數
本題要求編寫程序,將給定n×n方陣中的每一個元素循環向右移m個位置,即將第0、一、⋯、n−1列變換爲第n−m、n−m+一、⋯、n−一、0、一、⋯、n−m−1列。工具
輸入格式:
輸入第一行給出兩個正整數m和n(1≤n≤6)。接下來一共n行,每行n個整數,表示一個n階的方陣。測試
輸出格式:
按照輸入格式輸出移動後的方陣:即輸出n行,每行n個整數,每一個整數後輸出一個空格。this
輸入樣例:
2 3 1 2 3 4 5 6 7 8 9輸出樣例:
2 3 1 5 6 4 8 9 7
問題:把循環右移想得過於複雜。spa
方法:採用 b[i][(j+m)%n]=a[i][j];的方法,經過尋找規律,巧妙解決問題指針
心得:寫程序有時要結合數學規律。換種思路很重要。code
#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;}
本題要求編寫程序,將給定字符串去掉重複的字符後,按照字符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);
本題要求編寫函數,判斷給定的一串字符是否爲「迴文」。所謂「迴文」是指順讀和倒讀都同樣的字符串。如「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; } }