算法入门经典(刘汝佳)数组和字符串 上机练习

第一题、输入一些学生的分数,哪个分数出现的次数最多。如有并列,从小到大输出。
思路:先排序,排好序后,相同数字间序号的差值就是分数个数。
注意:1.题目没有明确是不是任意输入。如果不事先确认输入分数个数的总数,后面会很不好处理数据。
2.flag是用来控制空格的输入的。保证第一个数据前没有空格,最后一个数据后没有空格。

#include<stdio.h>
#include<string.h>
#define MAXN 100+10
int a[MAXN];
int main()
{
	int i=0,n,t,max=0,j=0;
	bool flag=false;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	/*先进行冒泡排序*/
	for(i=0;i<n;i++)
	{
		for(j=0;j<n-i-1;j++)
		{
			if(a[j]>a[j+1]) 
			{
				t=a[j+1];
				a[j+1]=a[j];
				a[j]=t;
			}
		}
	}
	/*找出最多的次数*/
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(a[i]==a[j]&&j-i+1>max) max=j-i+1;
			else break;
		}
	}
	/*比较各个相等数据的序号差,找出与最大值相同的就是我们要找的*/
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(a[i]==a[j]&&(j-i+1)==max)
			{
				if(flag) printf(" ");
				printf("%d",a[i]);
				flag = true;
			}
		}
	}
	return 0;
}

第二题、输入若干个单词,输出他们得到平均长度。单词只包含大写字母或小写字母,用一个或多个空格隔开。
思路:先用strlen获取字符串长度,遍历字符串,遇到空格,长度减一。判断是不是一个单词以该字符前是空格,且该字符不为空格为标准。

#include<stdio.h>
#include <string>
#include<ctype.h>
#define MAXN 1000
char a[MAXN];
int main()
{
	int length=0,
		i=0,
		count=0,
		tot=0;
	gets(a);
	length=strlen(a);
	tot=length;
	for(i=0;i<length;i++)
	{
		//if(isspace(a[i])) tot--;
		if(a[i]==' ') tot--;
		if((i==0&&!isspace(a[i]))
			||
			(i>0 && isspace(a[i-1]) && !isspace(a[i]))) 
			count++;
	}
	printf("%f",tot*1.0/count);
	return 0;

}

