第三次作业
提交列表
【6-1】 输出月份英文名
1.设计思路:先将十二个月分别赋值给一维数组指针,定义一个返回值变量。然后遍历数组,寻找对应的变量,最后返回变量的地址值。
2.实验代码:
`
char *getmonth( int n )
{
char *a[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
char *p=NULL;
if(n<=12&&n>=1)
{
p=a[n-1];
}
return p;
}
`
4.流程图:
3.本题调试过程碰到问题及解决办法:无。
【 6-2 】查找星期
1.设计思路:先将一个星期的每天分别赋值数组指针,然后定义一个整型变量,遍历数组,用strmcp函数比较数组中每行元素与输入的字符串是否相同,最后返回整型变量值。
2.实验代码:
`
int getindex( char *s )
{
int i=0;
char *p[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
for(i=0;i<7;i++)
{
if(strcmp(s,p[i])==0)
{
return i;
}
} return -1;
}
3.本题调试过程碰到问题及解决办法:无。 【6-3】 计算最长的字符串长度 1.设计思路:先定义整型变量,在使用for循环中进行判断,最后返回m。 2.实验代码:
int max_len( char *s[], int n )
{
int i,m=0;
for(i=0;i<n;i++)
{
if(m<strlen(s[i]))
{
m=strlen(s[i]);
}
}
return m;
}
3.本题调试过程碰到问题及解决办法:无。 【6-4】 指定位置输出字符串 1.设计思路:先判断s的长度,遍历s字符数组,找到与ch1相同时s的下标,并将下标值赋给一个整型变量,定义为j。然后定义一个指针字符p,将&s[i]赋给p跳出循环,从上面的j开始,循环字符数组s,在循环中分情况,若s[i] != ch2,则输出s[i],反之则输出s[i]加换行,且返回p。循环结束后,输出换行及返回s。 2.实验代码:
#include<string.h>
char *match(char *s, char ch1, char ch2 )
{
int i=0,j=0,len=0;
char *p;
len = strlen(s);
for(i=0;i<len;i++){
if(s[i]==ch1){
p=&s[i];
for(j=i;j<len;j++){
if(s[j]==ch2){
printf("%c\n", s[j]);
return p;
}
else
{
printf("%c", s[j]);
}
}
printf("\n");
return p;
}
}
printf("\n");
*s='\0';
return s;
}
`
3.本题调试过程碰到问题及解决办法:无。
【一道编程题】:
有一个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=20,b=970;
int *p = (int *)malloc((a*b) *sizeof(int));
int *s = (int *)malloc((a*b) *sizeof(int));
int i,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.设计思路:先定义结构体,然后定义变量,用while循环判断,再用指针赋值,重复,进而输出返回值。
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;
}
`
4.流程图:
3.本题调试过程碰到问题及解决办法:无。
【6-2】 学生成绩链表处理
1.设计思路:在createlist函数中将输入的学号,姓名和分数存储到链表中,while循环进行条件判断,并且必须在判断学号不为0的情况下才可以输入姓名和成绩,返回链表的头结点。然后在deletelist函数中遍历链表的结点,若结点中的分数小于规定的值则删除此结点,若最终结点全被删除,即返回空的。最后将判断后链表的头结点返回主函数。
2.实验代码:
`
struct stud_node *createlist()
{
struct stud_node *head, *tail, *q;
head = tail = NULL;
int num;
scanf ("%d", &num);
while (num != 0)
{
q = (struct stud_node *)malloc (sizeof (struct stud_node));
scanf ("%s %d", q->name, &q->score);
q->num = num;
q->next = NULL;
if (head == NULL)
head = q;
else
tail->next = q;
tail = q;
scanf ("%d", &num);
}
return head;
}
struct stud_node *deletelist( struct stud_node *head, int min_score )
{
struct stud_node *ptr1, *ptr2;
while (head != NULL && head->score < min_score)
{
ptr2 = head;
head = head->next;
free(ptr2);
}
if (head == NULL)
return NULL;
ptr1 = head;
ptr2 = head->next;
while (ptr2 != NULL)
{
if (ptr2->score < min_score) {
ptr1->next = ptr2->next;
free(ptr2);
}
else
ptr1 = ptr2;
ptr2 = ptr1->next;
}
return head;
}
3.本题调试过程碰到问题及解决办法:无。 【6-3 】链表拼接 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、总结两周里所学的知识点,回答下列问题?(用自己的话表达出你的理解,网上复制粘贴没有分数)(5分)
(1)如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?
答:指针数组更加的实用,二级指针指向地址,可以指向以及指针。
(2)将C高级第三次PTA作业(1)任何一个题目改为使用二级指针对指针数组进行操作。
(3)用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?
答:更加的实用,可以灵活运用,可以。
2、将PTA作业的源代码使用git提交到托管平台上,要求给出上传成功截图和你的git地址。
git地址:https://git.coding.net/lfyyyy/seven
截图:
3、点评3个同学的本周作业(在作业中给出被点评同学博客的链接),并邀请3名同学点评你的作业,无点评作业(你的作业未被3人点评)/或者没有回复同学或老师的点评都倒扣该题分数。(4分)
建议采用汉堡包的方式点评其他同学的作业,只有赞扬没有给出实质性建议或者指正的不算点评,不给分。
史泽文:http://www.cnblogs.com/shilcz/
王廷宇:http://www.cnblogs.com/archeralter/
董雅洁:http://www.cnblogs.com/exo123/p/8798720.html
4、请用表格和折线图呈现你本周(4/9 8:00~4/23 8:00)的代码行数和所用时间、博客字数和所用时间(3分)