第一题:
1,问题描述
冒泡排序。
2,问题思路
冒泡排序总共有两层循环,第一层循环是总共需要排序的次数,由于我们每次默认最后一个数字是有序的,因此,每次的遍历次数为n-1,而内层循环的目的是调整部分序列为有序序列,每次都从数组的第一个数开始,由于第i次的时候,有序数组的长度为i,因此我们遍历结束的条件是n-1-i,这或许有点抽象,大家在代码里看看吧。
【注】想要了解更多的排序方式,大家可以参考这篇文章(基础算法总结)。
3,参考代码
/*****************************
File name:bubble sorting
Author:zhangsan Version:1.0 Date:2018/3/19
Description:输入数字,对它进行冒泡排序
*****************************/
#include "stdio.h"
/*****************************
*函数名: swap
*作用:交换两个数的值
*参数:*i - 第一个数的地址 *j - 第二个数的地址
*返回值:无
*****************************/
swap(int *i, int *j){
int temp;
temp = *i;
*i = *j;
*j = temp;
}
/*****************************
*函数名: bubble_sort
*作用:冒泡排序
*参数:*a - 传进来的排序数组
*返回值:无
*****************************/
bubble_sort(int *a){
int i,j;
for( i = 0; i <10 - 1 ; i++){
for( j = 1; j < 10 - 1 -i; j++){
if(a[j] < a[j-1])
swap(&a[j],&a[j-1]);
}
}
}
/*****************************
*函数名: display
*作用:遍历的输出数组的值
*参数:*a - 传进来的排序数组 n-传入数组的长度
*返回值:无
*****************************/
display(int *a,int n){
int i;
for( i = 0; i < n; i++){
printf("%d ",a[i]);
}
}
//主函数
int main(){
int a[10],i;
printf("请输入10个数字(中间使用空格隔开):\n");
for( i = 0; i < 10; i++){
scanf("%d",&a[i]);
}
bubble_sort(a); //对原数组进行排序
display(a,10); //输出数组的值
return 0;
}
第二题:
1,问题描述
一坐标轴表示某道路,从0开始到L,整数位置上都种有一棵树,现改路维修,要砍掉铁路上的树木(铁路可以重叠)。例如:L等于10,铺设四条铁路,坐标是(1,2)、(2,3)、(2,8)、(3,5),那么1到8坐标点的树都要砍掉,剩下0,9,10三颗。程序要求,输入L,输入铺设铁路条数m,然后输入m铁路的坐标。求剩下多少颗树。
2,问题思路
建一个数组,然后设置为1,当在修铁路时把那一段的数字都改为0,最后统计还剩多少1。(或许还有更好的思路,能否用二维数组?)
3,参考代码
/*****************************
File name:Tree
Author:zhangsan Version:1.0 Date:2018/3/19
Description:留树的问题
*****************************/
#include "stdio.h"
/*****************************
*函数名:init
*作用:初始化数组,全设为1表示都存在一棵树
*参数:*a - 整个定义好的数组
*返回值:无
*****************************/
init(int *a,int n){
int i;
for( i = 0; i <= n; i++){
a[i] = 1;
}
}
/*****************************
*函数名: display
*作用:遍历的输出数组的值
*参数:*a - 传进来的排序数组 n-传入数组的长度
*返回值:无
*****************************/
display(int *a,int n){
int i;
printf(" ---->现在保留下来的树木为:");
for(i=0;i<n+1;i++){
if(a[i]){
printf("%d-",i);
}
}
printf("。");
}
//主函数
int main(){
int i,j,l,m;
printf("请输入路的总长度:L = ");
scanf("%d",&l); //输入总长度
int a[l+1];
init(a,l+1); //初始化树的数组
printf("\n请输入铺设铁路的总条数:M = ");
scanf("%d",&m); //输入总条数
for(i = 1; i <= m; i++){
int start,end; //设置开始和结束值,然后把其中的值全换为0
printf("\n请输入第%d条铁路的开始位置和结束位置(中间拿空格隔开):",i);
scanf("%d %d",&start,&end);
while(start <= end){
a[start] = 0;
start++;
}
}
display(a,l); //输出结果
return 0;
}
第三题:
1,问题描述
字符处理:输入某字符,以"#"结束。输出的字符串要满足以下要求:①删除元音字母(包括大小写)。②辅音字母前加“!”。③字母大小写互换。例如:输入"tour#",输出"!T!R"。
2,问题思路
①什么是元音,什么是辅音?答:除了a、e、i、o、u以外的全是辅音!
②字母大小写,在系统中,ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。32是空格,48~57是0到9十个阿拉伯数字;65~90为26个大写英文字母,97~122号为26个小写英文字母。
③对于字符串的处理,你可以选择两种方式:一为输入完集中处理,二是一边输入一边处理。还是看个人喜好吧。
3,参考代码
/*****************************
File name:Test2
Author:zhangsan Version:1.0 Date:2018/3/19
Description:字符串的处理
*****************************/
#include "stdio.h"
//主函数
int main(){
char c;
while((c=getchar())!='#')
{
if(c=='a'||c=='A'||c=='e'||c=='E'||c=='i'||c=='I'||c=='o'||c=='O'||c=='u'||c=='U')
continue;
if(c >= 'a' && c <= 'z')
printf("!%c",c-32);
if(c >= 'A' && c <='Z')
printf("!%c",c+32);
}
return 0;
}
第四题:
1,问题描述
有一矩形和以正方形。输入矩形的长n,宽m,和正方形边长a。输出至少多少个这样正方形能把该矩形完全覆盖(当然覆盖面积大于矩形)
2,问题思路
该该问题主要在于分类讨论,有三种情况①当a > n时,此时最简单,一个正方形便可完全覆盖长方形。②当n > a >m时,此时只要求出 n/a+1,那便是需要的正方形数目。③当 a < m时,此时个数为(n/a+1)*(m/a+1)。
3,参考代码
/*****************************
File name:Test2
Author:zhangsan Version:1.0 Date:2018/3/19
Description:长方形被正方形覆盖的问题
*****************************/
#include "stdio.h"
/*****************************
*函数名: solve_sum
*作用:求出总的个数
*参数:n - 长方形的长 m-长方形的宽 a-正方形的边长
*返回值:无
*****************************/
solve_sum(int n,int m,int a){
int sum;
if( a < m ){
sum = (n/a+1) * (m/a+1);
}else if( a < n ){
sum = n/a+1;
}else {
sum = 1;
}
printf("覆盖长 X 宽为%d x %d 的长方形需要%d个边长为%d的正方形。",n,m,sum,a);
}
//主函数
int main(){
int n,m,a;
printf("请分别输入长方形的长宽和正方形的边长(中间拿空格隔开):\n");
scanf("%d %d %d",&n,&m,&a);
solve_sum(n,m,a); //主要的判断方法
return 0;
}
-----------------------------END---------------------------------