第3次做業

做業要求一

請將pta做業編程題目的解題思路和調試過程記錄在博客中,每道題目的具體格式以下:node

題目6-1 輸出月份英文名c++

1.設計思路git

     (1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),如:
         第一步:定義月份對應的指針數組與整形變量i
         第二步:用for循環遍歷數組
         第三步:if條件語句用來判斷不一樣條件下的返回值並輸出    算法

    (2)流程圖編程

2.實驗代碼數組

char *getmonth( int n )
{
char *month[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
int i=0;
for(i=0;i<13;i++)
{
    if(i==0)
    {
        continue;
    }else if(n==i)
    {
        return *(month+i-1);
    }
}
if(n>=13||n<=0)
{
    return NULL;
}
} 

3.本題調試過程碰到問題及解決辦法函數

      錯誤信息:
       錯誤緣由:n=i時的返回值取地址錯誤
       改正方法:改成*(month+i-1)便可,爲第n-1行首元素的地址學習

 

 

6-2 查找星期spa

1.設計思路
     (1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
         第一步:定義整形變量 i 和星期對應的指針數組
         第二步:利用for循環遍歷數組
         第三步:用if語句與strcmp函數進行分類討論,當查找到相應元素時返回整形變量值.net

2.實驗代碼

int getindex( char *s )
{
    int i;  
    char *week[7]= { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };  
    for (i = 0; i < 7; i++)  
    {  
        if (strcmp(s, week[i]) == 0) 
        {
          break;
        }
    }  
    if (i==7) 
    {
        i = -1;
    } 
    return i;  
}

3.本題調試過程碰到問題及解決辦法

      錯誤信息:
       錯誤緣由:輸入函數接口定義時在後方加了多餘的分號" ; "
       改正方法:經過dev-c++提醒找出,低級錯誤


  

 

6-3 計算最長的字符串長度

1.設計思路
     (1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
         第一步:定義兩個整形變量 i,l
         第二步:用for循環遍歷數組
         第三步:if語句中調用strlen函數進行計算並比較,最後返回 l 值

2.實驗代碼

int max_len( char *s[], int n )
{
  int i,l=0;
  for(i=0;i<n;i++)
  {
    if(l<strlen(*(s+i)))
    {
      l=strlen(*(s+i));
    }
  }
  return l;
}

3.本題調試過程碰到問題及解決辦法

      錯誤信息:無


 

 

6-4 指定位置輸出字符串

1.設計思路
     (1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
         第一步:定義整形變量i,j,經過一個for循環將ch1的值賦給*(s+i)
         第二步:設計一個指針變量,判斷*(s+j)!的值

         第三步:總體遍歷後,輸出並返回(s+i)的值

2.實驗代碼

char *match( char *s, char ch1, char ch2 ){
    int i,j;
    for(i=0;*(s+i)!='\0';i++)
    {
        if(*(s+i)==ch1)
        {
          char *a=  &s[i];
            for(j=i;(*(s+j)!=ch2)&&(*(s+j)!='\0');j++)
            {
                printf("%c",*(s+j));
            }
            if(*(s+j)!='\0')
            printf("%c",*(s+j));
            printf("\n");
            return a;
        }
    }
    printf("\n");
    return s+i;
}

3.本題調試過程碰到問題及解決辦法

      錯誤信息:
       錯誤緣由:函數接口定義編寫錯誤,致使代碼沒法正常編譯
       改正方法:改變思路並改正定義,用一個for循環和if語句進行遍歷和輸出

 

 

2)一道編程題:

有一個axb的數組,該數組裏面順序存放了從1到a*b的數字。其中a是你大學號的前三位數字,b是你大學號的後四位數字,好比你的學號是2017023936,那麼數組大小是201 x 3936,數組中順序存放了1到791136(201和3936的積)的整數. 要求用篩選法,把該數組裏的質數找出並打印出來,打印格式爲5個質數一行,數字間用空格隔開。

篩選法具體作法是:先把N個天然數按次序排列起來。1不是質數,也不是合數,要劃去。第二個數2是質數留下來,而把2後面全部能被2整除的數都劃去。2後面第一個沒劃去的數是3,把3留下,再把3後面全部能被3整除的數都劃去。3後面第一個沒劃去的數是5,把5留下,再把5後面全部能被5整除的數都劃去。這樣一直作下去,就會把不超過N的所有合數都篩掉,留下的就是不超過N的所有質數。

#include <stdio.h>
int main ()
{
    int a=201,b=3947;
    int *p = (int *)malloc((a*b) *sizeof(int));
    int *q = (int *)malloc((a*b) *sizeof(int)); 
    int i=0,j;
   for(i=0;i<(a*b);i++)
  {
     p[i] = i+1;
    }
    for(i=0;i<(a*b);i++)
 {
    for(j = i+1;j<=(a*b);j++) 
    {
        if((p[i] !=1) && ( p[j] != 1) ){
            if(p[j]%p[i] ==0) 
            {
                    p[j] = 1;
                }
            }
        }
    }
    j=0;
    for(i=0;i<(a*b);i++) 
    {
        if(p[i] != 1)
             {
            printf(" %d",p[i]);
            j++;
        } 
        if(j == 5)
         {
            printf("\n");
            j=0;
        }
    }
}

 

 

6-1 奇數值結點鏈表

1.設計思路
     (1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
         第一步:定義整形變量n,在readlist函數中,將輸入的值存儲在鏈表裏,在while循環內對p進行動態分配內存,最後返回鏈表的頭結點。
         第二步:在getodd函數中,根據題目要求的條件對鏈表結點中date的值進行分類判斷。
         第三步:需考慮若最後新建鏈表有可能爲空的狀況,最後按照要求返回要求鏈表的頭結點。

    (2)流程圖

2.實驗代碼

struct ListNode *readlist() {
    int n;
    struct ListNode *p = NULL,*head = NULL,*tail = NULL;
    scanf("%d",&n);
    while(n!=-1 && n>0 ) 
    {
        p = (struct ListNode*)malloc(sizeof(struct ListNode));
        p->data = n;
        if(head == NULL) 
        {
            head = p;
        } else 
        {
            tail->next = p;
        }
        tail = p;
        scanf("%d",&n); 
    }
    if(head == NULL) 
    {
        return NULL;
    } 
    tail->next = NULL;
    return head;
}
struct ListNode *getodd( struct ListNode **L ) 
{
  struct ListNode *p = *L,*head1 = NULL,*r = NULL,*L1 = NULL,*r1 = NULL;
  while(p!=NULL&&p->data>0) 
  {
    if(p->data%2!=0) 
    {
        if(head1 == NULL)
        {
            head1 = p;
        } else 
        {
            r->next = p;
        }
        r = p;
    } else 
    {
        if(L1 ==NULL)
        {
            L1 = p;
        } else
        {
            r1->next = p;
        }
        r1 = p;
    }
    p = p->next;
  }
  if(head1==NULL)
  {
    return NULL;
  } else 
  {
    r->next = NULL;
  }
  if(L1==NULL) 
  {
    *L = NULL;
  } else
  {
    r1->next = NULL;
   *L = L1; 
  }
    return head1;
}

3.本題調試過程碰到問題及解決辦法

      無。

 

 

 

6-2 學生成績鏈表處理

1.設計思路
     (1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
         第一步:在createlist函數中將輸入的學號,姓名和分數存儲到鏈表中
         第二步:在deletelist函數中遍歷鏈表的結點,若結點中的分數小於規定的值則釋放此結點的內存,需注意若最終結點全被釋放完內存,即返回的頭結點爲空的狀況
         第三步:將判斷後鏈表的頭結點返回主函數。

2.實驗代碼

struct stud_node *createlist() {
 int num;
 char name[20]; 
 int score;
 struct stud_node *p,*head=NULL,*tail=NULL;

 scanf("%d",&num);
 while (num != 0)
    {
        p = (struct stud_node *)malloc (sizeof (struct stud_node));
        scanf ("%s %d", p->name, &p->score);
        p->num = num;
        
        if (head == NULL)
            head = p;
        else
            tail->next = p;
        tail = p;
        scanf ("%d", &num);
    }
    return head;
}
struct stud_node *deletelist( struct stud_node *head, int min_score ) {
  struct stud_node *L=head,*head1=NULL,*tail1=NULL;
  while(L!=NULL) {
    if(L->score>=min_score)
  {
    if(head1==NULL) {
        head1 = L;
       } else {
        tail1->next = L;
       }
       tail1 = L;
  } 
   L=L->next;
  }
  if(head1==NULL) {
    return NULL; 
  } else {
    tail1->next =NULL;
  }
  return head1;
} 

3.本題調試過程碰到問題及解決辦法

      錯誤信息:
       錯誤緣由:定義時未定義score而定義了兩次num,低級錯誤
       改正方法:從新定義整形變量score

 

 

6-3 鏈表拼接

1.設計思路
     (1)主要描述題目算法。能夠用文字描述(不容許使用僞代碼),
         第一步:
         第二步:
          ......

2.實驗代碼

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
   struct ListNode *p1=list1;
     int length=0;
     int array[100];
     for(p1=list1;p1!=NULL;p1=p1->next)
     {
        array[length] = p1->data;
         length++;
     } 
     p1=list2;
     for(;p1!=NULL;p1=p1->next) 
     {
        array[length] = p1->data;
         length++;
     } 
     int i,j,t;
     for(i=0;i<length-1;i++)
     {
        for(j=i+1;j<length;j++)
        {
            if(array[j]<array[i]) 
            {
              t =array[j];
              array[j]=array[i];
              array[i] = t;
             }
         }
     }
     struct ListNode *q,*head1 = NULL,*tail1=NULL;
     i=0;
     while(i<length)
     {
        q = (struct ListNode *)malloc(sizeof(struct ListNode));
        q->data = array[i];
         if(head1 == NULL)
         {
            head1 = q;
        } else 
        {
            tail1->next = q;
        }
         tail1 = q; 
         tail1->next = NULL;
       i++;
  }
     return head1;
}  

3.本題調試過程碰到問題及解決辦法

      錯誤信息1:
       錯誤緣由:結尾tail1 = q與tail1->next = NULL的順序錯誤
      錯誤信息2:
       錯誤緣由:最後缺乏i++進行循環
       改正方法:

 

 

要求3、學習總結和進度

一、總結兩週裏所學的知識點,回答下列問題?

     (1)如何理解指針數組,它與指針、數組有何關係?爲什麼能夠用二級指針對指針數組進行操做?

              數組的各個元素都是指針類型,用於存放內存地址,那麼這個數組就是指針數組。二級指針通常定義爲「類型名 **變量名」,取得兩次地址便可以對指針數組進行操做。

     (2)將C高級第三次PTA做業(1)任何一個題目改成使用二級指針對指針數組進行操做。

     (3)用指針數組處理多個字符串有何優點?能夠直接輸入多個字符串給未初始化的指針數組嗎?爲何?

              節省空間,可自由決定數組長度。不能夠,未初始化會將指針存入一個不肯定的地址,破壞系統正常工做。

二、將PTA做業的源代碼使用git提交到託管平臺上,要求給出上傳成功截圖和你的git地址。

個人git地址:https://git.coding.net/Downager/180422.git

三、點評3個同窗的本週做業(在做業中給出被點評同窗博客的連接),並邀請3名同窗點評你的做業,無點評做業(你的做業未被3人點評)/或者沒有回覆同窗或老師的點評都倒扣該題分數。

        孫銘婧:www.cnblogs.com/sun031915/

        吳曉明:http://www.cnblogs.com/gu-an-cheng-wxm/

        王姝雯:http://www.cnblogs.com/phsudie/

四、請用表格和折線圖呈現你本週(4/9 8:00~4/23 8:00)的代碼行數和所用時間、博客字數和所用時間。

相關文章
相關標籤/搜索