第3次作业
作业要求一 (20分)
完成下列编程题目,每次上完课都会增加2-3道题目,并将编程过程记录在博客里,一次PTA作业任选一道题目给出设计思路、流程图、源代码和错误记录,其他题目可只给出设计思路、源代码和错误记录。另外将每次PTA作业的提交列表贴在博客里,每次5分。
1)C高级第三次PTA作业(1)
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的全部质数。
3)C高级第三次PTA作业(2)
6-1 输出月份英文名
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:判断是否为合法月份。
第二步:字符数组储存相应月份英文。
第三步:在循环内输出指定月份。
(2)流程图(4分)
2.实验代码(2分)
#include <stdio.h>
char *getmonth( int n );
int main()
{
int n;
char *s;
scanf("%d", &n);
s = getmonth(n);
if ( s==NULL ) printf("wrong input!\n");
else printf("%s\n", s);
return 0;
}
char *getmonth( int n )
{
if((n < 1) || (n > 12))
{
return 0;
}else
{
char *month[12] = {"January","February","March","April","May","June","July","August","September","October","November","December"};
int a;
for(a = 0;a < 12;a = a + 1)
{
if(n == (a + 1))
{
return *(month + a);
}
}
}
}
3.本题调试过程碰到问题及解决办法(4分)
未遇到问题。
6-2 查找星期
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:在字符数组储存相应星期英文。
第二步:在循环内判断返回相应星期号。
第三步:无相应星期返回-1。
2.实验代码(2分)
#include <stdio.h>
#include <string.h>
#define MAXS 80
int getindex( char *s );
int main()
{
int n;
char s[MAXS];
scanf("%s", s);
n = getindex(s);
if ( n==-1 ) printf("wrong input!\n");
else printf("%d\n", n);
return 0;
}
int getindex( char *s )
{
char *data[7] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int a;
for(a = 0;a < 7;a = a + 1)
{
if(strcmp(s,*(data + a)) == 0)
{
return a;
}
}
return -1;
}
3.本题调试过程碰到问题及解决办法(4分)
未遇到问题。
6-3 计算最长的字符串长度
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:记录初始字符串长度。
第二步:在循环内判断较长字符串。
第三步:记录长度值返回。
2.实验代码(2分)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXN 10
#define MAXS 20
int max_len( char *s[], int n );
int main()
{
int i, n;
char *string[MAXN] = {NULL};
scanf("%d", &n);
for(i = 0; i < n; i++) {
string[i] = (char *)malloc(sizeof(char)*MAXS);
scanf("%s", string[i]);
}
printf("%d\n", max_len(string, n));
return 0;
}
int max_len( char *s[], int n )
{
int a,num = strlen(s[0]);
for(a = 0;a < n;a = a + 1)
{
if(strlen(*(s + a)) > num)
{
num = strlen(*(s + a));
}
}
return num;
}
3.本题调试过程碰到问题及解决办法(4分)
未遇到问题。
编程题
1.设计思路
(1)主要描述题目算法。
第一步:建立二维指针。
第二步:动态申请空间。
第三步:填充二维数组。
第四步:在循环中判断能够取余当前数字的数组元素,将非当前数字的符合条件的数组元素设为-1。
第五步:当前数字递增。
第六步:在循环中输出非-1的数组元素,每五次换一次行。
第七步:释放内存。
实验代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **n;
int a,b,c,d,e,f,g;
a = 201;
b = 3960;
n = (int **)malloc(sizeof(int *) * a);
for(c = 0;c < a;c = c + 1)
{
n[c] = (int *)malloc(sizeof(int) * b);
}
for(c = 0,e = 0;c < a;c = c + 1)
{
for(d = 0;d < b;d = d + 1)
{
e = e + 1;
n[c][d] = e;
}
}
for(c = 0,e = 2;c < a;c = c + 1)
{
for(d = 0;d < b;d = d + 1)
{
if(n[c][d] != -1)
{
if(n[c][d] == 1)
{
n[c][d] = -1;
}
else if((n[c][d] % e) == 0)
{
for(f = 0;f < a;f = f + 1)
{
for(g = 0;g < b;g = g + 1)
{
if(n[f][g] != -1)
{
if((n[f][g] != e) && ((n[f][g] % e) == 0))
{
n[f][g] = -1;
}
}
}
}
e = e + 1;
}
}else
{
e = e + 1;
}
}
}
for(f = 0,e = 0,c = 0;f < a;f = f + 1)
{
for(g = 0;g < b;g = g + 1)
{
if(n[f][g] > 0)
{
if(((e % 5) == 0)&&(e != 0))
{
printf("\n");
}
printf("%d ",n[f][g]);
e = e + 1;
}
}
}
for(c = 0;c < a;c = c + 1)
{
free(n[c]);
}
free(n);
return 0;
}
3.本题调试过程碰到问题及解决办法
未遇到问题。
6-1 奇数值结点链表
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:创建几个初始化链表。
第二步:输入第一个值。
第三步:在循环内输入值赋值并记录链表首地址,输入-1退出循环,返回首地址。
第四步:创建几个初始化链表。
第五步:在循环内判断链表内值奇偶,记录首地址并标记不再更改首地址。
第六步:在循环内判断链表内值奇偶并分别创建奇偶链表。
第七步:在循环内判断同时存在奇偶链时尾项为空。
第八步:赋值偶数链首地址。
第九步:返回奇数链首地址。
(2)流程图(4分)
2.实验代码(2分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *readlist();
struct ListNode *getodd( struct ListNode **L );
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *L, *Odd;
L = readlist();
Odd = getodd(&L);
printlist(Odd);
printlist(L);
return 0;
}
struct ListNode *readlist()
{
struct ListNode *head,*p,*t;
int n = 0;
head = NULL;
p = NULL;
t = NULL;
scanf("%d",&n);
while(n != -1)
{
p = (struct ListNode *)malloc(sizeof(struct ListNode));
p->data = n;
p->next = NULL;
if(head == NULL)
{
head = p;
t = p;
}else
{
t->next = p;
t = p;
}
scanf("%d",&n);
}
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *p,*t,*h1,*h2;
p = NULL;
t = NULL;
h1 = NULL;
h2 = NULL;
int f1 = 0,f2 = 0;
while(*L != NULL)
{
if(((*L)->data % 2) != 0)
{
if(f1 == 0)
{
p = *L;
h1 = p;
*L = (*L)->next;
f1 = 1;
}else
{
p->next = *L;
p = *L;
*L = (*L)->next;
}
}else
{
if(f2 == 0)
{
t = *L;
h2 = t;
*L = (*L)->next;
f2 = 1;
}else
{
t->next = *L;
t = *L;
*L = (*L)->next;
}
}
if((f1 == 1) && (f2 == 1))
{
t->next = NULL;
p->next = NULL;
}
}
*L = h2;
return h1;
}
3.本题调试过程碰到问题及解决办法(4分)
未遇到问题。
6-2 学生成绩链表处理
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:创建几个初始化链表。
第二步:输入头链表值。
第三步:在循环内输入值赋值并记录链表首地址,输入0退出循环,返回首地址。
第四步:创建几个初始化链表。
第五步:在循环内判断符合成绩的链表,记录首地址并标记不再改变首地址。
第六步:在循环内判断符合成绩的链表,并形成符合数值的链表。
第七步:在循环内判断首地址已被标记,链表尾地址为空。
第八步:返回首地址
2.实验代码(2分)
#include <stdio.h>
#include <stdlib.h>
struct stud_node {
int num;
char name[20];
int score;
struct stud_node *next;
};
struct stud_node *createlist();
struct stud_node *deletelist( struct stud_node *head, int min_score );
int main()
{
int min_score;
struct stud_node *p, *head = NULL;
head = createlist();
scanf("%d", &min_score);
head = deletelist(head, min_score);
for ( p = head; p != NULL; p = p->next )
printf("%d %s %d\n", p->num, p->name, p->score);
return 0;
}
#include <string.h>
struct stud_node *createlist()
{
struct stud_node *head,*p,*t;
int num,score;
char name[20];
head = NULL;
p = NULL;
scanf("%d %s %d",&num,name,&score);
while(num != 0)
{
p = (struct stud_node *)malloc(sizeof(struct stud_node));
p->num = num;
strcpy(p->name,name);
p->score = score;
p->next = NULL;
if(head == NULL)
{
head = p;
t = p;
}else
{
t->next = p;
t = p;
}
scanf("%d",&num);
if(num == 0)
{
break;
}else
{
scanf(" %s %d",name,&score);
}
}
return head;
}
struct stud_node *deletelist( struct stud_node *head, int min_score )
{
struct stud_node *p,*t,*h;
p = head;
t = NULL;
h = NULL;
int f;
f = 0;
while(p != NULL)
{
if(f == 1)
{
t->next = NULL;
}
if(p->score >= min_score)
{
if(f == 0)
{
t = p;
h = t;
f = 1;
}else
{
t->next = p;
t = p;
}
}
p = p->next;
}
return h;
}
3.本题调试过程碰到问题及解决办法(4分)
未遇到问题。
6-3 链表拼接
1.设计思路(6分)
(1)主要描述题目算法(2分)。
第一步:创建几个初始化链表,记录两条链表的首地址。
第二步:在循环中记录其中一条链表的尾地址。
第三步:在循环中将其中一条链表的首地址赋给另一条链表的尾地址,并记录总长度。
第四步:建立结构数组,在循环内储存每个链表元素的地址和数值。
第五步:冒泡排序更改数组顺序为升序。
第六步:在循环中顺次建立一条链表,记录首地址。
第七步:返回首地址。
2.实验代码(2分)
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int data;
struct ListNode *next;
};
struct ListNode *createlist(); /*裁判实现,细节不表*/
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2);
void printlist( struct ListNode *head )
{
struct ListNode *p = head;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
struct ListNode *list1, *list2;
list1 = createlist();
list2 = createlist();
list1 = mergelists(list1, list2);
printlist(list1);
return 0;
}
struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
struct ListNode *p,*t,*h,*head;
int f,g,n1,n2,m;
int *a;
p = list1;
t = list2;
h = NULL;
head = NULL;
while(p != NULL)
{
if(head == NULL)
{
head = p;
}
if(p->next == NULL)
{
p->next = t;
break;
}
p = p->next;
}
h = head;
p = NULL;
t = NULL;
n1 = head->data;
n2 = 0;
while(head != NULL)
{
if(n1 > head->data)
{
n1 = head->data;
}
head = head->next;
n2 = n2 + 1;
}
head = h;
a = (int *)calloc(n2,sizeof(int));
struct ListNode *b[n2];
f = 0;
while(head != NULL)
{
a[f] = head->data;
f = f + 1;
head = head->next;
}
f = 0;
head = h;
t = head;
while(f < n2)
{
b[f] = t;
t = head->next;
head->next = NULL;
head = t;
f = f + 1;
}
head = h;
f = 0;
t = NULL;
for(f = 0;f < (n2 - 1);f = f + 1)
{
for(g = 0;g < (n2 - f - 1);g = g + 1)
{
if((*(b + g))->data > (*(b + g + 1))->data)
{
t = *(b + g);
*(b + g) = *(b + g + 1);
*(b + g + 1) = t;
}
}
}
f = 0;
p = NULL;
t = NULL;
while(f < n2)
{
if(f == 1)
{
p->next = NULL;
}
if(f == 0)
{
p = b[f];
t = p;
}else
{
p->next = b[f];
p = b[f];
}
f = f + 1;
}
return t;
}
3.本题调试过程碰到问题及解决办法(4分)
错误信息:编译出错。
错误原因:数组变量指针取值的正确形式。
改正方法:多次试验改正。
提交列表
要求三、学习总结和进度(15分)
1、总结两周里所学的知识点,回答下列问题?(用自己的话表达出你的理解,网上复制粘贴没有分数)(5分)
(1)如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?
指针数组为存放指针的数组,数组中的每一个指针指向相应地址。二级指针存放着指针数组首地址的指针,可以通过**p控制指针数组中的元素。
(2)将C高级第三次PTA作业(1)任何一个题目改为使用二级指针对指针数组进行操作。
#include <stdio.h>
char *getmonth( int n );
int main()
{
int n;
char *s;
scanf("%d", &n);
s = getmonth(n);
if ( s==NULL ) printf("wrong input!\n");
else printf("%s\n", s);
return 0;
}
char *getmonth( int n )
{
if((n < 1) || (n > 12))
{
return 0;
}else
{
char *month[12] = {"January","February","March","April","May","June","July","August","September","October","November","December"};
char **p;
p = month;
int a;
for(a = 0;a < 12;a = a + 1)
{
if(n == (a + 1))
{
return *(p + a);
}
}
}
}
(3)用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?
不必限制字符串长度相同。不行,未初始化的指针数组存放的地址不定,可能会报错。
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。(3分)
1.git地址
https://git.coding.net/z732511533/ZYS.git
3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业,无点评作业(你的作业未被3人点评)/或者没有回复同学或老师的点评都倒扣该题分数。(4分)
http://www.cnblogs.com/2719610441qqcom/p/8762037.html
http://www.cnblogs.com/jj990519/p/8763063.html
http://www.cnblogs.com/caobaiqiang/p/8810067.html
4、请用表格和折线图呈现你本周(4/9 8:00~4/23 8:00)的代码行数和所用时间、博客字数和所用时间(3分)
时间 | 代码行数 | 时间1(min) | 博客字数 | 时间2(min) |
---|---|---|---|---|
4.09 | 43 | 27 | 814 | 42 |
4.10 | 0 | 0 | 0 | 0 |
4.11 | 71 | 135 | 0 | 0 |
4.12 | 0 | 0 | 0 | 0 |
4.13 | 0 | 0 | 0 | 0 |
4.14 | 0 | 0 | 0 | 0 |
4.15 | 0 | 0 | 0 | 0 |
4.16 | 74 | 120 | 0 | 0 |
4.17 | 67 | 79 | 0 | 0 |
4.18 | 94 | 120 | 0 | 0 |
4.19 | 0 | 0 | 0 | 0 |
4.20 | 379 | 300 | 0 | 0 |
4.21 | 343 | 180 | 969 | 85 |
4.22 | 0 | 0 | 648 | 65 |
4.23 | 0 | 0 | 0 | 0 |