#include<stdio.h>
#include
#include<ctype.h>
#define MAXN 1000
char a[MAXN];
int main()
{
int length=0,
i=0,
count=0,
tot=0;
//gets(a);
fgets(a,sizeof(a),stdin);
length=strlen(a);
tot=length;
for(i=0;i<length;i++)
{
//if(isspace(a[i])) tot–;
if(a[i]’ '|| a[i]’\n’) tot–;
if(
(i0 && (a[i]!=’ '|| a[i]’\n’))
||
(i>0 && a[i-1]==’ ’ && a[i]!=’ ')
) count++;
}
printf("%f",tot*1.0/count);
return 0;
}

如果用fgets

#include<stdio.h>
#include <string>
#include<ctype.h>
#define MAXN 1000
char a[MAXN];
int main()
{
	int length=0,
		i=0,
		count=0,
		tot=0;
	//gets(a);
	fgets(a,sizeof(a),stdin);
	length=strlen(a);
	tot=length;
	for(i=0;i<length;i++)
	{
		//if(isspace(a[i])) tot--;
		if(a[i]==' '|| a[i]=='\n') tot--;
		if(
			(i==0 && (a[i]!=' '|| a[i]=='\n'))
			||
			(i>0 && a[i-1]==' ' && a[i]!=' ')
			) count++;
	}
	printf("%f",tot*1.0/count);
	return 0;
}

fgets和gets区别

输入若干个整数(可以是正数、负数或者零),输出它们的乘积的末3位。这些整数中会混入一些由大写字母组成的字符串,你的程序应该忽略它们。提示:试试看,在执行scanf(“%d”)时输入一个字符串会怎样?

#include<stdio.h>
#include <string.h>  
#include <ctype.h> 
#define MAXN 1000
char a[MAXN];
int main()
{
	int l,i=0,sum=1,ret=1;
	int flag=1;
	scanf("%[^\n]s",a);
	l=strlen(a);
	for(i=0;i<l;i++)
	{
		sum=1;
		flag=1;
		while(!isdigit(a[i]) && a[i]!='-' && a[i]!='\0' )
			i++;
		if(a[i]=='-')
			flag = -flag;
		if(isdigit(a[i]))
		{
			sum=a[i]-'0';
			i++;
			while(isdigit(a[i]))
			{
				sum=sum*10+a[i]-'0';
				i++;
			}
		}
			ret=flag*sum*ret;
	}
	printf("%3d\n",ret%1000);
	return 0;
}

第四题、编写程序,读入一行恰好包含一个加号、减号、或乘号的表达式,输出它的值。这个运算符保证是二元运算符,且两个运算数均为不超过100的非负整数。运算数和运算符可以紧挨着,也可以用一个或多个空格,TAB隔开。行首末尾均可以有空格。
样例输入:1+1
样例输出:2
样例输入:2- 5
样例输出:-3
样例输入:0 *1982
样例输出:0

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#include<math.h>
int main()
{
	int x=0,y=0,sum=0,ret;
	char c,a;
	while((a=getchar())!='\n')
	{
		if(isdigit(a))
		{
			sum=sum*10;
			sum=sum+(a-'0');
		}
		else if( a=='+' || a=='-' || a=='*'  )
		{
			x=sum;
			c=a;
			sum=0;
		}
	}
		y=sum;
	if(c=='+') ret=x+y;
	else if (c=='-') ret=x-y;
	else  ret=x*y;
	printf("%d",ret);
	return 0;
}

解法二

#include <stdio.h>
#include <ctype.h>
int main(int argc, char *argv[])
{
	int a, b;
	char op;
	scanf("%d", &a);
	do {
		scanf("%c", &op);
	} while (isspace(op));  /* 跳过空白字符 */
	scanf("%d", &b);
	if (op=='+') printf("%d\n",a+b);
	if (op=='-') printf("%d\n",a-b);
	if (op=='*') printf("%d\n",a*b);
	return 0;
}

第五题、输入一个n*n的字符矩阵,左转90度后输出。
注意:scanf("%c",&c) 与 scanf(" %c",&c),后者只是在%前多了个空格,似乎没有什么区别,但使用起来区别是很大的。
scanf()作单字符输入时规定只接收一个字符,但它却把回车符也作为字符对待的。这个回车符是放在缓冲区的,但是空格却是直接忽略掉。
这就造成程序中第二次调用scanf("%c",&c)是从缓冲区中取一个字符,把第一次调用scanf("%c",&c)后输入的回车当作输入字符了。
这就在输入逻辑上造成了混乱。
有了scanf(" %c",&c)这个空格(换成\n或者\t也可以),这样就把缓冲区中的回车当成第一个字符,读取后丢掉。

#include<stdio.h>
#include<string.h>
#define MAXN 100
char a[100][100];
int main()
{
	int i,j,n;
	char c;
	i=j=0;
	scanf("%d",&n);
	for(j=0;j<=n;j++)
	{
		for(i=0;i<=n;i++)
		{
			if(c!='\n'&& c!=' ')
			scanf(" %c",&a[i][j]);
		}
	}
	printf("\n");
	for(i=n;i>=0;i--)
	{
		for(j=0;j<=n;j++)
		{
			printf("%c ",a[i][j]);
			if(j==n) printf("\n");
		}
	}
		return 0;
}

第六题、进制转换输入基数b(2<=b<=10)和正整数n(十进制),输出n的b进制表示。

#include<stdio.h>
int main()
{
	int a[100];
	int i,b,n,t;
	scanf("%d",&b);
	scanf("%d",&n);
	for(i=0;n>0;n/=b)
	{
		a[i++]=n%b;
	}
	for(i--; i>=0; i--)//i--是因为上一个循环用了i++,所以这里的i会比数组大一个单位。
	printf("%d",a[i]);
	printf("\n");
	return 0;
}

第七题、进制转换。输入基b(2<=b<=10)和正整数n(n为b进制数),输出n的10进制表示。

#include <stdio.h>
#include <math.h>
#include <string.h>
char a[100];
int main()
{
	int b,i=0,l;
	long m=0;
	scanf("%d",&b);
	scanf("%s",a);
	l=strlen(a);
	for(i=0;i<l-1;i++)
	{
		a[i]=a[i]-'0';
		m=m+a[i]*pow(b,l-1-i);//pow函数为计算x的y次幂。
	}
	printf("%d\n",m);
	return 0;
}

第八题、输入一个由小写字母组成的英文单词,输出用手机的默认英文输入法的敲键序列。
#include <stdio.h>

#include <math.h>
#include <string.h>
char a[4][8]={{'a','d','g','j','m','p','t','w'},
			{'b','e','h','k','n','q','u','x'},
			{'c','f','i','l','o','r','v','y'},
			{'0','0','0','0','0','s','0','z'}};
int main()
{
	char b[20];
	char c;
	int i=0,j=0,k=0;
	fgets(b,sizeof(b),stdin);
	for(k=0;k<sizeof(b);k++)
	{
		for(i=0;i<4;i++)
		{
			for(j=0;j<8;j++)
			{
				if(b[k]==a[i][j])
					printf("%c%d",b[k],i+1);
			}
		}
	}
	printf("\n");
	return 0;
}

示例:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值