作業要求一
6-1 輸出月份英文名
6-2 查找星期
6-3 計算最長的字符串長度
6-4指定位置輸出字符串
6-5奇數值結點鏈表
6-6學生成績鏈表處理
6-7鏈表拼接
作業要求二
- 題目6-1輸出月份英文名
1、設計思路
(1)第一步:根據題目要求,由給定的數字來返回月份,首先要定義一個字符數組來包含各個月份的英文名。(注意各個月份的英文名一定要輸入正確,最好是復制粘貼)
第二步:定義完字符數組之后,便可以通過遍歷的方法來找出所對應的月份(因為傳入的是整型的,便可利用其與同為整型的循環變量進行比較判斷,同時要注意循環變量為0的時候,此時應該輸出沒有相應的月份)
第三步:在根據題目的要求上說的不是1-12的數字之外的輸出“wrong input!”,便通過“if”條件語句進行判斷來限制這個條件;
2、實驗代碼
#include <stdio.h>
char *getmonth( int n )
{
char *month[13]={"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、本題調試過程碰到問題及解決辦法
錯誤信息1:本題本來是沒有問題的,但是在提交的過程中總是有一個點過不了,從我的PTA的提交情況也可查看
改正方法:這個錯誤非常的隱蔽,我當時因為這個問題花費了整整兩節課的時間,也請教了不少的同學,但是都說我的代碼沒有問題,都非常的不解,最后通過對比我的英文單詞才發現我的二月寫錯了,之后便改正成功了,非常的尷尬。
-
題目6-2查找星期
1、設計思路
(1)第一步:根據題目要求,本題和第一個題很相似,可類比上一題進行推理,首先還是要定義一個字符數組;(注意各個單詞拼寫)
第二步:之后開始遍歷數組進行查找,根據題目的要求返回的是一個整型元素,而在編寫的函數里定義的數組是字符類型的,便可通過同為整型的循環變量來解決這個問題,即當查找到相對應的星期之后,便返回所對應的循環變量即可;
(2)流程圖:
2、實驗代碼:
#include <stdio.h>
#include <string.h>
#define MAXS 80
int getindex( char *s )
{
char *a[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int i=0,result=-1;
for(i=0;i<7;i++)
{
if(strcmp(s,a[i])==0)
{
result=i;
}
}
return result;
}
3、本題調試過程碰到問題及解決辦法
錯誤信息1:本題我的錯誤在我定義了一個用來返回的變量,因為我的一些習慣性操作,把這個變量一開始賦初始值為0,而在題目的要求是要求但返回值為-1是為NULL,所以我當時這個問題出現了錯誤;
改正方法:這個問題很好的解決,我就是把我所定義的變量賦初始值為-1即可解決;
- 題目6-3計算最長的字符串長度
1、設計思路
(1)第一步:本題要計算字符串的最長的長度,便可想到在字符串里有個計算字符串長度的函數strlen,可通過此函數進行比較;
第二步:根據此原理,通過遍歷所給的字符串數組,通過if條件判斷的方式進行逐一的比較判斷,即可找出最長的字符串長度;
2、實驗代碼
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 10
#define MAXS 20
int max_len( char *s[], int n )
{
int max=0,j=0,len=0;
for(j=0;*(s+j)!='\0';j++)
{
len=strlen(*(s+j));
if(max<len)
{
max=len;
}
}
return max;
}
3、本題調試過程碰到問題及解決辦法
本題在調試過程中沒有遇到問題;
- 題目6-4指定位置輸出字符串
1、設計思路:
(1)第一步:根據題意,要先查找輸出指定的字符串,首先要定義循環變量,通過遍歷來進行查找;
第二步:在查找之前需要定義一個指針,用它來指向所傳入的所讓輸入的數組的首地址,之后根據傳入的字符進行判斷,如果在遍歷過程中和第一個傳入的字符相同便把它賦給指針,之后再次前提下再次進行遍歷,找出在此字符數組中和第二個字符相同的字符;並進行輸出;
第三步:最后需要判斷一種只有第二個字符,而沒有第一個字符的情況,故需加上若原字符數組為空,並返回元字符數組的首地址;
2、實驗代碼
char *match( char *s, char ch1, char ch2 )
{
int i=0,j=0;
char *p=NULL;
for(i=0;*(s+i)!='\0';i++)
{
if(s[i]==ch1)
{
p=&s[i];
for(j=i;*(s+j)!='\0';j++)
{
if(s[j]!=ch2)
{
printf("%c", s[j]);
}
if(s[j]==ch2)
{
printf("%c\n", s[j]);
return p;
}
}
printf("\n");
return p;
}
}
if(s[i] == '\0')
p = &s[i];
printf("\n");
return p;
}
3、本題調試過程碰到問題及解決辦法
錯誤信息1: 本題在調試過程中,此題並不是太懂,至今也是不是很懂,起初寫完之后,提交過程總是顯示着部分正確,其中就是那個若傳入的第一個字符沒有,而給的第二個字符有的情況,當時我沒有加程序的最后幾段程序,也不知道到底哪里出現錯誤,感覺輸出的沒有問題;
改正方法:后來請教同學,才知道,我以前那個在測試上述的情況時不加那幾行代碼會少一行空格,加上后便可以正常輸出;
- 一道編程題
1、設計思路:
第一步:首先根據題目要求要定義兩個變量,來儲存自己所輸入的值,之后,由於所計算的值很大,需要進行動態分配空間;
第二步:分配完空間之后,在定義一個數組,通過遍歷的方式進行挨個賦值;
第三步:之后再按照題目所說的要求進行查找判斷出所要找的數值;
第四步:最后通過遍歷進行輸出;
2、實驗代碼:
#include<stdio.h>
int main()
{
int m=0,n=0,i=0,j=0,flag=0;
scanf("%d %d",&m,&n);
flag=m*n;
int *p = (int *)malloc((m*n) *sizeof(int));
int *q = (int *)malloc((m*n) *sizeof(int));
for(i=0;i<flag;i++)
{
p[i] = i+1;
}
for(i=0;i<flag;i++) {
for(j = i+1;j<=flag;j++) {
if(p[i] !=1&&p[j] != 1) {
if(p[j]%p[i] ==0) {
p[j] = 1;
}
}
}
}
j=0;
for(i=0;i<flag;i++) {
if(p[i] != 1) {
printf(" %d",p[i]);
j++;
}
if(j == 5) {
printf("\n");
j=0;
}
}
}
3、本題在調試過程中遇到的問題
錯誤信息1:本題在調試過程中遇到的問題是由於所儲存的元素很大,而系統分配的不合理,在運行的時候總是出現系統崩潰的現象,寫的程序總是運行不出來;
改正方法:在出現這個問題之后,想到老師上課講的內存的問題,但是自己也只能知道問題出現在哪里,但不知道怎么去改正,后來請教同學之后怎么去進行動態分配;
- 題目6-5 奇數值結點鏈表
1、設計思路
第一步:本題需要兩個函數,第一個函數是進行鏈表的輸入,在輸入時,首先需要進行定義所需的結構體變量,之后在定義結構體中所需要的各個變量;之后再進行輸入操作,通過while判斷,進行給鏈表的單向賦值,在賦值時,還需要進行動態分配內存的操作,最后返回頭指針;
第二步:本題的第二個函數就是進行奇數與偶數的分離,大體上是通過兩個鏈表進行分離。
第三步:通過while判斷所傳入的鏈表中的data是否能被2所整除,來進行奇偶的分離;最后返回頭指針;
2、實驗代碼
struct ListNode *readlist()
{
struct ListNode *p=NULL,*tail=NULL,*head=NULL;
int data=0,count=0;
p=tail=(struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&data);
while(data!=-1)
{
p->data=data;
p->next=NULL;
count++;
if(count==1)
{
head=p;
}else
{
tail->next=p;
tail=p;
}
p=(struct ListNode*)malloc(sizeof(struct ListNode));
scanf("%d",&data);
}
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *i=NULL,*head1=NULL,*head2=NULL,*m=NULL,*n=NULL;
i=*L;
head1=(struct ListNode*)malloc(sizeof(struct ListNode));
head2=(struct ListNode*)malloc(sizeof(struct ListNode));
head1->next=NULL;
head2->next=NULL;
m=head1;
n=head2;
while(i)
{
if(i->data%2!=0)
{
m->next=i;
m=i;
}else
{
n->next=i;
n=i;
}
i=i->next;
}
m->next=NULL;
n->next=NULL;
*L=head2->next;
return head1->next;
}
3、本題調試過程碰到問題及解決辦法
錯誤信息1:本題在調試的過程中,由於當時是還沒有學習相應的鏈表的各種插入、刪除等等的操作,再加上在當時上完課之后,對鏈表了解的不深刻,自己也就只能寫出鏈表的輸入;對題目中要求的奇數和偶數的操作自己是幾乎不會;
改正方法:自己去網上查了下有關鏈表的內容,自己再試了試,感覺可以通過定義兩個鏈表進行操作;
- 題目6-6 學生成績鏈表處理
1、設計思路:
第一步:首先要定義一個進行賦值的函數,此函數和普通的賦值區別不大,都是一般的先定義結構體變量,之后再進行輸入賦值,並返回頭指針;
第二步:在定義第二個函數中,根據題目要求,我有兩種思路,第一種思路是在定義一個結構體變量,通過遍歷查找出所需要的元素並將其傳給所定義的變量中去;第二種思路是根據老師上課講的刪除,通過遍歷查找出不符合要求的進行刪除;此題我應用的是第一種方法,通過遍歷找出所需的變量,並返回;
2、實驗代碼:
struct stud_node *createlist()
{
struct stud_node *tail=NULL,*head=NULL,*p=NULL;
int num=0,score=0;
char name[20];
scanf("%d",&num);
while(num!=0)
{
p=(struct stud_node*)malloc(sizeof(struct stud_node));
p->num=num;
scanf("%s %d",p->name,&p->score);
if(head==NULL)
{
head=p;
}else
{
tail->next=p;
}
tail=p;
scanf("%d",&num);
p->next=NULL;
}
return head;
}
struct stud_node *deletelist( struct stud_node *head, int min_score )
{
struct stud_node *ptr1=NULL,*ptr2=NULL;
for(;head!=NULL;head=head->next)
{
if(head->score>=min_score)
{
if(ptr1==NULL)
{
ptr1=head;
}else
{
ptr2->next=head;
}
ptr2=head;
}
}
if(ptr1==NULL)
{
return NULL;
}else
{
ptr2->next=NULL;
}
return ptr1;
}
3、本題在調試過程中遇到的問題
錯誤信息1:本題在未上本周最后一節C語言課之前我的想法就是第一種,但當時我只是進行的簡單的定義,用if語句判斷出所需的要求就進行賦值,但其實那是錯誤的,只是錯誤的按照數組的方法進行操作。
改正方法:在上完最后一節課之后,我覺得這個題可以用刪除的方法做,但是模仿做了一點就不太會了,便放棄了這種做法,又重新改為第一種方法,這時我在賦值的時候又重新按照第一個函數進行賦值的操作那樣進行賦值,最后運行成功。
- 題目6-7鏈表拼接
1、設計思路
第一步: 根據題目要求,題目是進行鏈表排序,又因本題定義的結構體中只有一種整數類型,所以我們可以,先定義一個數組,先將鏈表里的數據儲存在數組中,之后再通過數組進行排序操作;
第二步:數組排序完之后,再通過for語句遍歷的進行把數組里的值重新賦給鏈表;
2、實驗代碼
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
int list[100],i=0,j=0,swap=0,count=0;
while(list1!=NULL)
{
list[i]=list1->data;
i++;
list1=list1->next;
count++;
}
while(list2!=NULL)
{
list[i]=list2->data;
i++;
list2=list2->next;
count++;
}
for(i=0;i<count;i++)
{
for(j=i+1;j<count;j++)
{
if(list[i]>list[j])
{
swap=list[i];list[i]=list[j];list[j]=swap;
}
}
}
struct ListNode *p=NULL,*head=NULL,*tail=NULL;
for(i=0;i<count;i++)
{
p=(struct ListNode*)malloc(sizeof(struct ListNode));
p->data=list[i];
p->next=NULL;
if(head==NULL)
{
head=p;
}else
{
tail->next=p;
}
tail=p;
}
return head;
}
3、本題調試過程中遇到的問題
本題沒有問題;
要求三、學習總結和進度
1、總結兩周里所學的知識點,回答下列問題?(用自己的話表達出你的理解,網上復制粘貼沒有分數)
(1)如何理解指針數組,它與指針、數組有何關系?為何可以用二級指針對指針數組進行操作?
指針數組,自我理解是數組里的每個元素都是指針,每個元素都是指向着地址;用二級指針可以對指針數組操作,我認為這是因為他們都指向着相同的地址,都是對地址值進行操作。
(2)將C高級第三次PTA作業(1)任何一個題目改為使用二級指針對指針數組進行操作。
int getindex(char *s)
{
char *a[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
char **p=&a[0];
//char *b='\0';
int i=0,result=-1;
for(i=0;i<7;i++)
{
if(strcmp(s,*(p+i))==0)
{
return i;
}
}
return result;
}
(3)用指針數組處理多個字符串有何優勢?可以直接輸入多個字符串給未初始化的指針數組嗎?為什么?
使用指針數組處理多個字符串計較節省空間,因為每個字符串是單獨存放的,不要求每個字符串占用同樣的字節數,從而節省空間;不可以,未初始化數組,指針的指向的地址不確定,所以會出現一些錯誤;
2、將PTA作業的源代碼使用git提交到托管平台上,要求給出上傳成功截圖和你的git地址。
git地址:
地址
上傳截圖:
3、點評3個同學的本周作業(在作業中給出被點評同學博客的鏈接),並邀請3名同學點評你的作業,無點評作業(你的作業未被3人點評)/或者沒有回復同學或老師的點評都倒扣該題分數。
4、請用表格和折線圖呈現你本周(4/9 8:00~4/23 8:00)的代碼行數和所用時間、博客字數和所用時間。
表格:
折線圖: