算法竞赛入门经典(第2版)3.4.9上机练习习题

习题3-1 分数统计

输入一些学生的分数,哪个分数出现的次数最多?如果有多个并列,从小到大输出。
任务1:分数均不超过100的非负整数
任务2:分数均不超过100的非负实数,但最多保留两位小数。

#include<stdio.h>
#include<string.h>
int score[1000+10];
int main()
{
	int sum=0,temp;
	int i=0,j=0,n=0;
	int max=0;
	int flag[100+10];
	while((scanf("%d",&score[i++]))==1)
		++sum;
	for(i=0;i<sum;i++)
	{
		int count=1;                     //记录出现次数 
		num=score[i];
		for(j=i+1;j<sum;j++)
		{
			if(score[j]==score[i])
				count++;
		}
		if(count>=max)
		{
			if(count>max)
			{
				max=count;
				memset(flag,0,sizeof(flag));   
				n=0;
				flag[0]=score[i];
			}
			else
				flag[++n]=score[i];
		}
	}
	if(n==0)
		printf("%d\n",flag[0]);
	else                                //希尔排序(多个并列时 
	{
		for(int gap=(n+1)/2;gap>0;gap/=2)
			for(i=gap;i<=n;i++)
				for(j=i-gap;j>=0&&flag[j]>flag[j+gap];j-=gap)
				{
					temp=flag[j];
					flag[j]=flag[j+gap];
					flag[j+gap]=temp;
				}
		for(i=0;i<=n;i++)
			printf("%d ",flag[i]);
	}
	printf("\n");
	return 0;
}


习题3-2 单词的长度

输出它们的平均长度。单词只包含大写字母和小写字母,用一个或多个空格隔开。

#include<stdio.h>
#include<string.h>
char buf[5000+10];
int main()
{
	int count=1;
	int sum=0;
	fgets(buf,sizeof(buf),stdin);
	for(int i=0;i<strlen(buf)-1;i++)
	{
		if(buf[i]==' ')
			++count;
		else
			sum++;
	}
	printf("The average of size is %f.\n",(double)sum/(double)count);
	return 0;
} 

习题3-3 乘积的末三位

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

#include<stdio.h>
#include<string.h>
#define MAXN 1000+10
char a[MAXN];
int num[MAXN]={0};
int main()
{
	int i,j;
	int flag=0,symbol=0;
	int mul=1;
	fgets(a,sizeof(a),stdin);   
	for(i=j=0;i<strlen(a);i++)
	{
		if(a[i]=='-')
			symbol=1;
		else if(a[i]>='0'&&a[i]<='9')
			{
				num[j]=num[j]*10+(a[i]-'0');
				flag=1;
			}
		else
		{
			if(flag==1)
				{
					if(symbol==1)
						num[j]*=-1;
					j++;
					flag=0;
				}
			symbol=0;
		}
	}
	for(i=0;i<j;i++)
		mul*=num[i];
	if(mul%1000!=0)
		printf("The last three numbers are %d.\n",mul%1000);
	else
		printf("The last three numbers are 000.\n");
	return 0;
}

习题3-4计算器

编写程序,读入一行恰好包含一个加号、减号或乘号的表达式,输出它的值。这个运算符保证是二元运算符,且两个运算符均为不超过100的非负整数。运算符和运算数可以紧挨着,也可以用一个或多个空格、TAB隔开。行末尾均可以有空格。提示:选择合适的输入方法可以将问题简化。

#include<stdio.h>
#include<string.h>
#define MAXN 1000+10
char a[MAXN];
int num[MAXN]={0};
int main()
{
	int i,j,flag=0;
	fgets(a,sizeof(a),stdin);
	char ope;
	for(i=j=0;i<strlen(a);i++)
	{
		if(a[i]>='0'&&a[i]<='9')
			{
				num[j]=num[j]*10+(a[i]-'0');
				flag=1;
			}
		else
		{
			if(flag==1)
				{
					j++;
					flag=0;
				}
			if(a[i]=='+'||a[i]=='-'||a[i]=='*')
				ope=a[i];
		}
	}
	switch(ope)
	{  
      case '+':  
           printf("%d\n", num[0]+num[1]);break;  
      case '-':  
           printf("%d\n", num[0]-num[1]);break;  
      case '*':  
           printf("%d\n", num[0]*num[1]);break; 
	}
	return 0;
}
习题3-5 旋转

输入一个n*n字符矩阵,把它左转90°后输出。

#include<stdio.h>
#include<string.h>
int main()
{
	int i,j,n;
	scanf("%d",&n);
	int a[n][n];
	for(i=0;i<n;i++)
		for(j=0;j<n;j++)
			scanf("%d",&a[i][j]);
/*
	ptrintf("The original:\n");
	for(i=0;i<n;i++)
	{	
		for(j=0;j<n;j++)	
				printf("%-3d",a[i][j]);
		printf("\n");
	}
*/
	printf("The latter one:\n");
	for(i=0;i<n;i++)
	{	
		for(j=0;j<n;j++)	
		{
			printf("%-3d",a[j][n-i-1]);
		}
		printf("\n");
	}
	return 0;
}

