答:作业已完成!
完成情况如图:
(1)算法:
第一步:定义一个指针数组,数组内容为各个月份,再定义一个整形变量s;
第二步:如果n的值在1~12之间,那么就返回s;
第三步:如果n值不在1~12,那么就把NULL赋值给s,再返回s。
(2)流程图:
主函数
调用函数
char *getmonth( int n ){
int s;
char *a[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
if(n<13&&n>0){
s=a[n-1];
return s;
}
else{
s=NULL;
return s;
}
}
问题:本题一开始用二维数组做,得不出正确结果
解决办法:用指针数组做就好了。
(1)算法:
第一步:定义a为整形变量,定义一个指针数组,数组内容是星期;
第二步:用for循环遍历数组,如果s和数组里的某一元素相等时就跳出循环;
第三步:如果此时a正好为7,则输出a等于-1,如果a不是7,则直接返回a的值。
(2)流程图:
略。
int getindex(char *s)
{
int a;
char *day[7] = { "Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday" };
for (a = 0; a <= 6; a++)
{
if (strcmp(s, day[a]) == 0) break;
}
if (a == 7) a = -1;
return a;
}
问题:本题一开始没思路
解决办法:上网查到了strcpy的概念,就是比较两者大小,如果相等就等于零,然后会做了。
(1)算法:
第一步:定义max,i,len为整形变量,且max为0;
第二步:用strlen函数来计算数组中字符串的长度为len;
第三步:如果max比len大,则把max赋值给max,如果max小于等于len,那么就把len的值赋给max;
第四步:循环结束后,返回max的值给主函数。
(2)流程图:
略。
int max_len(char *s[],int n)
{
int max = 0, i,len;
for(i = 0; i < n;i++)
{
len = strlen(s[i]);
if(max>len){
max=max;
}
else if(max<=len){
max=len;}
}
return max;
}
问题:本题一开始不会没思路
解决办法:w上网查到了用strlen函数能求出来字符长度,就会了。
(1)算法:
第一步:定义i,j为整数变量;指针p为空指针;
第二步:用for循环如果s[i]=ch1,那么把s[i]的地址赋给p,然后第二个for循环如果s[j]!=ch2,那么输出s[j],如果s[j]=ch2,那么输出s[j]\n,返回p;
第三步:跳出第二个循环后,输出\n,再返回p的值;
第四步:跳出第一个循环,把\n赋给s[i-1],再把s[i-1的地址]赋值给p,返回p的值。
(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]);
}
if(s[j]==ch2){
printf("%c\n", s[j]);
return p;
}
}
printf("\n");
return p;
}
}
s[i-1]=‘\n‘;
p=&s[i-1];
return p;
}
问题:本题一直没搞懂
解决办法:上网查找,把网上代码复制下来了。
完成情况如图:
(1)算法:
(2)流程图:
略。
struct ListNode *readlist()
{
int data;
struct ListNode *head=NULL;
struct ListNode *p;
while(scanf("%d",&data)&&data!=-1)
{
struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
if(q!=NULL)
{
q->data=data;
q->next=NULL;
}
else exit(1);
if(head!=NULL)
{
p->next=q;
}
else head=q;
p=q;
}
return head;
}
struct ListNode *getodd( struct ListNode **L )
{
struct ListNode *head0=NULL,*head1=NULL,*p0,*p1;
while((*L)!=NULL)
{
int data=(*L)->data;
struct ListNode *q=(struct ListNode*)malloc(sizeof(struct ListNode));
if(data%2)
{
if(q!=NULL)
{
q->data=data;
q->next=NULL;
}
else exit(1);
if(head1!=NULL)
{
p1->next=q;
}
else head1=q;
p1=q;
}
else
{
if(q!=NULL)
{
q->data=data;
q->next=NULL;
}
else exit(1);
if(head0!=NULL)
{
p0->next=q;
}
else head0=q;
p0=q;
}
*L=(*L)->next;
}
*L=head0;
return head1;
}
(1)算法:
(2)流程图:
略。
(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的全部质数。
#include <stdio.h>
#include <math.h>
int main ()
{
long int q=0,c=0,d=0,e=0;
q = 201*990;
int axb[q];
for(c=1;c<q;c++)
{
axb[c-1] = c;
}
for(c=1;c<=q;c++)
{
for(d=2;d<=sqrt(c);d++)
{
if(c%d==0){
axb[c-1]=1;
}
}
}
for(c=0,e=0;c<q;c++)
{
if(axb[c]!=1){
printf("%d ",axb[c]);
e++;
if(e%5 == 0){
printf("\n");
}
}
}
return 0;
}
(1)如何理解指针数组,它与指针、数组有何关系?为何可以用二级指针对指针数组进行操作?
答:指针数组就是一个数组,但是这个数组是个指针;因为题目中指针数组中的一个元素是字符串,该字符串也是个指针,它指向其中的元素,一个字符串里面的元素也可以用二维数组来写。
(2)将C高级第三次PTA作业(1)任何一个题目改为使用二级指针对指针数组进行操作。
(3)用指针数组处理多个字符串有何优势?可以直接输入多个字符串给未初始化的指针数组吗?为什么?
答:二维数组会浪费空间。
不可以,指针要先初始化,要不然不知道指针指向哪一个地址。
(1)提交证明:
(2)Git地址:https://git.coding.net/jsjyuyaosong/usth--work.c.git
史泽文:http://www.cnblogs.com/shilcz/p/8906128.html
董雅洁:http://www.cnblogs.com/exo123/p/8798720.html
张心悦:http://www.cnblogs.com/zxy980612/p/8858885.html
原文:https://www.cnblogs.com/jsjyys/p/8900992.html