C語言--第三次作業


要求一 、
1)C高級第三次PTA作業(1)

題目6-1
1.設計思路
     (1)主要描述題目算法
         第一步:將月份分別賦值;
         第二步:利用switch語句,輸入月份;
         第三步:返回變量的地址值。
      (2)流程圖
     

2.實驗代碼

char *getmonth(int n)
{
  switch(n)
  {
    case 1:return"January";
    case 2:return"February";
    case 3:return"March";
    case 4:return"April"; 
    case 5:return"May"; 
    case 6:return"June"; 
    case 7:return"July";  
    case 8:return"August";  
    case 9:return"September";  
    case 10:return"October";  
    case 11:return"November";  
    case 12:return"December";  
    default:return NULL;
  }
}

3.本題調試過程碰到問題及解決辦法
 
      錯誤信息1:

       錯誤原因:月份英文打錯。
題目6-2
1.設計思路
     (1)主要描述題目算法
         第一步:將星期分別賦值給一堆數組指針,賦初值為-1;
         第二步:用strmcp函數比較數組中每行元素與輸入的字符串是否相同,相同則等於開始定義的函數;
         第三步:返回變量值。
   2.實驗代碼

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

3.本題調試過程碰到問題及解決辦法
 
      錯誤信息:

       錯誤原因:賦初值時,令a=1了,以至於錯誤。
改正方法:將a=-1。
       
題目6-3
1.設計思路
     (1)主要描述題目算法
         第一步:定義數組,用strlen函數計算每行元素長度;
         第二步:利用for循環和if語句,比較大小,當定義元素長度大於max,交換;
         第三步:返回max的值。
   
2.實驗代碼

int max_len( char *s[], int n ){
	int i,count=0,j,q[20]={0};
	for(i=0;i<n;i++){
		for(j=0;*(*(s+i)+j)!='\0';j++){
		}
		q[i]=j;
	}
	count=q[0];
	for(i=0;i<n;i++){
		if(q[i]>count){
			count=q[i];
		}
	}
	return count;
} 

3.本題調試過程碰到問題及解決辦法
 
      錯誤信息:

       錯誤原因: 應令count=q[0];,但直接寫成 count=q[i];使交換進行不了,編譯錯誤。
題目6-4
1.設計思路
     (1)主要描述題目算法
         第一步:定義s字符數組,定義s=ch1時的下表,並賦給一個整型變量;
         第二步:用for循環和if語句,將s[i]賦給指針字符j,愛循環中,若s[i]!=ch2.輸出s[i],否則。s[i]加一,換行回到 j;
         第三步:輸出換行,返回 j。
   
2.實驗代碼

char *match( char *s, char ch1, char ch2 ){
	int i,j;
	char *q=NULL;
	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.本題調試過程碰到問題及解決辦法
 
      錯誤信息1:

       錯誤原因:當if((s+i)==ch1)循環時,弄成了if((s+i)ch2)。
       改正方法: if(*(s+i)
ch1),並且,應逐次增加j的大小確定ch1到ch2之間的字符。
題目 編程題
1.設計思路
     (1)主要描述題目算法
         第一步:定義a,b組成的數組大小;
         第二步:利用for循環和if語句,慢慢划掉能被2整除的數和3后面所有能被3整除的數。。這樣一直做下去,就會把不超過N的全部合數都篩掉,留下的就是不超過N的全部質數;
 
2.實驗代碼

#include <stdio.h>
int main ()
{
    int a=201,b=3945;
    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;
        }
    }
}

2)C高級第三次PTA作業(2)  

題目6-1
1.設計思路
     (1)主要描述題目算法
         第一步:在readlist函數中,將輸入的值存儲在鏈表里,用while循環時條件,在while循環內進行動態分配;
         第二步:在getodd函數中,對鏈表結點中date的值進行判斷,將奇數偶數date分別存儲在一個新的鏈表中;
         第三步:返回鏈表的頭結點。
      (2)流程圖
       

2.實驗代碼

struct ListNode *readlist() {
    int number;
    struct ListNode *p = NULL,*head = NULL,*tail = NULL;
    scanf("%d",&number);
    while(number!=-1&&number>0 ) {
        p = (struct ListNode*)malloc(sizeof(struct ListNode));
        p->data = number;
        if(head == NULL) {
            head = p;
        } else {
            tail->next = p;
        }
        tail = p;
        scanf("%d",&number); 
    }
    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.本題調試過程碰到問題及解決辦法
 
      錯誤信息1:

       錯誤原因: r1->next = p,時直接用了 r->next = p;
       
題目6-2
1.設計思路
     (1)主要描述題目算法
         第一步:在createlist函數中將輸入的學號,姓名和分數存儲到鏈表中,用while循環,返回鏈表的頭結點;
         第二步:在deletelist函數中定義鏈表的結點,若結點中的分數小於規定的值,釋放此結點的內存;
         第三部:返回主函數。
      (2)流程圖(4分)

2.實驗代碼

struct stud_node *createlist() {
 int num,score;
 char name[20]; 
 struct stud_node *p,*head=NULL,*tail=NULL;
 p = (struct stud_node*)malloc(sizeof(struct stud_node));
 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;
  } else {
    free(L);
   }
   L=L->next;
  }
  if(head1==NULL) {
    return NULL; 
  } else {
    tail1->next =NULL;
  }
  return head1;
} 

3.本題調試過程碰到問題及解決辦法
 
      錯誤信息:

       錯誤原因:while (num != 0),忽略了學號不能等於0的情況,因當學號為0時不需要輸入姓名及分數,代表結束。
       
題目6-3
1.設計思路
     (1)主要描述題目算法
         第一步:在ListNode *list1中儲存字符的內存大小;
         第二步:ListNode *list2中儲存字符的內存大小;
         第三步:用for循環和if語句交換,用ListNode函數合並兩個列表。
第四步:返回。
 
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.本題調試過程碰到問題及解決辦法
 
      錯誤信息:

       錯誤原因: struct ListNode q,head1 = NULL,*tail1=NULL; i=0;時,令i=1了,以至於錯誤;
改正方法:將i=0.
  

要求三、學習總結和進度
1、總結兩周里所學的知識點,回答下列問題?
     (1)如何理解指針數組,它與指針、數組有何關系?為何可以用二級指針對指針數組進行操作?

答:數組元素全為指針的數組稱為指針數組。指針數組是一個數組,並且數組元素都為指針。二級指針是指一個指針指向的是另外一個指針,可以儲存指針。

(2)將C高級第三次PTA作業(1)任何一個題目改為使用二級指針對指針數組進行操作。
6-2 查找星期

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

(3)用指針數組處理多個字符串有何優勢?可以直接輸入多個字符串給未初始化的指針數組嗎?為什么?
答:節省空間,可自由決定數組長度。不可以,不初始化會使指針存入一個不確定的地址,破壞系統正常工作。

2、Git:https://git.coding.net/GUANCHENG/101.git

3、點評3個同學的本周作業。
張心悅:http://www.cnblogs.com/zxy980612/p/8858885.html
孫銘婧:http://www.cnblogs.com/sun031915/p/8836088.html
王姝雯:http://www.cnblogs.com/phsudie/p/8759331.html
4、請用表格和折線圖呈現你本周(4/9 8:00~4/23 8:00)的代碼行數和所用時間、博客字數和所用時間。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM