1. 程式人生 > >C語言第二次實驗報告

C語言第二次實驗報告

指定位置 null 無法 解決方案 報告 組成 inf ima 指針

PTA實驗作業

題目一:11-7 找鞍點

一個矩陣元素的“鞍點”是指該位置上的元素值在該行上最大、在該列上最小。
本題要求編寫程序,求一個給定的n階方陣的鞍點。

1、設計思路

  • 第一步:定義二維數組
  • 第二步:判斷用戶給定矩陣大小
  • 第三步:找行最大值
  • 第四步:判斷行最大值是否為列最小值
  • 第五步:輸出結果

實驗代碼

int a[6][6];
    int n;  
    scanf("%d",&n);  
    int i,j;  
    for(i=0; i<n; i++)  
        for(j=0; j<n; j++)  
        {  
            scanf("%d",&a[i][j]);  
        }  
    int k=0,y=0,flag=1,p=0;  
    if(n==1)  
        printf("0 0");//只有一個點時,一定是鞍點  
    else  
    {  
        for(i=0; i<n; i++)  
        {  
            y=i;  
            for(p=0; p<n; p++) //找行最大值  
            {  
                if(a[i][k]<=a[i][p])//數組元素之間比較,若比a[i][k]大,則將數組列標賦給k  
                {  
                    k=p;  
                }  
            }  
            for(j=0; j<n; j++)//判斷是否為列最小值  
            {  
                if(a[y][k]>a[j][k])
                {  
                    y=j;  
                    break;  
                }  
            }  
            if(i==y)
            {  
                flag=0;  
                break;  
            }  
        }  
        if(flag==0)  
            printf("%d %d",i,k);  
        else printf("NONE");  
    } 

3·遇到的問題及解決方法:

  • 答案錯誤:當最後一個點為鞍點時,測試不通過
    解決方法:定義y變量觀察行最大值是否為列最小值
  • 答案錯誤:沒有考慮到僅有一個點時,該點即為鞍點
    解決方法:if(n==1) printf("0 0");
    技術分享圖片

題目二:12-6 字符串轉換成十進制整數

輸入一個以#結束的字符串,本題要求濾去所有的非十六進制字符(不分大小寫),組成一個新的表示十六進制數字的字符串,然後將其轉換為十進制數後輸出。如果在第一個十六進制字符之前存在字符“-”,則代表該數是負數。

1、設計思路

  • 第一步:定義字符數組並讀入
  • 第二步:判斷各字符是否為16進制
  • 第三步:進行16進制數的計算
  • 第四步:判斷有無負號
  • 第五步:輸出答案

    2、實驗代碼:

    int a[80]={0};  
    char c[80];   
    gets(c);  
    int m,i,j;  
    int n=1, k;  
    long int sum;
    m=strlen(c);  
    j=0;  
    for(i=0;i<m;i++)  
    {  
        if(c[i]>=‘0‘&&c[i]<=‘9‘)  
        {  
            a[j]=c[i]-48;  
            j++;  
        }  
        if((c[i]>=‘a‘&&c[i]<=‘f‘)||(c[i]>=‘A‘&&c[i]<=‘F‘))  
        {         
            if(c[i]==‘a‘||c[i]==‘A‘)  
                a[j]=10;  
            else if(c[i]==‘b‘||c[i]==‘B‘)  
                a[j]=11;  
            else if(c[i]==‘c‘||c[i]==‘C‘)  
                a[j]=12;  
            else if(c[i]==‘d‘||c[i]==‘D‘)  
                a[j]=13;  
            else if(c[i]==‘e‘||c[i]==‘E‘)  
                a[j]=14;  
            else   
                a[j]=15;  
            j++;  
        }  
        if(c[i]==‘-‘&&j==0)  
            n=0;  
    }    
    sum=k=0;  
    for(i=j-1;i>=0;i--)  
    {  
        sum=sum+a[i]*(long int)pow(16,k);  
        k++;  
    }  
    if(sum==0)  
        printf("0\n");  
    else  
    {  
    if(n==0)  
        printf("-%ld\n",sum);  
    else  
        printf("%ld\n",sum);  
    }  

    3、遇到的問題及解決方法:

  • 編譯錯誤:long 的輸出格式錯誤
    解決方法:printf("%ld\n",sum);
  • 部分正確:-0時仍輸出負號
    解決方法:if(sum==0) printf("0\n");
    技術分享圖片

