一.實驗題目,設計思路,實現方法。
*實驗題目:
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行,每行n個整數,表示一個n階的方陣。
輸出格式:
按照輸入格式輸出移動后的方陣:即輸出n行,每行n個整數,每個整數后輸出一個空格。
輸入樣例:
|
輸出樣例:
|
設計思路、實現方法
首先定義兩個數組a[100][100],b[100][100],先輸入一個n*n的數組儲存在a中,欲使每個元素右移m個位置,即行數i不變,列數變為就取(m+j)%n為其新列數循環到前面去。 |
12-4 字符串字母大小寫轉換
本題要求編寫程序,對一個以“#”結束的字符串,將其小寫字母全部轉換成大寫字母,把大寫字母全部轉換成小寫字母,其他字符不變輸出。
輸入格式:
輸入為一個以“#”結束的字符串(不超過30個字符)。
輸出格式:
在一行中輸出大小寫轉換后的結果字符串。
輸入樣例:
|
輸出樣例:
|
設計思路、實現方法
這道題就是利用ASCII碼表的順序,如果是a~z,則減去32就能得到A~Z,如果是A~Z,則加上32就能得到a~z |
13-5 判斷回文字符串
本題要求編寫函數,判斷給定的一串字符是否為“回文”。所謂“回文”是指順讀和倒讀都一樣的字符串。如“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:
|
輸出樣例1:
|
輸入樣例2:
|
輸出樣例2:
|
設計思路、實現方法
從開始處與最后面的地方進行比較,發現不一樣就返回false,循環次數也只需要n/2次就好了 |
14-8 字符串排序
本題要求編寫程序,讀入5個字符串,按由小到大的順序輸出。
輸入格式:
輸入為由空格分隔的5個非空字符串,每個字符串不包括空格、制表符、換行符等空白字符,長度小於80。
輸出格式:
按照以下格式輸出排序后的結果:
After sorted:
每行一個字符串
輸入樣例:
|
輸出樣例:
|
設計思路、實現方法
定義兩個二維數組a[102][81],b[102][81],利用strcmp函數進行字符串之間的比較,用的是冒泡排序,再使用strcpy進行字符串交換 |
15-6 按等級統計學生成績
本題要求實現一個根據學生成績設置其等級,並統計不及格人數的簡單函數。
函數接口定義:
int set_grade( struct student *p, int n );
其中p
是指向學生信息的結構體數組的指針,該結構體的定義為:
struct student{ int num; char name[20]; int score; char grade; };
n
是數組元素個數。學號num
、姓名name
和成績score
均是已經存儲好的。set_grade
函數需要根據學生的成績score
設置其等級grade
。等級設置:85-100為A,70-84為B,60-69為C,0-59為D。同時,set_grade
還需要返回不及格的人數。
裁判測試程序樣例:
#include <stdio.h> #define MAXN 10 struct student{ int num; char name[20]; int score; char grade; }; int set_grade( struct student *p, int n ); int main() { struct student stu[MAXN], *ptr; int n, i, count; ptr = stu; scanf("%d\n", &n); for(i = 0; i < n; i++){ scanf("%d%s%d", &stu[i].num, stu[i].name, &stu[i].score); } count = set_grade(ptr, n); printf("The count for failed (<60): %d\n", count); printf("The grades:\n"); for(i = 0; i < n; i++) printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade); return 0; } /* 你的代碼將被嵌在這里 */
輸入樣例:
|
輸出樣例:
|
設計思路、實現方法
這道題考的是結構體,定義了一個student類型的指針p,再用p去訪問其中的成員變量,至於等級那些就使用if判斷了,由於是指針p,所以需要用->。 |
二.源程序
11-6方陣循環左移
#include<stdio.h> int main() { int i,j,m,n; int a[100][100],b[100][100]; scanf("%d %d",&m,&n); for(i=0;i<n;i++) { for(j=0;j<n;j++) { scanf("%d",&a[i][j]); } } for(i=0;i<n;i++) { for(j=0;j<n;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]); } } return 0; }
12-4 字符串字母大小寫轉換
#include<stdio.h> int main() { int i; char str[81]; i=0; while((str[i]=getchar())!='#') { i++; } str[i]='\0'; for(i=0;str[i]!='\0';i++) { if(str[i]>='a'&&str[i]<='z') { str[i]-=32; } else if(str[i]>='A'&&str[i]<='Z') { str[i]+=32; } printf("%c",str[i]); } return 0; }
13-5 判斷回文字符串
bool palindrome( char *s ) { int i,n; n=strlen(s); for(i=0;i<n/2;i++) if(s[i]!=s[n-i-1]) { return false; } return true; }
14-8 字符串排序
#include<stdio.h> #include<string.h> int main() { int i,j; char a[102][81],b[102][81]; for(i=0;i<5;i++) scanf("%s",&a[i]); for(i=0;i<4;i++) { for(j=i+1;j<5;j++) if(strcmp(a[i],a[j])>0) { strcpy(b[j],a[j]); strcpy(a[j],a[i]); strcpy(a[i],b[j]); } } printf("After sorted:\n"); for(i=0;i<5;i++) printf("%s\n",a[i]); return 0; }
15-6 按等級統計學生成績
int set_grade( struct student *p, int n ){ int count = 0, i; for(i = 0;i<n;i++,p++){ if(p->score<60){ p->grade = 'D'; count++; } else if((p->score<70)&&(p->score>=60)){ p->grade = 'C'; } else if((p->score<85)&&(p->score>=70)){ p->grade = 'B'; } else{ p->grade = 'A'; } } return count; }
三.遇到的問題及解決方法,心得體會
第11-15次的實驗難度明顯比之前的大,因此做起來比較吃力,特別是14、15兩次的實驗,碰到指針方面的知識點就比較吃力,不知道從何下手,但是又必須踏過這個坎,因此我就去看視頻,找別人教我,把指針基本的使用方法弄懂了, 比如實驗15的那道題,定義一個結構體指針的時候,剛開始以為還是用.去訪問成員變量,之后發現是用->訪問的 C語言就是要多打代碼才能熟練,通過這幾次的實驗我覺得我收獲特別多 |