c语言第六次作业解析.docx

上传人:b****4 文档编号:3538654 上传时间:2022-11-23 格式:DOCX 页数:24 大小:145.57KB
下载 相关 举报
c语言第六次作业解析.docx_第1页
第1页 / 共24页
c语言第六次作业解析.docx_第2页
第2页 / 共24页
c语言第六次作业解析.docx_第3页
第3页 / 共24页
c语言第六次作业解析.docx_第4页
第4页 / 共24页
c语言第六次作业解析.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

c语言第六次作业解析.docx

《c语言第六次作业解析.docx》由会员分享,可在线阅读,更多相关《c语言第六次作业解析.docx(24页珍藏版)》请在冰豆网上搜索。

c语言第六次作业解析.docx

c语言第六次作业解析

第六次作业:

指针

(以下题目如无特殊声明,请使用指针技术实现,尽量不要使用数组作为形参,也尽量避免使用数组下标引用数组元素)

1.数组元素循环移位

有n个整数,使前面的各整数顺序向后移动m个位置,后面的m个整数则变成最前面的m个数。

写一函数实现以上功能。

在主函数中输入n及n个整数,输入m(m

#include

voidmain()

{

voidinv(int*p,intn,intm);

intn,m,a[20],*p;

printf("pleaseinputn=");

scanf("%d",&n);

printf("pleaseinput%dnumbers:

",n);

p=a;

while(p

scanf("%d",p++);

printf("pleaseinputm=");

scanf("%d",&m);

p=a;

inv(a,n,m);

printf("thenewarray:

\n");

while(p

printf("%d",*p++);

putchar('\n');

}

voidinv(int*p,intn,intm)

{

inti;

for(i=1;i<=n;i++)

*(p+n-i+m)=*(p+n-i);

for(i=0;i

*(p+i)=*(p+n+i);

}

2.矩阵元素的排序

将一个5×5的整数型矩阵中各元素重新排序。

排序规则为,矩阵元素按照从左到右,从上到下的顺序依次递增,即

要求编写一个函数实现上述排序功能。

在主函数中输入该矩阵,调用编写的上述函数,然后输出排序后的矩阵。

#include

voidmain()

{

voidinv(int(*x)[5]);

inti,j,a[5][5];

int(*p)[5];

printf("pleaseinputan5*5array:

\n");

p=a;

for(i=0;i<5;i++)

for(j=0;j<5;j++)

scanf("%d",*(p+i)+j);

inv(p);

printf("thenewarray:

\n");

for(i=0;i<5;i++)

{

for(j=0;j<5;j++)

printf("%4d",*(*(p+i)+j));

putchar('\n');

}

putchar('\n');

}

voidinv(int(*x)[5])

{

inti,j,t;

for(i=0;i<24;i++)

for(j=i+1;j<25;j++)

{

if(*(*x+i)>*(*x+j))

{t=*(*x+i);*(*x+i)=*(*x+j);*(*x+j)=t;}

}

return;

}

3.星期的查找

编写一个程序,输入一个1~7之间的整数,表示星期几,然后输出相应的文字。

例如:

如用户输入3,则输出“星期三”。

要求:

用指针数组的方法来实现。

#include

voidmain()

{

intn;

char(*p)[3];

chara[7][3]={"一","二","三","四","五","六","七"};

printf("pleaseinputn=");

scanf("%d",&n);

p=a;

printf("星期%s\n",p+n-1);

}

4.字符串库函数的实现

请使用指针的方法来实现如下的库函数:

Char*strncpy(char*s,char*t,intn)//复制t的前n个字符至s

Char*strncat(char*s,char*t,intn)//连接t的前n个字符至s的末尾

intstrncmp(char*s,char*t,intn)//比较s和t的前n个字符

并请编写一个主函数来调用并测试自己编写的库函数。

#include

#include

char*strncpy(char*s,char*t,intn)

{

inti,length;

length=strlen(s);

for(i=0;i

*(s+i)=*(t+i);

if(length

return(s);

}

char*strncat(char*s,char*t,intn)

{

inti,length;

length=strlen(s);

for(i=0;i

*(s+i+length)=*(t+i);

*(s+length+n)='\0';

return(s);

}

intstrncmp(char*s,char*t,intn)

{

inti;

for(i=0;i

{

if(*(s+i)==*(t+i))continue;

elseif(*(s+i)>*(t+i)){return

(1);break;}

else{return(-1);break;}

}

}

voidmain()

{

chara[20],b[20];

intn;

scanf("%s%s%d",a,b,&n);

printf("%s\n",strncpy(a,b,n));

scanf("%s%s%d",a,b,&n);

printf("%s\n",strncat(a,b,n));

scanf("%s%s%d",a,b,&n);

printf("%d\n",strncmp(a,b,n));

}

5.算术练习程序(指针型函数)

一位小朋友正在学习两个100以内正整数的简单运算(加法、减法、乘法、除法),请编写一个程序来帮助他学习。

该程序调用一个GetRandomExpression(),由它随机返回一个简单的表达式;然后程序提示用户输入表达式的计算结果,并判断答案是否正确。

#include

#include

#include

intresult=1;

voidGetRanddomExpression(int*num1,char*a,int*num2)

{

intn;

srand(time(NULL));

*num1=rand()%100+1;

*num2=rand()%100+1;

n=rand()%4;

switch(n)

{

case0:

{while(*num2>*num1)*num2=rand()%100+1;

result=(*num1)-(*num2);*a='-';}break;

case1:

{while((*num1+*num2)>100)*num2=rand()%100+1;

*a='+';result=(*num1)+(*num2);}break;

case2:

while((*num1*(*num2))>100)*num2=rand()%100+1;

*a='*';result=(*num1)*(*num2);break;

case3:

{while(*num1%*num2!

=0)*num2=rand()%100+1;

result=(*num1)/(*num2);*a='/';}break;

}

}

intjudge(intanswer)

{

if(answer==result)return

(1);

elsereturn(0);

}

voidmain()

{

intnum1,num2;

chara;

intanswer;

while(result!

=answer)

{

GetRanddomExpression(&num1,&a,&num2);

printf("pleaseinputtheresultoftheexpression:

\n%d%c%d=",num1,a,num2);

scanf("%d",&answer);

if(judge(answer)==1)printf("youareright!

");

elseprintf("sorry,itnottherightanswer.\n");

}

}

6.数组分区(指针作为函数参数)

本题由三个部分构成

(1)编写一个函数CountEvensAndOdds,其功能是统计一个整型数组中奇数和偶数的个数。

该函数有4个参数,整数型数组、数组的长度和两个指针(用于返回奇数、偶数的个数)

(2)利用

(1)中的CountEvensAndOdds函数,编写一个Partition函数,其功能是找出给定长度的一个整型数组中的所有奇数和偶数,并把它们分别保存在两个新的整型数组中(用C语言的库函数malloc函数动态创建),然后返回这两个新数组及其长度。

该函数的参数有6个,整型数组、数组长度、奇数数组及其长度、偶数数组及其长度。

(3)编写主函数,要求能够定义一个数组,并能够用随机数对该数组进行初始化,然后调用

(2)中的函数Partition,将原始数组、奇数数组、偶数数组输出。

 

#include

#include

#include

#include

voidCountEvensAndOdds(int*parr,intarr_len,int*even_count,int*odds_count)

{

inti;

intcount_even=0,count_odds=0;

for(i=0;i

{

if((*(parr+i)%2)==0)count_even++;

elsecount_odds++;

}

*even_count=count_even;

*odds_count=count_odds;

}

voidPartition(int*parr,intarr_len,int**even_arr,int*even_len,int**odds_arr,int*odds_len)

{

inteven_count,odds_count,i,m=0,n=0;

intcount_even=0,count_odds=0;

CountEvensAndOdds(parr,arr_len,&even_count,&odds_count);

*even_arr=(int*)malloc(sizeof(int)*even_count);

*odds_arr=(int*)malloc(sizeof(int)*odds_count);

for(i=0;i

{

if((*(parr+i)%2)==0)

{*(*even_arr+m)=*(parr+i);m++;}

else

{*(*odds_arr+n)=*(parr+i);n++;}

}

*even_len=m;

*odds_len=n;

}

voidprint_arr(int*parr,intarr_len)

{

inti;

for(i=0;i

{printf("%-3d",*(parr+i));if((i+1)%10==0)printf("\n");}

printf("\n");

}

voidmain()

{

int*parr,arr_len,i,*even_arr,even_len,*odds_arr,odds_len;

srand(time(NULL));

arr_len=rand()%50;

parr=(int*)malloc(sizeof(int)*arr_len);

printf("arr_len=%d\n",arr_len);

for(i=0;i

parr[i]=rand()%100;

Partition(parr,arr_len,&even_arr,&even_len,&odds_arr,&odds_len);

printf("arr:

\n");

print_arr(parr,arr_len);

printf("even_arrlen=%d\n",even_len);

printf("even_arr:

\n");

print_arr(even_arr,even_len);

printf("odds_arrlen=%d\n",odds_len);

printf("odds_arr:

\n");

print_arr(odds_arr,odds_len);

}

7.字符串压缩(使用字符指针)

编写一个程序,输入一个字符串,然后采用如下的规则对该字符串当中的每一个字符进行压缩:

(1)如果该字符是空格,则保留该字符。

(2)如果该字符是第1次出现或第3次出现或第6次出现,则保留该字符

(3)否则删除该字符。

例如,若用户输入occurrence,经过压缩后,字符c的第2次出现被删除,第1和第3次出现仍保留;字符r和e的第2次出现均被删除,因此最后的结果为:

occurrence。

#include

#include

#include

voidmain()

{

char*p,str[50]={'0'};

intn,i,j=0,num[26]={0};

gets(str);

n=strlen(str);

p=(char*)malloc(n*sizeof(char));

for(i=0;str[i]!

=0;i++)

{

if(str[i]=='')*(p+j++)=str[i];

else

{

if(num[str[i]-97]==0||num[str[i]-97]==2||num[str[i]-97]==5)

{

*(p+j++)=str[i];

num[str[i]-97]++;

}

elsenum[str[i]-97]++;

}

}

for(i=0;i

printf("%c",*(p+i));

putchar('\n');

}

8.字符查找(使用指针数组)

用一个指针数组存储6种计算机语言FORTRAN、PASCAL、BASIC、C、COBOL、SMALLTALK,根据用户输入的若干个开头字符,显示所有相匹配的计算机语言,例如:

输入”BA”,显示”BASIC”;输入”C”,显示”C”和”COBOL”。

#include

#include

voidmain()

{

char*a[6]={"FORTRAN","PASCAL","BASIC","C","COBOL","SMALLTALK"};

charb[6],*p;

intlength,i,k;

printf("pleaseinputsomecharactors:

");

scanf("%s",b);

length=strlen(b);

for(i=0;i<6;i++)

{

for(p=b;p

{

if(*p==*a[i])k=i;

else{k=6;break;}

}

if(k==i)printf("%s\n",a[i]-length);

}

}

9.字符串排序(使用多级指针)

用指向指针的指针的方法对于输入的5个字符串进行排序并输出。

(假设每个字符串最大长度不超过20)

//用指向指针的指针的方法对于输入的5个字符串进行排序并输出。

#include

#include

voidsort(char*name[],intn)

{

char*temp;

inti,j,k;

for(i=0;i

{

k=i;

for(j=i+1;j

if(strcmp(name[k],name[j])>0)k=j;

if(k!

=i){temp=name[i];name[i]=name[k];name[k]=temp;}

}

}

voidprint(char*name[],intn)

{

inti;

for(i=0;i

printf("%s\n",name[i]);

}

voidmain()

{

char*name[5];

chara[5][20];

intn=5,i;

printf("pleaseinputfivestr:

\n");

for(i=0;i

{

scanf("%s",a[i]);

name[i]=*(a+i);

}

printf("\nthenewstr:

\n");

sort(name,n);

print(name,n);

}

10.最长公共字串(提示使用strstr()库函数)

编写一个程序,求给定三个字符串的最长公共子串。

假设给定的三个字符串分别为:

Whatislocalbus?

Namesomelocalbus.

ALocalbusishighspeedI/Obusclosetotheprocessor.

#include

#include

intstr_match(char*s1,char*s2,intlen)

{

while(len>0)

{

if(*s1!

=*s2)return0;

s1++;

s2++;

len--;

}

return1;

}

voidmain()

{

inti,j,s,l,flag1,flag2;

charstr[3][60]={{"whatthelocalbus?

"},{"Namesomelocalbus."},{"ALocalbusishighspeedI/Obusclosetotheprocessor."}};

intlen[3];

for(i=0;i<3;i++)

len[i]=strlen(str[i]);

for(l=len[0];l>0;l--)

{

for(s=0;s+l-1

{

flag1=1;

for(i=1;i<3;i++)

{

flag2=0;

for(j=0;j+l-1

{if(str_match(str[0]+s,str[i]+j,l)){flag2=1;break;}}

if(!

flag2){flag1=0;break;}

}

if(flag1)gotoL;

}

}

L:

printf("最长公共子串为:

");

for(i=0;i

printf("%c",*(str[0]+s+i));

putchar('\n');

}

//以下为选做题目

11.网络警察

作为一名网络警察,你的任务是监视电子邮件,看其中是否有一些敏感的关键词。

不过有些狡猾的犯罪嫌疑人会改变某些单词的字母顺序,以逃避检查。

请编写一个程序,发现这种调整过顺序的关键词。

程序的输入有两行,第一行为关键词列表,第二行为待检查的句子。

程序的输出为在该句子中所找到的经过顺序调整的关键词。

例如输入:

gunsminesmissiles

aamericssellsnugsdaniimsssleotsitneeemis

则输出为:

gunsmissiles

#include

#include

intFindCode(charkeyword[100],intstring_num,charstring[100])

{

intk,letter1[26]={0},letter2[26]={0};

for(k=0;k

letter1[keyword[k]-97]++,letter2[string[k]-97]++;

for(k=0;k<26;k++)

if(letter1[k]!

=letter2[k])break;

if(k==26)return1;

return0;

}

voidPart(charkeyword[][100],chartemp[100],int*Size)

{

char*p;

inti=0,j;p=temp;

while(*p!

='\0')

{

j=0;

while(*p!

=''&&*p!

='\0')keyword[i][j++]=*(p++);

keyword[i++][j]='\0';

while(*p=='')p++;

}

*Size=i;

}

voidmain()

{

charkeyword[100][100],string[100][100],temp[100];

intkey_num,string_num;

inti,j;

gets(temp);

Part(keyword,temp,&key_num);

gets(temp);

Part(string,temp,&string_num);

for(i=0;i

for(j=0;j

if(FindCode(keyword[i],strlen(keyword[i]),string[j]))

printf("%s",keyword[i]);

printf("\n");

}

12.动态三维数组

a、编写一个函数CreateGrid(intm,intn,intt),用来创建一个动态的三维数组,其中m、n、t分别表示该数组每一维的长度。

要求整个数组的存储空间都是用用C语言的库函数malloc函数动态申请的。

b、另外编写一个FreeGrid函数,用来释放这个三维数组。

C、在主函数中

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1