C语言——第三次作业(2)

时间:2022-09-09 22:35:27

作业要求一

PTA作业的提交列表

第一次作业

C语言——第三次作业(2)

第二次作业

C语言——第三次作业(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>
#include<malloc.h>
int main(void)
{
int a, b;
scanf("%d %d", &a, &b); //我的学号输入201和3969
int i, j;
int *as=(int *)malloc(1000000*sizeof(int));
for(i = 2; i <= a * b; i++)
as[i] = i; for(i = 2; i <= (a * b) / i; i++)
for(j = i + i; j <= a * b; j = i + j)
as[j] = NULL; for(i = 2, j = 0; i <= a * b; i++)
if(as[i] != NULL)
{
printf("%7d", as[i]);
j++;
if(j % 5 == 0)
printf("\n");
}
return 0;
}

输出结果

C语言——第三次作业(2)

作业要求二

题目1.输出月份英文名(函数题)

1.设计思路

- (1)算法

第一步:定义二维字符数组为全局变量。

第二步:调用定义的函数。

第三步:判断n是否为月份数值,若是,返回对应字符串地址;若不是,使地址为空,返回。

- (2)流程图:略。

2.实验代码

char s[12][10]={"January","February","March","April","May","June","July","August","September","October","November","December"};

char *getmonth( int n )
{
char *month;
if(n > 0 && n <= 12)
{
month = s[n-1];
return month;
}
month = NULL;
return month;
}

完整代码

#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 s[12][10]={"January","February","March","April","May","June","July","August","September","October","November","December"}; char *getmonth( int n )
{
char *month;
if(n > 0 && n <= 12)
{
month = s[n-1];
return month;
}
month = NULL;
return month;
}

3.本题调试过程碰到问题及解决办法

本题出现了较大的问题。

我做这道题目时,是先使用switch语句做的,简单易行不易出错。但是做完以后觉得switch语句和我们最近练习的知识点关系不大,就换了一种方式重写,也因此出现了问题。改正错误其实很容易,但是我却迟迟无法理解错误原因。经过数日的探讨交流和之后老师的讲解,终于明白了错误是内存分配导致的。

题目2.查找星期(函数题)

1.设计思路

- (1)算法

第一步:调用定义的函数。

第二步:定义表示星期的二维数组。

第三步:使用循环语句判断是否存在同输入字符串相同的字符数组,若存在跳出循环,结束调用;否则,返回-1。

- (2)流程图

2.实验代码

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

完整代码

#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 )
{
int i;
char day[7][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
for(i = 0; i < 7; i++)
if(strcmp(s,day[i]) == 0)
break;
if(i == 7)
i = -1;
return i;
}

3.本题调试过程碰到问题及解决办法

无。

题目3.计算最长的字符串长度(函数题)

1.设计思路

- (1)算法

第一步:调用定义的函数。

第二步:使用选择排序法判断字符串长度。

第三步:返回最长的字符串地址。

- (2)流程图:略。

2.实验代码

int max_len( char *s[], int n )
{
int i,t,k,j;
for(i=0;i<(n-1);i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(strlen(*(s+j))>strlen(*(s+k)))
{
k=j;
}
}
if(i!=k)
{
t=*(s+i); *(s+i)=*(s+k); *(s+k)=t;
}
}
return strlen(*s);
}

完整代码

#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 i,t,k,j;
for(i=0;i<(n-1);i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(strlen(*(s+j))>strlen(*(s+k)))
{
k=j;
}
}
if(i!=k)
{
t=*(s+i); *(s+i)=*(s+k); *(s+k)=t;
}
}
return strlen(*s);
}

3.本题调试过程碰到问题及解决办法

无。

题目4.指定位置输出字符串(函数题)

1.设计思路

- (1)算法

第一步:调用定义的函数,定义指针,使其指向为空。

第二步:使用双重循环结构,在外循环内判断输入字符串中是否存在与ch1匹配的字符,如存在,指针指向s[i];再次使用循环结构,内循环内判断输入字符串中是否存在与ch2匹配的字符,如存在,返回指针p,若不存在,内循环结束后返回指针p。

第三步:若外循环内在输入字符串中无法查找到与ch1匹配的字符,使指针指向 '\0' ,返回指针p。

- (2)流程图:略。

2.实验代码

char *match( char *s, char ch1, char ch2 )
{
int i, j;
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]);
else
{
printf("%c\n",s[j]);
return p;
}
}
printf("\n");
return p;
}
}
if(s[i] == '\0')
p = &s[i];
printf("\n");
return p;
}

完整代码

#include <stdio.h>

#define MAXS 10

char *match( char *s, char ch1, char ch2 );