題目三:14-5 指定位置輸出字符串(函數題)

本題要求實現一個函數,對給定的一個字符串和兩個字符,打印出給定字符串中從與第一個字符匹配的位置開始到與第二個字符匹配的位置之間的所有字符。

1、設計思路

  • 第一步:找到第一個目標字符,並記錄地址
  • 第二步:逐個輸出兩個字符間的字符
  • 第三步:找到第二個字符輸出並跳出字符串

    2、實驗代碼

    char *match( char *s, char ch1, char ch2 ){
    int i=0,j=0,k;
    char *p=NULL,*q=s;
      while(q[i++])
    ;
    i--;
    for(j=0;j<i;j++){
        if(s[j]==ch1){
            p=&s[j];
            for(k=j;k<i;k++){
                if(s[k]!=ch2){  
                    printf("%c", s[k]);  
                }
                if(s[k]==ch2){
                    printf("%c\n", s[k]); 
                    return p;   
                  }
              }
              printf("\n");
              return p;
          }
      }
      printf("\n");
      return q+i;
    } 

    3、遇到的問題及解決方法:

  • 段錯誤:數組越界
    解決方法:定義數組指針,指向字符串s
  • 答案錯誤:ch1找不到, ch2找到 時無法通過
    解決方法:定義*q指向s ,最後返回 q+s
    技術分享圖片

題目四、通訊錄的錄入與顯示

通訊錄中的一條記錄包含下述基本信息:朋友的姓名、出生日期、性別、固定電話號碼、移動電話號碼。 本題要求編寫程序,錄入N條記錄,並且根據要求顯示任意某條記錄。

1、設計思路

  • 第一步:定義結構變量
  • 第二步:用戶輸入通訊錄信息
  • 第三步:讀入查詢個數和編號
  • 第四步:輸出查詢結果

    2、實驗代碼

    struct list{
    char numbe[20];
    char phone[25];
    char name[15];
    char sex[2];
    char bri[15];
    }f[10];
    int main(){
    int i,j,k,n,number;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%s %s %c %s %s\n",&f[i].name,&f[i].bri,&f[i].sex,&f[i].numbe,&f[i].phone);
    }
    scanf("%d",&k);
    for(i=0;i<k;i++){
        scanf("%d",&number);
        if(number>=0&&number<n){
            printf("%s %s %s %s %s\n",f[number].name,f[number].numbe,f[number].phone,f[number].sex,f[number].bri);
        }else{
            printf("Not Found\n");
        }
    }

    3、遇到的問題及解決方法

  • 段錯誤:電話號碼輸出越界
    解決方法:將電話號碼改為字符數組
  • 答案錯誤:將結構變量名定義為 friend(友元函數)
    解決方案:更改變量名為 list
    技術分享圖片

題目五:15-8 十進制轉換二進制(函數題)

本題要求實現一個函數,將正整數n轉換為二進制後輸出。

1、設計思路

  • 第一步:定義變量判斷實參是否為0
  • 第二步:判斷形參不等0時調用自身
  • 第三步:循環調用本函數
  • 第四步:當n為0時開逐級返回函數

    2、實驗代碼

    void dectobin( int n ){
      int a=n/2;
      static int count=0;
      int out=n%2;
      if(!n&&!count){
    printf("0");
    return ;
      }else{
    if(!n){
      return ;
    }
    count++;
    dectobin(a);
    printf("%d",out);
      }
    }

    3、遇到的問題及解決方法

  • 答案錯誤:沒有判斷是否一開始的形參為0
    解決方法:設置觀察量count
    技術分享圖片

心得體會

  • 使用數組時應註意數組範圍
  • 定義變量時應考慮其本身是否為C語言的關鍵字
  • 不懂就問,獨學而無友,則孤陋而寡聞

C語言第二次實驗報告