郑州轻工业大学zzulioj1170~1179合集
个人觉得学习编程新的知识点不要想着看视频讲解或者是书籍,多刷题,遇到新的没见过的直接搜索,之后如果依然不懂这一点就先标注,等日后刷题积累多了再看就慢慢会明白,而且别贪多,一个知识点只弄懂你看过的或者是简单的操作就可以,等题目刷的多了,经验多了再进行系统的总结,总的来说就是刷题大于一切对于小白来说刷题就是最好的学习方法。另外就是对于我这样的笨蛋来说是需要背题的开始每个函数使用规则,表达方式,使用情况这些都是需要背的,只不过要理解着背,但说白了就是要背熟的,别想着偷懒。其中修改自己的bug也是进步很快的方式,这不仅能让你自己清楚你自己写编程的粗心地方和对于逻辑的理解,语法的进一步深入学习都是很有帮助的。希望大家一起加油进步。
郑州轻工业大学zzulioj1170~1179合集
1170最长字符串(指针专题)
题目描述
输入多个字符串,输出最长字符串。要求定义并使用函数maxLenStr(),
void maxLenStr(char str[], int n, int max)
{
从字符串数组str中找出最长的一个字符串,并将其下标存入形参指针max所指内存。
}
输入
输入有多行,每行一个字符串,每个字符串长度不超过80,输入最多不超过100行,用**作为结束输入的标志,该行输入不用处理。
输出
输出最长的一个字符串。
样例输入 Copy
L love C programming
ACM/ICPC
study hard
样例输出 Copy
L love C programming
代码如下(示例):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void maxLenStr(char *str[], int n, int *max)
{
*max=0;
int i=0;
for(i=1;i<n;i++)
{
if(strlen(str[i])>strlen(str[*max]))//判断长度
*max=i;
}
}
int main()
{
int i=0,max;
char str[80],*p[100]; //char *p[n]是指针数组,它有n个指针类型的数组元素,
//可以用来存放变量地址
gets(str);
while(strcmp(str,"****")!=0)//strcmp是在头文件<string.h>下的函数,用于比较
//两个字符串是否相等,具体可以看南风与鱼博主大大的博客,介绍的很详细
{
p[i]=(char *)malloc(sizeof(char)*(strlen(str)+1)); //数组结束标志'\0'也需要占用一个元素
strcpy(p[i],str);
i++;
gets(str);
}
maxLenStr(p,i,&max);//注意形式
puts(p[max]);
return 0;
}
1171加密(指针专题)*
题目描述
将一段明文加密。加密的规则如下:将每个字符的ascii码的值减去24作为每个字符加密后的值,例如’a’的ascii码的值为97,那么加密后就变成了73。“73"就是’a’的密文,例如,字符串"abc”,在加密之后变为"737475",最后,整个密文再进行翻转,得到最终的密文"574737"。现在请你编写程序,对一段文字加密。请定义并使用如下函数:
void encrypt(char *plain, char *cipher)
{
//把原文字符串plain加密后存入字符串cipher
}
输入
输入一串字符串,只包含数字和字母,最长为200.
输出
输出加密后的字符串。
样例输入 Copy
zero12
样例输出 Copy
625278097789
提示
直接输出密文当然是最简单的方法,不过本题要求你将密文存入字符串(以备程序的其它模块使用)。
代码如下(示例):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void encrypt(char *plain, char *cipher)
{
//把原文字符串plain加密后存入字符串cipher
int len = strlen(plain);
int temp,j=0;
for (int i = len-1; i >=0; i--)
{
*(cipher + j) = *(plain + i)-24; //1,借用*(plain+i)实现换序,作用是案例题中的例子来说就是把“abc”换序成“cba"
//2,减去24
j++;
}
*(cipher + j) = '\0';
}
int main()
{
char buf[200],buf1[200];
gets(buf);
encrypt(buf,buf1);
for (int i = 0; i < strlen(buf1); i++)
{
printf("%d%d",buf1[i]%10,buf1[i]/10);//实现75,74,73中75变成57,74变成47,73变成37
}
printf("\n");
}
1172矩阵边界和(指针专题)
题目描述
给定一个m行n列的二维矩阵,求其四周边元素和。1<=m、n<=100000,可能是1行100000列,也可能是10000行50列,但保证矩阵元素不多于500000。你可能不能预定义数组的大小了,你要学会使用动态内存分配哦。你可以动态申请mn个内存单元,然后用一维数组来存储二维数组,二维数组元素a[i][j]对应一维数组a[in+j],i、j均从0开始。
输入
输入第一行是m和n,然后是一个m行n列的矩阵。
输出
输出一个整数,表示矩阵所有边界元素的和。
样例输入 Copy
3 4
1 2 3 4
5 6 7 8
9 5 4 6
样例输出 Copy
47
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *a,m,n,i,j,sum=0;
scanf("%d%d",&m,&n);
a=(int *)malloc(m*n*sizeof(int));
for(i=0;i<m*n;i++)
scanf("%d",&a[i]);
//计算和(把这个方法记下来)
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(i==0||i==m-1||j==0||j==n-1)
sum+=a[i*n+j];
}
printf("%d\n",sum);
return 0;
}
1173密码解密(指针专题)题目描述
有加密当然也有解密啦。那我们来解密吧。已知明文中只有数字和字母,且加密的规则如下:将每个字符的ascii码的值减去24作为每个字符加密过后的密文,例如’a’的ascii码的值为97,那么加密后就变成了73。"73"就是’a’的密文。所以,若密文是“757392”,则解密后的原文是“cat”。现在请你编写程序,将一段密文解密为原文。
请定义并使用如下函数
void decrypt(char *cipher, char *plain)
{
//将密文cipher解密后将明文存入plain
}
输入
输入一串字符串,最长为200。
输出
输出解密后的原文。
样例输入 Copy
987790872526
样例输出 Copy
zero12
代码如下(示例):
#include<stdio.h>
#include<string.h>
#define N 202
void decrypt(char *cipher,char *plain)
{
int i,len=strlen(cipher);
for(i=0; i<len/2; i++)
{
sscanf(cipher,"%2d",&plain[i]);//sscanf在此处表示从plain中读取两个整形数据放入cipher中
plain[i]+=24;//把存入数据加上24进行还原
cipher+=2;//后移2个字符
}
plain[i]='\0';
}
int main()
{
char *p,*q;
p=(char *)malloc(sizeof(char)*N);
q=(char *)malloc(sizeof(char)*N/2);
gets(p);
decrypt(p,q);
puts(q);
return 0;
}
1174长整数排序(指针专题)
题目描述
长整数排序。输入n 然后输入n个位数不超过100位的大整数,输入的整数可能含有前导0。将这n个长整数排序后输出,输出不含前导0。
int greater(char *s1, char *s2)
{
若s1指向的整数大于s2指向的整数,返回一个正整数;
若s1指向的整数小于s2指向的整数,返回负整数;
若s1指向的整数等于s2指向的整数,返回0;
}
输入
输入第一行是一个正整数n(n<=10),接下来n行是n个大整数,均非负。
输出
输出n行,为n个升序排序后的大整数。
样例输入 Copy
3
012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
54213456565
113456789456231545674632132156465132123156456423132156465461321654878976464654132132156455
样例输出 Copy
54213456565
12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789
113456789456231545674632132156465132123156456423132156465461321654878976464654132132156455
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int greater(char *s1,char *s2)
{//自定义函数比较两数组之间的大小
if(strlen(s1)>strlen(s2))
{
return 1;
}
else if(strlen(s1)<strlen(s2))
{
return -1;
}
else
{
int i=0;
while(s1[i]!='\0')
{
if(s1[i]>s2[i])
{
return 1;
}
else if(s1[i]<s2[i])
{
return -1;
}
i++;
}
}
return 0;
}
int main(){
char *str[10];//定义10个字符型指针
char *x=NULL;//作为指针交换的中间变量
char shu[101],zhuan[101];//shu用来接收字符串zhuan用来储存去掉前导0的字符串
int n,m;
scanf("%d",&n);
getchar();//换行
for(int i=0;i<n;i++)
{
gets(shu);
int j=0;
//统计前导0的个数
while(1)
{
if(shu[j]=='0')
{
j++;
}
else
{
break;
}
}
m=0;
//用zhuan 来存储去掉前导0的shu
for(m=0;shu[j+m]!='\0';m++){
zhuan[m]=shu[j+m];
}
zhuan[m]=shu[j+m];//对zhuan进行结尾添加"\0"
if(zhuan[0]=='\0')
{//如果字符串全是0确保至少保存一个0
zhuan[0]='0';
zhuan[1]='\0';
}
str[i]=(char*)malloc(sizeof(char)*(strlen(zhuan)+1));//分配一段内存空间用来接收别忘了加1为‘\0’的内存
strcpy(str[i],zhuan);//接收zhuan中的字符串
}
for(int i=0;i<n-1;i++)
{//冒泡排序
for(int j=i;j<n;j++)
{
if(greater(str[i],str[j])>0)
{
x=str[i];//x中间变量
str[i]=str[j];
str[j]=x;
}
}
}
for(int i=0;i<n;i++){
puts(str[i]);//输出
}
return 0;//程序结束自动释放malloc分配的空间
}
1175矩阵转置(指针专题)
题目描述
给定一个m行n列的二维矩阵,输出其转置矩阵。1<=m、n<=100000,可能是1行100000列,也可能是10000行50列。你可能不能预定义数组的大小了,你要学会使用动态内存分配哦。
输入
输入第一行是m和n,然后是一个m行n列的矩阵。
输出
输出转置后的矩阵
样例输入 Copy
3 4
1 2 3 4
5 6 7 8
9 5 4 6
样例输出 Copy
1 5 9
2 6 5
3 7 4
4 8 6
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int *p;
p=(int *)malloc(sizeof(int)*(n*m));
int i,j,k;
for( i=0;i<m;i++)
for( j=0;j<n;j++)
scanf("%d",&p[i*n+j]);//记住
int a[m][n];
for( i=0;i<m;i++)
for( j=0;j<n;j++)
{
a[i][j]=p[i*n+j];
}
for( j=0;j<n;j++)
{
for( i=0;i<m-1;i++)
printf("%d ",a[i][j]);
printf("%d\n",a[i][j]);
}
return 0;
}
1176查找最大字符串(指针专题)
题目描述
从键盘上输入多个字符串(每个串不超过5个字符且没有空格),用”*****”作为串输入结束的标记。从所输入的若干字符串中,找出一个最大的串,并输出该串。要求最大串的查找通过调用编写的函数实现
void find(char *name[], int n, int *p)
{
//在包含n个字符串的二维字符数组name中,查找值最大的字符串,将其下标存入指针p所指内存单元
}
输入
一行输入一个字符串,输入多行
输出
输出一个字符串,单独占一行。
样例输入 Copy
zzzdf
fdsg
adff
rtrt
样例输出 Copy
zzzdf
代码如下(示例):
#include<stdio.h>
#include<string.h>
int main()
{
char str1[10]="",str2[10]="";//指针常量
int i=0;
gets(str2);
while(strcmp(str2,"*****")!=0)
{
if(strcmp(str1,str2)<=0)
{//用来更新最大字符串
for(i=0;str2[i]!='\0';i++)
{
str1[i]=str2[i];
}
str1[i]='\0';
}
gets(str2);
}
puts(str1);
return 0;
}
1177按要求排序(指针专题)
题目描述
输入n和n个整数,然后按要求排序,若输入1,请输出升序排序序列;若输入2,请输出降序排序序列,若输入3,请输出按绝对值升序排序序列。要求程序结构如下,请完善程序。
void sort(int a[], int n, int (*cmp)());
int CmpAsc(int x, int y); /按升序要求判断两元素是否逆序/
int CmpDec(int x, int y); /按降序要求判断两元素是否逆序/
int CmpAbsAsc(int x, int y); /按绝对值升序要求判断两元素是否逆序/
int main(void)
{
int a[10],i,n;
int slt;
/读入n和n个整数,存入数组a/
/*读入用户的选择,存入slt; */
switch(slt)
{
case 1: sort(a, n, CmpAsc); break;
case 2: sort(a, n, CmpDec); break;
case 3: sort(a, n, CmpAbsAsc);break;
}
/输出排序后的数组/
}
void sort(int a[], int n, int (*cmp)())
{
/对数组a排序,排序原则由cmp指定,若cmp为真,表示两元素逆序/
}
int CmpAsc(int x, int y)
{
//如果x>y返回1,否则返回0;
}
int CmpDec(int x, int y)
{
//如果x<y返回1,否则返回0;
}
int CmpAbsAsc(int x, int y)
{
//如果abs(x)>abs(y)返回1,否则返回0
}
输入
输入第一行是一个正整数n;
输入第二行是n个整数;
输入第三行是一个1~3的整数slt,表示用户的排序要求。
输出
输出n个整数。若用户的排序选择是1,则输出升序排序后的n个整数;若用户的排序选择是2,则输出降序排序后的n个整数;若用户的排序选择是3,则输出按绝对值升序排序后的n个整数;输出占一行,数据之间用空格隔开。
样例输入 Copy
5
2 -3 1 5 4
2
样例输出 Copy
5 4 2 1 -3
代码如下(示例):
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void sort(int a[],int n,int (*cmp)(int,int)); //排序函数
int CmpAsc(int x,int y); //按升序要求判断两元素是否逆序
int CmpDec(int x,int y); //按降序要求判断两元素是否逆序
int CmpAbsAsc(int x,int y); //按绝对值升序要求判断两元素是否逆序
int main()
{
int *a,i,n;
int slt;
//读入n与n个整数
scanf("%d",&n);
a=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
scanf("%d",&a[i]);
//输入选择
scanf("%d",&slt);
switch(slt)
{
case 1: sort(a,n,CmpAsc); break; //输入1,升序排序
case 2: sort(a,n,CmpDec); break; //输入2,降序排序
case 3: sort(a,n,CmpAbsAsc); break; //输入3,按绝对值升序排序
}
//输出排好序的数组
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
void sort(int a[],int n,int (*cmp)(int,int)) // 排序函数
{
int i,j,temp;
for(i=0;i<n;i++)
for(j=i;j<n;j++)
{
if((*cmp)(a[i],a[j])>0)
{
temp=a[i];a[i]=a[j];a[j]=temp;
}
}
}
int CmpAsc(int x,int y)//升序排序判定条件
{
if(x>y) return 1;
else return 0;
}
int CmpDec(int x,int y)//降序排序判定条件
{
if(x<y) return 1;
else return 0;
}
int CmpAbsAsc(int x,int y) //绝对值升序排序判定条件
{
if(abs(x)>abs(y))
return 1;
if(abs(x)==abs(y)&&x>y) //负数和整数相同时负数在前面
return 1;
return 0;
}
1178单词数
题目描述
统计一篇文章里不同单词的总数。
输入
有多组数据,每组一行,每组就是一篇小文章。每篇小文章都是由大小写字母和空格组成,没有标点符号,遇到#时表示输入结束。每篇文章的单词数小于1000,每个单词最多由30个字母组成。
输出
每组只输出一个整数,其单独成行,该整数代表一篇文章里不同单词的总数。
样例输入 Copy
you are my friend
样例输出 Copy
4
代码如下(示例):
#include<stdio.h>
#include<string.h>
int main()
{
char all[30001]={0};//获得整个字符串
char a[1000][31]={0};//储存单词
while(gets(all),all[0]!='#')
{
int lon=strlen(all);
int sec=0;
//寻找并储存单词
for(int i=0;i<lon;i++)
{
int k;
if(all[i]==' ')
continue;//跳过空格
for(k=0;all[i]!=' '&&i<lon;k++)//逐位储存字符
a[sec][k]=all[i++];
sec++;//下一个单词
}
int l=sec;//备份sec
for(int h=0;h<l-1;h++)
{
/*从第一个单词开始遍历,把每个单词都拎出来和其他单词比一遍,
并在比完后毁掉这个单词,借此来结束循环(因为没有任何一个单词的头为空字符)*/
for(int g=h+1;g<l;g++)
{
if(strcmp(a[h],a[g])==0&&a[h][0]!='\0')
//如果遇到相同单词总单词量-1,
{
sec--;
a[h][0]='\0';
}
}
}
printf("%d\n",sec);
memset(all,0,sizeof(all));//用完清空
memset(a,0,sizeof(a));
}
return 0;
}
1179带参宏定义(函数专题)
题目描述
从键盘输入三个字符,用空格隔开,使用带参宏定义1中SWAP,将三个字符按从大到小的顺序排序输出。
宏定义1:#define SWAP(a, b, t) { t=a; a=b; b=t; }
请尝试,如果用宏定义2中的SWAP,主函数需要如何修改才能得到正确结果?
宏定义2:#define SWAP(a, b, t) t=a; a=b; b=t;
输入
输入三个字符,用空格隔开
输出
输出占一行,包含三个字符,用空格隔开
样例输入 Copy
w a q
样例输出 Copy
w q a
代码如下(示例):
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define SWAP(a,b,t) t=a;a=b;b=t;
int main(){
char ch[3];
char t;
scanf("%c",&ch[0]);
for(int i=1;i<3;i++){
scanf(" %c",&ch[i]);
}
for(int i=0;i<2;i++){
for(int j=i+1;j<3;j++){
if(ch[i]<ch[j]) {SWAP(ch[i],ch[j],t);}//加大括号
}
}
for(int i=0;i<3;i++) printf("%c ",ch[i]);
printf("\n");
return 0;
}