习题3-6 进制转换1

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

#include<stdio.h>
#include<string.h>
int a[1000+10];
int main()
{
	int b,n;
	int i=0,j;
	scanf("%d %d",&b,&n);
	while(n>=1)
	{
		a[i++]=n%b;
		n/=b;
	}
	for(j=i-1;j>=0;j--)
		printf("%d",a[j]);
	return 0;
}

习题3-7 进制转换2

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

#include<stdio.h>
#include<string.h>
#include<math.h>
#define MAXN 1000+10
char n[MAXN];
int main()
{
	int b;
	int num=0;
	int i,j;
	scanf("%d %s",&b,n);
	for(i=0,j=strlen(n);i<strlen(n);i++)
	{
		num+=(n[i]-'0')*pow(b,--j);
	}
	printf("%d",num);
	return 0;
}

习题3-8 手机键盘

输入一个由小写字母组成的英文单词,输出用手机的默认英文输入法的敲键序列。例如要打出pig这个单词,需要按1次p,3次i,(稍作停顿后)1次i,记为p1i3i1。

#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define MAXN 1000+10
char a[MAXN];
int main()
{
	int i=0,temp,n;
	scanf("%s",a);
	n=strlen(a);
	while(n--)
	{
		if((temp=a[i]-96)<=3) { printf("%c%d",a[i],temp); i++; continue;}
		if((temp=a[i]-99)<=3) { printf("%c%d",a[i],temp); i++; continue;}
		if((temp=a[i]-102)<=3) { printf("%c%d",a[i],temp); i++; continue;}
		if((temp=a[i]-105)<=3) { printf("%c%d",a[i],temp); i++; continue;}
		if((temp=a[i]-108)<=3) { printf("%c%d",a[i],temp); i++; continue;}
		if((temp=a[i]-111)<=3) { printf("%c%d",a[i],temp); i++; continue;}
		if((temp=a[i]-115)<=3) { printf("%c%d",a[i],temp); i++; continue;}
		if((temp=a[i]-118)<=3) { printf("%c%d",a[i],temp); i++; continue;}
		
	}
	return 0;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: ControlSuite 3.4.9 是一个用于控制与自动化系统的软件套件,它包含了许多功能强大的工具和组件,能够帮助用户轻松地管理和监测他们的工业系统。以下是用于安装ControlSuite 3.4.9的步骤: 1. 首先在Texas Instruments的官方网站上下载ControlSuite 3.4.9的安装程序。 2. 然后运行安装程序,按照提示进行安装,选择相应的安装目录和组件。 3. 安装完成后,在安装目录中找到ControlSuite 3.4.9的主目录,并打开该目录。 4. 在该目录中,可以找到一些示例项目和工具,以及用户手册和文档等资源。 5. 安装完成后,可以开始使用ControlSuite 3.4.9来编写和调试工业自动化系统的应用程序。 总而言之,安装ControlSuite 3.4.9是一个相对简单的过程,只需要按照提示进行安装即可。该软件套件的功能强大,能够帮助工业系统的设计和管理变得更加高效和方便。 ### 回答2: controlsuite3.4.9是一款用于实时控制和数学建模的软件工具包。在进行安装前,我们需要确保计算机系统满足以下要求:Windows 7/8/10或Linux操作系统、Visual Studio 2010/2012/2013或GCC编译器、MATLAB R2012a及以上本、XDS100/200或XDS560v2仿真器等。 首先,下载controlsuite3.4.9安装包,并运行。在安装向导界面上,选择“Accept”按钮表示同意许可协议。接着,选择安装位置和组件。可选组件包括:底层驱动程序、电机控制器、示例应用程序、文档和工具,用户可按需选择安装。建议选择全部组件,以便最大化使用控制套件的功能。 完成组件选择后,进行安装。这可能需要一些时间,视计算机硬件性能和组件选择而定。完成安装后,我们需要设置软件环境变量,以便系统能够识别controlsuite3.4.9的功能库和头文件。这可以在Windows系统的“环境变量”设置中执行。在“系统变量”中,添加“controlSUITE_INSTALL_DIR”变量,将其设置为controlsuite3.4.9的安装目录。在相同的变量设置界面中,编辑“Path”变量,加入controlsuite3.4.9的\\bin目录,以确保能够调用其中的可执行文件和库。 完成软件环境变量的设置后,我们可以打开Visual Studio或MATLAB,开始编写控制算法、仿真或实时控制应用程序。在Visual Studio中,我们需要添加controlsuite3.4.9库文件和头文件到项目依赖项中。在MATLAB中,我们同样需要添加相应的路径到MATLAB路径变量中,以便能够调用controlsuite3.4.9仿真器和功能函数。 总之,controlsuite3.4.9安装需要注意软件环境变量设置和组件安装选择。用户可以按需选择组件,以便获得最大的控制套件功能。安装完成后,可以通过Visual Studio或MATLAB来编写控制应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值