一、作业

一道编程题:

有一个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() 
{ 
    int a, b;
    scanf("%d %d", &a, &b);
    int i, j,flag=0;
    int *num=(int *)malloc(1000000*sizeof(int));
    for(i = 2; i <= a * b; i++)
        num[i] = i;
    for(i = 2; i <= (a * b) / i; i++){
    	for(j = i + i; j <= a * b; j = i + j){
    		num[j] = 0;
		}      
	} 
    for(i = 2; i <= a * b; i++)
        if(num[i] != 0){
            printf("%7d", num[i]);
            flag++;
            if(flag % 5 == 0)
                printf("\n");
        } 
    return 0; 
}

运行截图:

6-1 输出月份英文名

实验代码

函数代码

char *getmonth( int n )
{
	char *month;
	char *p[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
	if(n>0&&n<=12) month=p[n-1];//判断n是否为1到12月其中的一个月份
	else 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 *getmonth( int n )
{
	char *month;
	char *p[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
	if(n>0&&n<=12) month=p[n-1];
	else month=NULL;
	return month; 	 
}

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

错误:
忽略了0和小于1的负数。修改if语句中的条件后正确。

6-2 查找星期

实验代码

函数代码

int getindex( char *s )
{
	int i;
	char *p[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
	for(i=0;i<7;i++)
	{
	   if(strcmp(p[i],s)==0)//遍历数组,比较字符数组中的字符串与输入字符串的长度
	   return i;	
	}
	if(i>7) return -1;
}

完整代码

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

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

无。

6-3 计算最长的字符串长度

2.实验代码

函数代码

int max_len( char *s[], int n )
{
	int j,t=0;
	for(j=0;j<n;j++)
	{
	 	if(strlen(s[t])<strlen(s[j]))//遍历数组,比较字符数组中字符串的长度
        t=j;
	}
	return strlen(s[t]);
}

完整代码

#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 j,t=0;
	for(j=0;j<n;j++)
	{
	 	if(strlen(s[t])<strlen(s[j]))
        t=j;
	}
	return strlen(s[t]);
}

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

无。

6-4 指定位置输出字符串

实验代码

函数代码

char *match( char *s, char ch1, char ch2 )
{
	int i,j,k,flag=0,index=0;
	char *a;
	a=s;
	for(i=0;*(s+i)!='\0';i++)//遍历数组
	{
		if(*(s+i)==ch1)//找到第一个指定位置的字符
		{
			index=i;//标记第一个位置
			for(j=i;*(s+j)!='\0';j++)//从第一个指定位置开始遍历数组
			{
			if(*(s+j)==ch2)//找到第二个指定位置的字符
			{
		    	flag=1;
		    	for(;i<=j;i++)
		    	printf("%c",*(s+i));//输出第一个字符到第二个字符中的字符
			}
			}
			if(flag==0)//没有找到第二个指定位置的字符
			{
				flag=2;
				for(;*(s+i)!='\0';i++) 
				printf("%c",*(s+i));//输出从第一个指定位置的字符到结束的字符
			}
	 	} 
	} 
	if(flag==0)//没有找到第一个指定位置的字符
		 {
		 	printf("\n");//输出换行
		 	a="\0";//字符数组为空
		  }
	else
	{
		printf("\n");
		for(k=0;*(s+index)!='\0';index++,k++)
		  	*(a+k)=*(s+index);//建立新字符数组,将第一个指定位置的字符到结束的字符赋值给新的字符数组
		  	*(a+k)='\0';
	} 
	return a;
}

完整代码

#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,k,flag=0,index=0;
	char *a;
	a=s;
	for(i=0;*(s+i)!='\0';i++)
	{
		if(*(s+i)==ch1)
		{
			index=i;
			for(j=i;*(s+j)!='\0';j++)
			{
			if(*(s+j)==ch2)
			{
		    	flag=1;
		    	for(;i<=j;i++)
		    	printf("%c",*(s+i));	
			}
			}
			if(flag==0)
			{
				flag=2;
				for(;*(s+i)!='\0';i++) 
				printf("%c",*(s+i));
			}
	 	} 
	} 
	if(flag==0)
		 {
		 	printf("\n");
		 	a="\0";
		  }
	else
	{
		printf("\n");
		for(k=0;*(s+index)!='\0';index++,k++)
		  	*(a+k)=*(s+index);
		  	*(a+k)='\0';
	} 
	return a;
}

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

无。

C高级第三次作业(1)PTA提交列表:

6-1 奇数值结点链表

实验代码

函数代码

struct ListNode *readlist()
{
	struct ListNode *head=NULL,*tail=NULL,*str;
    str=(struct ListNode*)malloc(sizeof(struct ListNode));
	scanf("%d",&str->data);//输入整数
	if(str->data==-1) return head;
	while(str->data!=-1){	
		if(head == NULL){
			head=str;
			head->next=NULL; 
		} 
		if(tail!=NULL)
		tail->next=str;
		tail=str;
		tail->next=NULL;
		str=(struct ListNode*)malloc(sizeof(struct ListNode));
		scanf("%d",&str->data);
	}
	return head;
}
struct ListNode *getodd( struct ListNode **L )
{
	struct ListNode *p1=*L,*p2=NULL,*head1=NULL,*str1=NULL,*head2=NULL;
	if(*L==NULL) return 0;
	while(p1!=NULL)
	{
		if(p1->data%2!=0)//整数为奇数,建立链表p2
			if(head1==NULL)
				head1=p1;
			else
			   p2->next=p1;
			p2=p1;
			p1=p1->next;
		}
		else//整数为偶数,建立链表str1
		{
			if(head2==NULL)
			head2=p1;
			else
			str1->next=p1;
			str1=p1;
			p1=p1->next;
		}
	}
	if(p2!=NULL) 
	p2->next=NULL;
	if(str1!=NULL)
	str1->next=NULL;
	*L=head2;//将L中存储的地址改为删除了奇数值结点后的链表的头结点地址
	return head1;
}

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

无。

6-2 学生成绩链表处理

实验代码

函数代码

struct stud_node *createlist()
{
	struct stud_node *head=NULL,*tail=NULL,*str;
    str=(struct stud_node*)malloc(sizeof(struct stud_node));
    scanf("%d",&str->num);//输入学生学号num
    if(str->num==0) return head;//学号为0,返回空
	while(str->num!=0){
		scanf(" %s %d",str->name,&str->score);//输入学生姓名、成绩
		if(head == NULL)
			head=str;
		else
		tail->next=str;
		tail=str;
		str=(struct stud_node*)malloc(sizeof(struct stud_node));
		scanf("%d",&str->num);
	}
	tail->next=NULL;
	return head;
}
struct stud_node *deletelist( struct stud_node *head, int min_score )
{
	struct stud_node *p1=NULL,*p2=head,*p=NULL;
	if(head==NULL) return head;
	while(p2!=NULL)
{	
	if(p2->score>=min_score)//比较学生成绩与分数线
	{
		
		if(p1==NULL)
			p1=p2;
		else
		p->next=p2;
		p=p2;	
	}
	else free(p2);//释放malloc函数给指针变量分配的内存空间
	p2=p2->next;//指向下一个学生信息
			 
} 
  if(p!=NULL)
  p->next=NULL;
	return p1;
}

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

未加 if(p!=NULL) PTA提交错误

6-3 链表拼接

实验代码

函数代码

struct ListNode *mergelists(struct ListNode *list1, struct ListNode *list2)
{
	struct ListNode *ptr1=list1,*ptr2=list2;
	struct ListNode *head=NULL,*tail=NULL,*ptr;
    int num[1000];
    int n=0;
	int i=0,j=0,t;
	while(ptr1!=NULL)//遍历数组,将链表ptr1中的整数数赋值给数组
	{
		num[n]=ptr1->data;
		n++;
		ptr1=ptr1->next;
	  }
	  while(ptr2!=NULL)//遍历数组,将链表ptr2中的整数数赋值给数组
	{
		num[n]=ptr2->data;
		n++;
		ptr2=ptr2->next;
	} 
	for(i=0;i<n-1;i++)//将数组中的数字按照从小到大排列
	{
	   for(j=0;j<n-1-i;j++)
	   {
	   	if(num[j]>num[j+1])
	   	{
	   	   t=num[j];
			num[j]=num[j+1];
			num[j+1]=t;	
		   }
		}	
	 }
	 for(i=0;i<n;i++)//遍历数组,建立新链表
	 {
	 	ptr = (struct ListNode  *)malloc(sizeof(struct ListNode));
	 	ptr->data=num[i];
	 	if(head==NULL)
	 	{
	 		head=ptr;
	 		head->next=NULL;
		}
		else tail->next=ptr;
		tail=ptr;
		tail->next=NULL;
	 }
    return head;
}

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

看到题目无从下手,上网查找设计思路,豁然开朗!

C高级第三次作业(2)PTA提交列表:

总结

1、总结两周里所学的知识点,回答下列问题。

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

指针数组中的每一个元素都为指针,例如str[i]是指向第i+1个元素的指针。二级指针指向指针数组,通过指针数组所指向的操作内存空间。

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

6-1 输出月份英文名改为使用二级指针对指针数组

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

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

访问指针数组中的一个元素是用指针间接进行的,效率高。当字符串长度不同时不会出现内存分配问题。
不行,只定义而未初始化的指针不会指向任何内存空间,不能对指针指向的地方赋值。

2、Git地址

3、点评三个同学的作业

董欣
董雅洁
李晓静

4、表格


posted on 2018-04-22 23:05  冯子旋  阅读(269)  评论(4编辑  收藏  举报