一.實驗題目,設計思路,實現方法。
題目一:11-7 找鞍點 一個矩陣元素的“鞍點”是指該位置上的元素值在該行上最大、在該列上最小。 本題要求編寫程序,求一個給定的n階方陣的鞍點。 輸入格式:輸入第一行給出一個正整數n(1)。隨后n行,每行給出n個整數,其間以空格分隔。 輸出格式:輸出在一行中按照“行下標 列下標”(下標從0開始)的格式輸出鞍點的位置。如果鞍點不存在,則輸出“NONE”。題目保證給出的矩陣至多存在一個鞍點。
|
設計思路:1.先定義一個二維數組將數據讀入。
2.用雙重for循環對矩陣中的每個整數進行判斷。
3.再用if語句判斷該整數是否是行最大,列最小,並記錄判斷結果。
4.若判斷結果都符合,跳出循環並返回下標。
題目二:12-6 字符串轉換成十進制整數 輸入一個以#結束的字符串,本題要求濾去所有的非十六進制字符(不分大小寫),組成一個新的表示十六進制數字的字符串,然后將其轉換為十進制數后輸出。如果在第一個十六進制字符之前存在字符“-”,則代表該數是負數。 輸入格式:輸入在一行中給出一個以#結束的非空字符串。 輸出格式:在一行中輸出轉換后的十進制數。題目保證輸出在長整型范圍內。 |
設計思路:1.先用gets()輸入字符串,再用strlen()判斷字符串長度。
2.判斷符號,用for循環對字符串中的字符進行遍歷,並用if語句判斷第一個字符是“十六進制字符”還是“-”。
3.再次用for循環,將符合條件的“十六進制字符”轉換為整數,並將其保存在一個數組中。
4.用pow()函數逐個將十六進制轉成十進制,並求和。再根據符號的判斷,確定是否加“-”。
題目三:12-6 字符串轉換成十進制整數 本題要求實現一個對數組進行循環右移的簡單函數:一個數組a中存有n(>)個整數,將每個整數循環向右移m(≥)個位置,即將a中的數據由(a0a1⋯an−1)變換為(an−m⋯an−1a0a1⋯an−m−1)(最后m個數循環移至最前面的m個位置)。 函數接口定義: 其中 |
設計思路:1.先定義一個與數組b [ ]用來保存右移后的整數順序。
2.因為右移后的數組下標 j 滿足 j =(i + m)% n 。所以只要將b [ j ]=a [ i ] 就可以將右移后的整數順序賦給數組b。
題目四:14-5 指定位置輸出字符串本題要求實現一個函數,對給定的一個字符串和兩個字符,打印出給定字符串中從與第一個字符匹配的位置開始到與第二個字符匹配的位置之間的所有字符。 函數接口定義: 函數 輸入樣例1: 輸出樣例1: 輸入樣例2: 輸出樣例2: 輸入樣例3: 輸出樣例3: |
設計思路:1.用while(*s!=ch1&&*s!='\0')找到字符串中ch1所在的位置。
2.再用while(*s!=ch2&&*s!='\0')打出ch1到ch2的字符,並用變量 i 記下 *s 所移動了幾個位置。
3.用if判斷跳出循環的*s是否等於ch2又或者‘\0’,並確定是否打印。
4.最后函數返回s=s-i的地址。
題目五:15-2 分類統計各類字符個數本題要求實現一個函數,統計給定字符串中的大寫字母、小寫字母、空格、數字以及其它字符各有多少。 函數接口定義: 其中 的格式輸出。 |
設計思路:1.用while語句判斷是否到達‘\0’,用變量count來記下字符串的長度。
2.再用for (i=0;i<count;i++)控制循環次數。
3.最后用if-else if-else多次判斷來計算字符串中的大寫字母、小寫字母、空格、數字以及其它字符各有多少。
二.源程序
題目一:11-7 找鞍點
#include<stdio.h> int main() { int n; scanf("%d",&n); int i,j,k; int x=1,y=1; int a[6][6]; 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++){ x=1;y=1; for(k=0;k<n;k++){ if(a[i][j]<a[i][k]){ x=0;break; } } if(x==1){ for(k=0;k<n;k++){ if(a[i][j]>a[k][j]){ y=0;break; } } } if(x==1&&y==1){ printf("%d %d",i,j);return 0; } } } printf("NONE"); return 0; }
題目二:12-6 字符串轉換成十進制整數
int main() { char n[100],m[100]; gets(n); int len,i,flag=0; len=strlen(n); for(i=0;i<len;i++){ if(n[i]>='0'&&n[i]<='9'||n[i]>='a'&&n[i]<='f'||n[i]>='A'&&n[i]<='F'){ flag=0;break; } if(n[i]=='-'){ flag=1;break; } } int j=0,sum=0; for(i=0;i<len;i++){ if(n[i]>='0'&&n[i]<='9'){ m[j]=n[i]-'0'; j++; } else if(n[i]>='a'&&n[i]<='f'){ m[j]=n[i]-'a'+10; j++; } else if(n[i]>='A'&&n[i]<='F'){ m[j]=n[i]-'A'+10; j++; } } int h=0; for(i=j-1;i>=0;i--){ sum=sum+m[i]*pow(16,h); h++; } if(sum==0){ printf("0"); return 0; } if(flag==1)printf("-"); printf("%d",sum); return 0; }
題目三:12-6 字符串轉換成十進制整數
int ArrayShift( int a[], int n, int m ){ int i,j; int b[n]; for(i=0;i<n;i++) { j=(i+m)%n; b[j]=a[i]; } for(i=0;i<n;i++){ a[i]=b[i]; } return a[n]; }
題目四:14-5 指定位置輸出字符串
char *match( char *s, char ch1, char ch2 ) { int i=0; while(*s!=ch1&&*s!='\0')s++; while(*s!=ch2&&*s!='\0'){ printf("%c",*s); s++;i++; } if(*s==ch2)printf("%c\n",*s); else printf("\n"); s=s-i; return s; }
題目五:15-2 分類統計各類字符個數
void StringCount( char *s ) { int d,x,k,c,q; d=x=k=c=q=0; int count=0; int i; while(*(s+count)!='\0'){ count++; } for (i=0;i<count;i++){ if(s[i]<='Z'&&s[i]>='A')d++; else if(s[i]<='z'&&s[i]>='a')x++; else if(s[i]==' ')k++; else if(s[i]<='9'&&s[i]>='0')c++; else q++; } printf("%d %d %d %d %d",d,x,k,c,q); }
三.遇到的問題及解決方法,心得體會
1.編程首先要看清題目的要求,就比如:14-5 指定位置輸出字符串 這題中的函數返回的是ch1地址,而我返回ch2地址就錯了,經過老師在群里提醒才發現了問題所在。
2.要理解數組和指針之間的關系及其應用。
3.要注重算法的精簡和效率。