一.實驗題目,設計思路與實現方法
題目一
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個整數,每個整數后輸出一個空格。
實現方法:
利用數組矩陣,采用m余數的方法,b[i][(j+m)%n]=a[i][j],來實現移動。
題目二
12-8 刪除重復字符(20 分)
本題要求編寫程序,將給定字符串去掉重復的字符后,按照字符ASCII碼順序從小到大排序后輸出。
輸入格式:
輸入是一個以回車結束的非空字符串(少於80個字符)。
輸出格式:
輸出去重排序后的結果字符串。
實現方法:
利用for循環,直到找到對應的非空字符串,從這個非空字符串開始,每位從前移動一位,即可實現。
題目三
13-4 使用函數的選擇法排序(25 分)
本題要求實現一個用選擇法對整數數組進行簡單排序的函數。
函數接口定義:
'''void sort( int a[], int n );
其中a是待排序的數組,n是數組a中元素的個數。該函數用選擇法將數組a中的元素按升序排列,結果仍然在數組a中。
實現方法:
選擇排序法是課本要求的需要掌握的一種排序方法,利用兩個嵌套循環實現排序。
題目四
14-5 指定位置輸出字符串(20 分)
本題要求實現一個函數,對給定的一個字符串和兩個字符,打印出給定字符串中從與第一個字符匹配的位置開始到與第二個字符匹配的位置之間的所有字符。
函數接口定義:
‘’‘’char *match( char *s, char ch1, char ch2 );
函數match應打印s中從'ch1'到'ch2'之間的所有字符,並且返回'ch1'的地址。
實現方法:
利用指針,利用for循環先查找ch1,若找ch1,則指針指向ch1的地址后,繼續查找ch2,最后返回ch1的首地址。
題目五
15-5 建立學生信息鏈表(20 分)
本題要求實現一個將輸入的學生成績組織成單向鏈表的簡單函數。
函數接口定義:
>該函數利用'scanf'從輸入中獲取學生的信息,並將其組織成單向鏈表。鏈表節點結構定義如下:
struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
>單向鏈表的頭尾指針保存在全局變量'head'和'tail'中,輸入為若干個學生的信息(學號、姓名、成績),當輸入學號為0時結束。
#部分源代碼
**11-6 方陣循環右移**
int m,n,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");
}
}
**12-8 刪除重復字符**
char s[80],b[80];
int i,j,len,t;
gets(s);
len=strlen(s);
for(i=0;i<len;i++)
for(j=i+1;j<len;j++)
if(s[i]>s[j]){
t=s[i];
s[i]=s[j];
s[j]=t;
}
b[0]=s[0];
j=0;
for(i=1;i<len;i++){
if(b[j]==s[i])
continue;
else {
j++;
b[j]=s[i];
}
}
j++;
b[j]='\0';
puts(b);
**13-4 使用函數的選擇法排序**
裁判測試程序樣例:
void sort( int a[], int n );
int main()
{
int i, n;
int a[MAXN];
scanf("%d", &n);
for( i=0; i<n; i++ )
scanf("%d", &a[i]);
sort(a, n);
printf("After sorted the array is:");
for( i = 0; i < n; i++ )
printf(" %d", a[i]);
printf("\n");
return 0;
}
代碼如下:
void sort( int a[], int n ){
int index,k,i,t;
for(k=0;k<n-1;k++){
index=k;
for(i=k+1;i<n;i++)
if(a[i]<a[index]) index=i;
t=a[index];
a[index]=a[k];
a[k]=t;
}
}
**14-5 指定位置輸出字符串**
裁判測試程序樣例:
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;
}
代碼如下:
char *match( char s, char ch1, char ch2 ){
char str[MAXS];
char p,q, t;
int i;
p = s;
while(p!=ch1&&p!='\0'){//
p++;
}
q = p;
for(i=0;i<MAXS && *p !='\0' && *p != ch2;i++,p++){
str[i] = p;
}
if(p != '\0'){
str[i] = ch2;
str[++i] = '\0';
}
str[i] = '\0';
printf("%s\n",str);
return q;
}
**15-5建立學生信息鏈表**
裁判測試程序樣例:
include <stdio.h>
include <stdlib.h>
include <string.h>
struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *head, *tail;
void input();
int main()
{
struct stud_node *p;
head = tail = NULL;
input();
for ( p = head; p != NULL; p = p->next )
printf("%d %s %d\n", p->num, p->name, p->score);
return 0;
}
代碼如下:
void input(){
struct stud_node p;
head = (struct stud_node)malloc(sizeof(struct stud_node));
head->next = NULL;
p = head;
while(1)
{
tail = (struct stud_node*)malloc(sizeof(struct stud_node));
scanf("%d", &tail->num);
if (!tail->num) break;
scanf("%s%d", tail->name, &tail->score);
p->next = tail;
p=tail;
}
head = head->next;
}
#遇到的問題,解決方法和心得體會
指針的難度讓我明顯感受到這五次作業的難度,對指針還是要多加練習,要學會靈活運用getchar()解除緩沖區,利用gets(),puts()輸入輸出函數。