一、作业
一道编程题:
有一个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、表格