int main()
{
char str[MAXS], ch_start, ch_end, *p; scanf("%s\n", str);
scanf("%c %c", &ch_start, &ch_end);
p = match(str, ch_start, ch_end);
printf("%s\n", p); return 0;
} char *match( char *s, char ch1, char ch2 )
{
int i, j;
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]);
else
{
printf("%c\n",s[j]);
return p;
}
}
printf("\n");
return p;
}
}
if(s[i] == '\0')
p = &s[i];
printf("\n");
return p;
}

3.本题调试过程碰到问题及解决办法

本题测试点1出现多次答案错误。

C语言——第三次作业(2)

错误原因:当ch1找不到, ch2找到时,主函数需要输出空行,但是由于初始代码定义指针指向为空,无法输出空行。

解决办法:使指针指向字符串结束字符即可输出空行。

题目5. 奇数值结点链表(函数题)

实验代码

#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=NULL,*tail=NULL,*p=NULL;
int data;
scanf("%d",&data);
while(data!=-1)
{
p=(struct ListNode *)malloc(sizeof(struct ListNode)); //动态内存分配
p->data = data; //赋值
p->next = NULL;
if(head == NULL) //判断是否为头指针
head=p;
else
tail->next=p;
tail=p; //使尾指针指向p所指向
scanf("%d",&data);
}
return head; //返回头指针
} struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *head=NULL,*head1=NULL,*p=NULL,*str=NULL,*str1=NULL; //动态内存分配
p=*L; //使p指针指向L的地址
if(p == NULL) //p指向为空时,返回0
return 0;
for(; p!=NULL; p=p->next)
{
if(p->data % 2 == 0) //判断变量p->data是否为奇数,将不是奇数的连接起来,形成链表
{
if(head == NULL)
head = p;
else
str->next = p;
str = p;
}
else //将是奇数的连接起来,形成新的链表
{
if(head1 == NULL)
head1 = p;
else
str1->next = p;
str1 = p;
} }
if(str1 != NULL) //使链表最后指向空
str1->next = NULL;
if(str != NULL) //使链表最后指向空
str->next = NULL;
*L = head;
return head1;
}

本题调试过程碰到问题及解决办法

问题:链表题目每道都存在相同的问题,就是看到题目有一种无从下手的感觉。

待解决方法:查找链表相关资料,查阅老师PPT,多加练习。

题目6. 学生成绩链表处理(函数题)

实验代码

#include <stdio.h>
#include <stdlib.h>
#include <string.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;
} struct stud_node *createlist()
{
struct stud_node *head=NULL,*tail=NULL,*p=NULL; //动态分配空间
int num=0;
char name[20];
int score;
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;
else
tail->next=p;
tail=p;
scanf("%d",&num);
if(num==0) //当输入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 *ptr = head, *ptr1=head; //动态分配内存
if(head==NULL) //p指向为空时,返回NULL
return NULL;
for(; ptr!=NULL; ptr=ptr->next)
{
if(ptr->score < min_score) //判断学生成绩是否小于设置的最低成绩
{
if(ptr==head) ////判断是否为头指针
head = ptr->next;
else
ptr1->next = ptr->next;
free(ptr); //动态分配释放
ptr=ptr1;
}
ptr1 = ptr;
}
return head;
}

本题调试过程碰到问题及解决办法

问题:如图

C语言——第三次作业(2)

解决办法:当学生成绩小于设置的最低成绩时,未设置ptr=ptr1,添加即可。

题目7. 链表拼接(函数题)

实验代码


本题调试过程碰到问题及解决办法

本题在PTA时间结束时并未书写正确,存在超时错误。

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
struct ListNode *head1=list1, *head2=list2, *p1=head1, *p2=head2, *str1=NULL, *str2=NULL,*q=NULL;
if(p1==NULL)
return head2;
if(p2==NULL)
return head1;
for(;p2!=NULL;p2=str2)
{
str2=p2->next;
q=p2;
for(; p1!=NULL;p1=str1->next)
{
if(p2->data <= p1->data)
{
p2->next = p1;
if(p1==head1)
head1 = p2;
else
str1->next = p2;
str1=q;
break;
}
str1 = p1;
}
if(p1==NULL)
str1->next = head2;
}
return head1;
}

C语言——第三次作业(2)

作业要求三

1、学习总结

(1)如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?

答:指针数组是数组元素为指针的数组,此数组内每个元素都为指向地址的指针。二级指针可以对指针数组的地址进行操作。

(2)将C高级第三次PTA作业(1)任何一个题目改为使用二级指针对指针数组进行操作。

输出月份英文名

char *getmonth( int n ) {
char *s[12] = {"January","February","March","April","May","June","July","August","September","October","November","December"};
char **p = &s, *q = '\0';
if(n > 0 && n <= 12)
q = *(p+n-1);
return q;
}

(3)用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?

答:当每个字符串长度不同时,可以节省空间,而且不易出现内存分配问题。

不可以。因为未初始化的指针可能会指向一些不确定的地址。

2、我的Git地址

C语言——第三次作业(2)

3、点评链接

链接一

链接二

链接三

4、图表

