【C语言】编程练习及答案(C基础综合练习一)

C基础综合练习一


1.输入一个字符串,删除空格。

#include<stdio.h>
#include<string.h>
 
int main(int argc, const char *argv[])
{
	char str[100]=""; 	//定义一个字符串
	gets(str);	//输入一个字符串
	int i=0,j=0;
	while(str[i])	//遍历字符串到'\0'停止
	{
		if(str[i]==' ')		//找到空格的位置
		{
			j=i;
			while(str[j])	//将空格位置后面的字符都往前移一位,即删除空格
			{
				str[j]=str[j+1];
				j++;
			}
		}else i++;			//当所在位置不是空格时,往后遍历,直到删除所有空格
	}
	puts(str); 
	return 0;
}

2.输入一个字符串,实现单词的逆置。要求用两步:1)先整体逆置; 2)单词逆置。

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
	char str[100]="";	//定义一个字符串
	gets(str);	//输入一个字符串
	//1.先整体逆置
	size_t len=strlen(str);		//计算出输入的字符串实际的长度
	char temp=0; 					//借助这个字符来交换两个字符
	for(int i=0,j=len-1;i<j;i++,j--)	//对分交换
	{
		temp=str[i];
		str[i]=str[j];
		str[j]=temp;
	}
	//2.单词逆置
	//可以根据单词末尾是空格的特性来写,该空格前面得是字符
	int i=0,position=0,j=0,k=0; 	//i是遍历到的字符位置,position是记录每个单词的起始位置
	while(str[i])
	{
		if(str[i]!=' '&&(str[i+1]==' '||str[i+1]=='\0'))				//找到单词结束位置
		{
			for(j=position,k=i;j<k;j++,k--)		//将单词位置和起始位置给循环变量直接对每个单词进行二分交换
			{
				temp=str[j];
				str[j]=str[k];
				str[k]=temp;
			}	
			position=i=i+2;								//下一个单词的开始位置
		}else if(str[i]==' '&&str[i-1]==' ')position=i=i+1;
		//这样下一个单词位置就始终不会是空格了,多个空格可能造成下一个单词起始位置混乱		
		else i++;
	}
	puts(str); 		//输出一个字符串 
	return 0;
}

3.输入一个字符串,计算单词的个数。

#include<stdio.h>
 #include<string.h>

int main(int argc, const char *argv[])
{
	char str[100]="";	//定义一个字符串
	gets(str);	//输入一个字符串
	int i=0,count=0; 	//定义单词计数器count
	while(str[i])
	{
		//字母后面是空格或者是结束符'\0'时,就是有一个单词
		if(str[i]!=' '&&(str[i+1]==' '||str[i+1]=='\0'))count++;
		i++;
	}
	printf("单词个数有%d个\n",count);
	return 0;
}

4.穷举算法:“鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。百钱买百鸡,问鸡翁、鸡母、鸡雏各几何?”。

#include<stdio.h>

int main(int argc, const char *argv[])
{
	int papa=0,mama=0,bebe=0; 	//定义存储鸡翁、鸡母、鸡雏数量的变量
	for(papa=0;papa<100/5;papa++)
	{
		for(mama=0;mama<(100-5*papa)/3;mama++)
		{
			bebe=100-mama-papa;
			if(5*papa+3*mama+bebe/3==100&&bebe%3==0)
			{
				printf("鸡翁、鸡母、鸡雏各%d、%d、%d只\n",papa,mama,bebe);
			}
		}
	}
	return 0;
}

5.打印小九九乘法口诀图形,如下图。

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
	for(int i=1;i<=9;i++)
	{
		for(int j=1;j<=i;j++)
		{
			printf(" %d*%d=%d\t",j,i,i*j);
		}
		putchar(10);
	}
	return 0;
}

此代码运行打印结果:


6.循环输入n个元素,交换数组中最大值和最小值。

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
	int n=0;
	scanf("%d",&n);
	int a[n],max=0,min=0,temp=0;
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		if(a[max]<a[i])max=i;
		if(a[min]>a[i])min=i;
	}
	temp=a[max];
	a[max]=a[min];
	a[min]=temp;
	for(int i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}

7.输入字符串,输入变量k的值,将字符循环右移k位。

答案bug改好了,我这里的i是相当于一个定位器,当字符串的长度为单数时,结束位置是在k+1位置上,而双数是k位置上。

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
	
	char str[100];
	gets(str);
	size_t len=strlen(str);
	int k=0;
	printf("请输入k值:");
	scanf("%d",&k);
	char tempstr[k];
	int i=k-1,j=k;
	for(int s=0;s<k;s++)
	{
		tempstr[s]=str[s];
	}
	char temp=0;
	while(i!=k&&i!=k-1)    //单数双数结束条件不一样
	{
		i=j;
		if(i+k<len)
		{
			for(j=i;j<i+k;j++)
			{
				temp=tempstr[j-i];
				tempstr[j-i]=str[j];
				str[j]=temp;
			}
		}else
		{
			for(int s=0;s<k;s++)
			{
				if(j<len)
				{
					temp=tempstr[s];
					tempstr[s]=str[j];
					str[j]=temp;
				}else
				{
					j=j%len;
					temp=tempstr[s];
					tempstr[s]=str[j];
					str[j]=temp;
				}
				j++;
			}
		}
		i=j;
	}
	puts(str);
	
	return 0;
}

8.定义字符串并输入,实现对字符串每个字符升序排序。

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
	char str[100],temp;
	gets(str);
	size_t len=strlen(str);//想用冒泡排序
	for(int i=0;i<len;i++)
	{
		for(int j=0;j<len-i-1;j++)
		{
			if(str[j]>str[j+1])
			{
				temp=str[j];
				str[j]=str[j+1];
				str[j+1]=temp;
			}
		}
	}
	puts(str);
	return 0;
}

9.输入5个学生姓名,请输出姓名中的最大值。

#include<stdio.h>
#include<string.h>

int main(int argc, const char *argv[])
{
	char name[5][20];
	for(int i=0;i<5;i++)
	{
		gets(name[i]);
	}
	char maxname[]="";
	strcpy(maxname,name[0]);
	for(int i=0;i<5;i++)
	{
		if(strcmp(name[i],maxname)>0) strcpy(maxname,name[i]);
	}
	puts(maxname);
	return 0;
}

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值