C语言练习题
一、环行取数
环行取数,逆时针输出数组数据
/*
功能:环行取数,逆时针输出数组数据
输入:1 2 3
4 5 6
7 8 9
输出:1 4 7 8 9 6 3 2 5
*/
#include<stdio.h>
int main()
{
int m,n; //数组的行、列
scanf("%d%d",&m,&n);
int a[m][n];
int i,j; //用于循环
for(i = 0;i < m;i++)
{
for(j = 0;j < n;j++)
{
scanf("%d",&a[i][j]);
}
}
i = -1;
j = 0;
int sum = m*n; //数组的总数
while(sum)
{
//逆时针输出 列不变 行+1
while(a[++i][j] != -1 && i < m) //当不重复输出且行不超纲时 继续输出
//不用i++是因为 前一个判断条件和后一个判断条件的i值会不同
{
printf("%d ",a[i][j]);
a[i][j] = -1; //输出过的数赋值为-1
sum--; //总数-1
}
i--; //回到当前行,因为前面的++i,让i大了一个
//无路可走 就向右输出 行不变 列+1
while(a[i][++j] != -1 && j < n) //当不重复输出且列不超纲时 继续输出
{
printf("%d ",a[i][j]);
a[i][j] = -1; //输出过的数赋值为-1
sum--; //总数-1
}
j--;
//无路可走 向上输出 列不变 行-1
while(a[--i][j] != -1 && i > -1) //当不重复输出且行不小于0时 继续输出
{
printf("%d ",a[i][j]);
a[i][j] = -1; //输出过的数赋值为-1
sum--; //总数-1
}
i++;
//无路可走 向左输出 行不变 列-1
while(a[i][--j] != -1 && j > -1) //当不重复输出且列不小于0时 继续输出
{
printf("%d ",a[i][j]);
a[i][j] = -1; //输出过的数赋值为-1
sum--; //总数-1
}
j++;
}
return 0;
}
二、数组查找及替换
数组查找及替换 元素个数不超过100 b的值在1-100之间
/*
功能:数组查找及替换 元素个数不超过100 b的值在1-100之间
输入:第一行为元素个数和整数b
第二行为数组各个元素
输出:删除数组中可以被b整除的元素,剩下的元素从小到大排列,如果其值在A-Z的ascll码之间,替换为对应字母
*/
#include<stdio.h>
void paixu(int a[],int n)
{
int h,i,j,k;
for(i = 1;i < n;i++) //从第2个数开始
{
int min = a[i]; //赋a[i]的值给min
for(j = i-1;j >= 0;j--)
{
if(min < a[j]) //如果min的值小于a[j]的值,a[j]后的值往后挪1.
{
a[j+1] = a[j];
a[j] = min;
}
}
}
printf("排序后结果是:\n");
for(k = 0;k < n;k++)
{
printf("%d ",a[k]);
}
printf("\n");
}
int main()
{
int n,b; //元素个数 整除的数
scanf("%d%d",&n,&b);
int a[n],c[n];
int i,j = 0; //数组元素
for(i = 0;i < n;i++)
{
scanf("%d",&a[i]);
if(a[i]%b != 0)
{
c[j++] = a[i];
}
}
paixu(c,j);
for(i = 0;i < j;i++)
{
if(c[i]>=65 && c[i]<=90) //看是否在A-Z之间
{
printf("%c ",c[i]);
}
else
{
printf("%d ",c[i]);
}
}
return 0;
}
三、字符删除
/*
功能:字符删除
输入:第一行是一个字符串(内部没有空格)
第二行是要删除的字符
输出:删除字符后的字符串
*/
#include<stdio.h>
#include<string.h>
int main()
{
char str[20];
char str2[20];
char ch;
int i,j;
fgets(str,20,stdin);
/*
s 代表要保存到的内存空间的首地址,可以是字符数组名,也可以是指向字符数组的字符指针变量名。
size 代表的是读取字符串的长度。
stream 表示从何种流中读取,可以是标准输入流 stdin,
也可以是文件流,即从某个文件中读取,这个在后面讲文件的时候再详细介绍。
标准输入流就是前面讲的输入缓冲区。
所以如果是从键盘读取数据的话就是从输入缓冲区中读取数据,
即从标准输入流 stdin 中读取数据,所以第三个参数为 stdin。
*/
scanf("%c",&ch);
//int lenth = strlen(str);
for(i = 0;str[i]!='\0';i++)
{
if(str[i] != ch)
{
str2[j++] = str[i];
}
}
str2[j] = '\0';
printf("%s",str2);
return 0;
}
四、哈夫曼树
求哈夫曼树的总费用
/*
功能:求哈夫曼树的总费用
输入:第一行为一个正整数n(n<=100)
第二行为n个正整数,每个数不超过1000
举例:5
5 3 8 2 9
输出:总费用
59
*/
#include<stdio.h>
#define MAX 1000
int main()
{
int n; //输入的个数 小于100
scanf("%d",&n);
int p[n];
int i; //用于循环
int mini,minj,flag,sum;
for(i = 0;i < n;i++)
{
scanf("%d",&p[i]);
}
mini = minj = MAX;
while(1)
{
for(i = 0;i < n;i++) //先找出第一个最小值
{
if(p[i]< mini)
{
mini = p[i];
flag = i;
}
}
p[flag] = MAX; //mini保存后将第一个最小值赋值为MAX,避免影响第二个最小值
for(i = 0;i < n;i++) //找第二个最小值
{
if(p[i]< minj)
{
minj = p[i];
flag = i;
}
}
p[flag] += mini; //和又进入下一次的费用
if(minj == MAX)
{
break;
}
else
{
sum = mini + minj;
mini = minj = MAX;
}
}
printf("%d",sum);
return 0;
}