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;
}