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.要考慮清楚特定輸出數據賦值語句擺放位置,若擺放位置不當可能出現亂碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM