• 大一下第三次作业


    一、作业

    一道编程题:

    有一个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("
    ");
            } 
        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!
    ");
        else printf("%s
    ", 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!
    ");
        else printf("%d
    ", 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
    ", 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)!='';i++)//遍历数组
    	{
    		if(*(s+i)==ch1)//找到第一个指定位置的字符
    		{
    			index=i;//标记第一个位置
    			for(j=i;*(s+j)!='';j++)//从第一个指定位置开始遍历数组
    			{
    			if(*(s+j)==ch2)//找到第二个指定位置的字符
    			{
    		    	flag=1;
    		    	for(;i<=j;i++)
    		    	printf("%c",*(s+i));//输出第一个字符到第二个字符中的字符
    			}
    			}
    			if(flag==0)//没有找到第二个指定位置的字符
    			{
    				flag=2;
    				for(;*(s+i)!='';i++) 
    				printf("%c",*(s+i));//输出从第一个指定位置的字符到结束的字符
    			}
    	 	} 
    	} 
    	if(flag==0)//没有找到第一个指定位置的字符
    		 {
    		 	printf("
    ");//输出换行
    		 	a="";//字符数组为空
    		  }
    	else
    	{
    		printf("
    ");
    		for(k=0;*(s+index)!='';index++,k++)
    		  	*(a+k)=*(s+index);//建立新字符数组,将第一个指定位置的字符到结束的字符赋值给新的字符数组
    		  	*(a+k)='';
    	} 
    	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
    ", str);
        scanf("%c %c", &ch_start, &ch_end);
        p = match(str, ch_start, ch_end);
        printf("%s
    ", 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)!='';i++)
    	{
    		if(*(s+i)==ch1)
    		{
    			index=i;
    			for(j=i;*(s+j)!='';j++)
    			{
    			if(*(s+j)==ch2)
    			{
    		    	flag=1;
    		    	for(;i<=j;i++)
    		    	printf("%c",*(s+i));	
    			}
    			}
    			if(flag==0)
    			{
    				flag=2;
    				for(;*(s+i)!='';i++) 
    				printf("%c",*(s+i));
    			}
    	 	} 
    	} 
    	if(flag==0)
    		 {
    		 	printf("
    ");
    		 	a="";
    		  }
    	else
    	{
    		printf("
    ");
    		for(k=0;*(s+index)!='';index++,k++)
    		  	*(a+k)=*(s+index);
    		  	*(a+k)='';
    	} 
    	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 = '';
       if(n>0 && n<=12)
        p1 = *(p+n-1);
       return p1;
     }
    

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

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

    2、Git地址

    3、点评三个同学的作业

    董欣
    董雅洁
    李晓静

    4、表格


  • 相关阅读:
    elk.postman_collection.json
    win10 env
    run fink local
    run kafka local
    打码util
    DataFormatVerifyUtil
    springboot logging.config=classpath:log4j2.xml -Dlogging.config=config/log4j2.xml
    server.port server.servlet.context-path resources freemarker mybatis mail
    maven-war-plugin
    html头部有一行信息导致所有的css和jss都是 https了
  • 原文地址:https://www.cnblogs.com/fengzx/p/8781906.html
Copyright © 2020-2023  润新知