C语言——第三次作业(2)

C语言——第三次作业(2)

C语言——第三次作业(2)

C语言——第三次作业(2)的更多相关文章

  1. C语言第三次作业总结

    本次作业的亮点 总体情况 大部分同学基本掌握了单层循环结构的写法,懂得了代码调试的过程 PTA通过率及作业质量都不错,希望再接再厉 推荐博客 黄毓颖 推荐理由:代码思路清晰,格式良好:调试过程相当形象 ...

  2. C语言 第三次作业--函数

    1.本章学习总结 1.1 思维导图 1.2本章学习体会及代码量学习体会 1.2.1学习体会 学习C语言也半个学期了,前天也才刚刚进行了半期考试,emmm,成绩很差,可以反应出来我这半学期学习的效果并不 ...

  3. C语言第三次作业---单层循环结构

    一.PTA实验作业 题目一.最佳情侣身高差 1.实验代码 int N;//存放输入的人数 char sex; double hight1,hight2;//分别存放输入的身高和输出的身高 scanf( ...

  4. C语言第三周作业---单层循环

    一.PTA实验作业 题目1 1.实验代码 int N = 0,i; char sex; float a[9], height; scanf("%d\n", &N); for ...

  5. C语言第三次作业--嵌套循环

    一.PTA实验作业 题目1:硬币数 1. 本题PTA提交列表 2. 设计思路 步骤一:定义整型变量fen5,fen2,fen1,表示1分2分和5分,零钱数额x,总硬币数total,换法count 步骤 ...

  6. C语言--第三周作业

    一.PTA作业中4个题目 1.7-9 A乘以B 要求:输入的两个整数:A是你学号前两位数字,B是你学号后两位数字 a.代码 #include <stdio.h> int main () { ...

  7. C语言——第三次作业

    题目1.A乘以B 1.实验代码 #include <stdio.h> int main() { int A,B,C; scanf("%d %d",&A,&amp ...

  8. c语言第三次作业。

    ---恢复内容开始--- (一)改错题 计算f(x)的值:输入实数x,计算并输出下列分段函数f(x)的值,输出时保留1位小数. 源代码 : 第一次编译: 错误原因:if 后面有分号 改正方法:去掉分号 ...

  9. C语言--第三周作业评分和总结(5班)

    作业链接:https://edu.cnblogs.com/campus/hljkj/CS2017-5/homework/1073 一.评分要求 要求1 完成PTA第三周所有题(20分). 要求2 4道 ...

随机推荐

  1. POJ3461 KMP 模板题

    最近忙着考研复习,所以刷题少了.. 数据结构昨天重新学习了一下KMP算法,今天自己试着写了写,问题还不少,不过KMP算法总归是理解了,以前看v_JULY_v的博客,一头雾水,现在终于懂了他为什么要在算 ...

  2. Android广播

    Android中的广播主要分为两类,标准广播和有序广播   标准广播: 一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此没有任何的先后顺序 这种广播的 ...

  3. Struts2 Result 类型和对应的用法详解 2

  4. Node&period;js刷新session过期时间

    在Node.js中,我们通常使用express-session这个包来使用和管理session,保存服务端和客户端浏览器之间的会话状态.那如何才能实现当用户刷新当前页面或者点击页面上的按钮时重新刷新s ...

  5. D django 用户认证系统

    django认证系统包含三个部分:用户.权限和分组 安装 django项目默认启用了认证系统,如果不是使用django-admin.py创建项目的可以通过在settings配置文件里面的INSTALL ...

  6. 慢慢聊Linux AIO

    一.What:异步IO是什么? 1. 一句话总结 允许进程发起很多I/O操作,而不用阻塞或等待任何操作完成 2. 详细说说  一般来说,服务器端的I/O主要有两种情况:一是来自网络的I/O:二是对文件 ...

  7. &period;NET Web开发总结&lpar;五&rpar;

    7 常用服务器控件 7.1 服务器控件概述 · 服务器控件是指在服务器上执行程序的代码的组件 通常这些服务器控件会提供    给用户一定的界面,  以便用户与服务器之间快速的交互 7.2 HTML 服 ...

  8. Photoshop 学习中

    快捷键: f8打开信息调板,注意虽然数字最高是255,但0也是数值之一,因此共256级. f7开启图层调板 f6调出调色板,按D还原为默认颜色 ctrl + 放大,ctrl - 缩小 f 可以切换显示 ...

  9. Oracle 11g服务器安装详细步骤——图文教程

    1.大家可以根据自己的操作系统是多少位(32位或64位)的,到官网下载相应的安装程序,如下图所示. 有一点需要注意,Oracle的安装程序分成2个文件,下载后将2个文件解压到同一目录即可. 2.下载完 ...

  10. JAVA中通过Jedis操作Redis连接与插入简单库

    一.简述 JAVA中通过Jedis操作Redis连接与插入简单库 二.依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis ...