1、输出图形及二维数组应用
1.1.输出图形
描述
编写程序打印n行如下图形,其中1≤n≤500。
输入用例
7
输出用例
具体实现
#include"stdio.h"
int main(){
int n,i,j;
scanf("%d",&n);
for(i = 1; i<= n; i++){
for (j = 1; j<= n-i; j++)
printf(" ");
for(j =1 ;j<=i; j++)
printf("%c",'A'+(n-j)%26);
for(j =1 ;j<=i-1; j++)
printf("%c",'A'+(n+j-i)%26);
printf("\n");
}
return 0;
}
1.2.旋转数字
描述
编写程序打印n行如下菱形图形(1≤n≤99),图形有n行n列个整数,图形从第1行的中间开始,数字分别是1,2,……n*n-1,n*n,并且顺时针向中间转入,如果1个数据项宽度不足n*n位,用0补足到n*n位。
输入用例
7
输出用例
具体实现
#include "stdio.h"
const int N0 = 100;
struct Dir{
int row,col;
}dir[4] = {{1,1},{1,-1},{-1,-1},{-1,1}};
int a[2*N0][2*N0] = {0};
int main(){
int n,i,j,m;
scanf("%d",&n);
int row,col,rowTest,colTest,d=0;
row = 1;
col = n;
m = 0;
i = n*n;
while(i){
i/=10;
m++;
}
for(i = 1; i<= n*n; i++){
a[row][col] = i;
rowTest = row + dir[d].row;
colTest = col + dir[d].col;
if(rowTest < 1 || rowTest >= 2*n || colTest < 1 || colTest >= 2*n || a[rowTest][colTest] != 0){
d = (d+1)%4;
rowTest = row + dir[d].row;
colTest = col + dir[d].col;
}
row = rowTest;
col = colTest;
}
for( i = 1; i < 2*n ; i++){
for (j = 1; j< 2*n; j++)
if(i<=n && j<n+i || i>n && j<3*n-i)
{
if(a[i][j] == 0)
printf("%*c",m,' ');
else
printf("%0*d",m,a[i][j]);
}
printf("\n");
}
return 0;
}
1.3求和
描述
有1个n×n的矩阵,从左上到右下称为主斜线(倾角135º),从右上到左下称为次斜线(倾角45º),在主斜线上最大,次斜线上最小的元素称为该矩阵的斜线鞍点,求出该矩阵所有斜线鞍点的和。
如5×5的矩阵:元素7为上面矩阵的一个斜线鞍点,元素10和19也是上面矩阵的斜线鞍点。
输入用例
5
3 2 5 98 10
44 12 1 12 8
67 61 45 7 19
12 21 33 56 3
35 36 78 98 19
输出用例
36
具体实现
#include "stdio.h"
const int N0 = 105;
int a[N0][N0];
int n;
void readData(){
int i,j;
scanf("%d",&n);
for(i =1 ; i<=n ; i++)
for(j=1; j<=n; j++)
scanf("%d",&a[i][j]);
}
bool masterMax(int i, int j){
int p,q;
for(p=1; p<=n ; p++)
for(q=1; q<=n; q++)
if(p-q == i-j && a[p][q] > a[i][j])
return false;
return true;
}
bool slaverMin(int i,int j){
int p,q;
for(p=1; p<=n ; p++)
for(q=1; q<=n; q++)
if(p+q == i+j && a[p][q] < a[i][j])
return false;
return true;
}
int main(){
int i,j,total;
readData();
for(total = 0, i=1; i<=n; i++)
for(j=1; j<=n; j++)
if(masterMax(i,j) && slaverMin(i,j))
total += a[i][j];
printf("%d\n",total);
return 0;
}
2、数组与结构体应用
2.1.数组中的元素查找
描述
一维数组a中有20个整数,编写程序在数组a中查找元素q,如果找到第一个等于q的元素,则输出该元素在数组中的下标;如果没找到则输出-1。
输入用例
5
3 21 5 98 44 12 64 7 66 96 76 67 61 2 13 16 9 78 56 69
输出用例
2
具体实现
#include <stdio.h>
#include<math.h>
int main (){
int a[20];
int i,q,flag=0;
scanf("%d",&q);
for (i=0;i<20;i++)
scanf("%d",&a[i]);
for(i=0;i<20;i++)
if (a[i]==q){
break;
}
if (i<20)
printf("%d",i);
else
printf("-1");
return 0;
}
2.2.多重元素下标查找
描述
一维数组a中有10个整数,编写程序在数组a中查找所有值等于q的元素,并输出这些元素在数组中的下标;如果没找到则输出-1。
输入用例
58
57 89 76 35 58 65 58 73 58 47
输出用例
4 6 8
具体实现
#include <stdio.h>
#include<math.h>
int main (){
int a[10];
int i,q,flag=0;
scanf("%d",&q);
for (i=0;i<10;i++) scanf("%d",&a[i]);
for(i=0;i<10;i++)
if (a[i]==q){
printf("%d ",i);
flag++;
}
if (flag) ;//这有一个空语句
else
printf("-1");
return 0;
}
2.3.极端偏差成绩查找
描述
输入某班级n(0<n<100)个学生的成绩到数组a中,找出所有成绩中与平均值绝对偏差最大的学生成绩,并输出该学生的成绩。
输入用例
10
23 21 5 17 19 42 6 10 8 31
输出用例
42
#include <stdio.h>
#include<math.h>
int main ()
{
int a[100];
int i,n,c,k,sum=0,avg;
scanf("%d",&n);
for (i=0;i<n;i++) scanf("%d",&a[i]);
for (i=0;i<n;i++) sum=sum+a[i];
avg=sum/n;
c=fabs(a[0]-avg);
k=0;
for (i=0;i<n;i++)
if (fabs(a[i]-avg)>c){
c=fabs(a[i]-avg);
k=i;
}
printf("%d",a[k]);
return 0;
}
2.4.学生成绩标准差计算
描述
输入某班级n(0<n<100)个学生的成绩到数组a中,编写程序求成绩的标准差,求标准差的公式如下:
其中,表示学生的总平均成绩,表示第i个学生的成绩。
输入用例
6
95 85 75 65 55 45
输出用例
18.708
具体实现
#include <stdio.h>
#include<math.h>
int main (){
int a[100];
int i,n,c,k;
double st,sum=0,avg;
scanf("%d",&n);
for (i=0;i<n;i++)
scanf("%d",&a[i]);
for (i=0;i<n;i++)
sum=sum+a[i];
avg=sum/n;
sum=0;
for (i=0;i<n;i++){
sum=sum+(a[i]-avg)*(a[i]-avg);
}
st=sqrt(sum/(n-1));
printf("%.3lf",st);
return 0;
}
2.5.次对角线元素求和
描述
有一个5×5矩阵(即二维数组b),编写程序输出该矩阵次对角线上的所有元素之和。
输入用例
3 21 5 98 10
44 12 1 12 8
67 61 45 67 17
12 21 33 56 34
35 36 78 90 19
输出用例
123
具体实现
#include <stdio.h>
#include<math.h>
int main (){
int b[5][5];
int i,j;
long sum;
for (i=0;i<5;i++)
for(j=0;j<5;j++)
scanf("%d",&b[i][j]);
sum=0;
for(i=0,j=5;i<5;i++){
j--;
sum=sum+b[i][j];
}
printf("%ld",sum);
return 0;
}
2.6.矩阵对角线区域调整
描述
有一个5×5矩阵(即二维数组b),编写程序将矩阵的左下三角(含主对角线)各元素加10,右上三角各元素(不含主对角线)减10。
输入用例
13 21 55 98 47
12 18 19 67 61
89 80 36 78 10
89 87 67 80 12
12 33 88 57 70
输出用例
23 11 45 88 37
22 28 9 57 51
99 90 46 68 0
99 97 77 90 2
22 43 98 67 80
具体实现
#include <stdio.h>
#include<math.h>
int main (){
int b[5][5];
int i,j;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
scanf("%d",&b[i][j]);
if(i<j){
b[i][j]-=10;
}else{
b[i][j]+=10;
}
printf("%d ",b[i][j]);
}
printf("\n");
}
return 0;
}
2.7.二维数组先列后行降序排序
描述
有一个n行m列(0<n<20,0<m<20)的整型二维数组b,编写程序对二维数组b[n][m]先按列降序排序,再按行降序排序。
输入用例
4 5
21 3 5 98 10
44 12 1 12 8
67 61 45 67 17
35 36 78 90 19
输出用例
98 78 67 61 19
90 45 44 36 17
67 35 12 10 5
21 12 8 3 1
具体实现
#include <stdio.h>
int main (){
int b[20][20];
int n,m,i,j,k,temp;
scanf("%d%d",&n,&m);
for (i=0;i<n;i++)
for(j=0;j<m;j++)
scanf("%d",&b[i][j]);
for(k=0;k<m;k++)
for(i=n-1;i>0;i--)
for(j=0;j<i;j++)
if(b[j][k]<b[j+1][k]){
temp=b[j][k];
b[j][k]=b[j+1][k];
b[j+1][k]=temp;
}
for(k=0;k<n;k++)
for(i=m-1;i>0;i--)
for(j=0;j<i;j++)
if(b[k][j]<b[k][j+1]){
temp=b[k][j];
b[k][j]=b[k][j+1];
b[k][j+1]=temp;
}
for (i=0;i<n;i++){
for(j=0;j<m;j++)
printf("%d ",b[i][j]);
printf("\n");
}
return 0;
}
2.8. 二维数组字符串升序排序
描述
输入n个字符串(长度小于20)存入二维数组c中,编写程序对其进行排序(由小到大)并按次序输出。
输入用例
3
bcd
abd
abc
输出用例
abc
abd
bcd
具体实现
#include<stdio.h>
#include<string.h>
void myGets(char s[]){
char ch;
while((ch=getchar())!='\n' && ch!=EOF)
*s++=ch;
*s=0;
}
int main(){
char c[20][20],temp[20];
int n,i,j;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
gets(c[i]);
for(i=n-1;i>0;i--)
for(j=0;j<i;j++)
if(strcmp(c[j],c[j+1])>0){
strcpy(temp,c[j]);
strcpy(c[j],c[j+1]);
strcpy(c[j+1],temp);
}
for(i=0;i<n;i++)
puts(c[i]);
return 0;
}
2.9.删除小写字符形成新字符串
描述
从键盘输入一个字符串s,删除其中所有的小写字符后形成一个新字符串,然后输出。
输入用例
www.163.com
输出用例
.163.
具体实现
#include <stdio.h>
#include <string.h>
int main (){
char s[30];
int i,j;
gets(s);
i=0;
while (s[i]!='\0'){
if(s[i]>='a' && s[i]<='z'){
j=i;
while (s[j]!='\0'){
s[j]=s[j+1];
j++;
}
s[j-1]='\0';
}
else i++;
}
puts(s);
return 0;
}
2.10.恺撒密码加密
描述
朱迪斯·恺撒在其政府的秘密通信中使用恺撒密码进行信息加密,恺撒加密因而得其名。凯撒密码的基本思想是将待加密的信息(称为明文)中每个字母在字母表中向后移动常量key,得到加密信息(称为密文)。例如,假设字母表为小写英文字母表,key等于3,则对于明文computer systems将加密为frpsxwhu vbvwhpv。
输入用例
3
computer system
输出用例
frpsxwhu vbvwhpv
具体实现
#include <stdio.h>
#include <string.h>
int main (){
char s[100]={0};
int i,key;
scanf("%d",&key);
while(getchar()!='\n');
gets(s);
i=0;
while (s[i]!='\0'){
if ((s[i]>=65 && s[i]<=90) ){
s[i]=(s[i]+key-65)%26+65;
}
if (s[i]>=97 && s[i]<=122){
s[i]=(s[i]+key-97)%26+97;
}
i++;
}
puts(s);
return 0;
}
2.11.优秀学生信息输出
描述
有n个学生,每个学生的数据包括学号、姓名和成绩,要求输出成绩优秀(大于等于90分)学生的信息(包括学号、姓名和整型成绩)。如果没有符合条件的,则输出“No”。
输入用例
3
1001 Make 86
1002 Linda 58
1003 Jone 90
输出用例
1003 Jone 90
具体实现
#include <stdio.h>
#include <string.h>
int main (){
struct student{
int num;
char name[10];
int score;
};
struct student stu[20];
int n,i,flag=0;
scanf("%d",&n);
for (i=0;i<n;i++){
scanf("%d%s",&stu[i].num,stu[i].name);
scanf("%d",&stu[i].score);
}
for (i=0;i<n;i++)
if (stu[i].score>=90){
flag=1;
printf("%d %s %d\n",stu[i].num,stu[i].name,stu[i].score);
}
if(flag==0)
printf("No");
return 0;
}
2.12.高分学生筛选输出
描述
有n个学生,每个学生的数据包括学号、姓名和3门课程的成绩,要求输出平均成绩高于90分以上(包括90分)或全部课程成绩均在85分以上(包括85分)的学生信息(包括学号和姓名),如果没有符合条件的,则输出“No”。
输入用例
3
1001 Make 86 91 89
1002 Linda 78 78 80
1003 Jone 90 67 71
输出用例
1001 Make
具体实现
#include <stdio.h>
#include <string.h>
int main (){
struct student{
int num;
char name[10];
int score[3];
float avg;
};
struct student stu[20];
int n,i,sum,flag=0;
scanf("%d",&n);
for (i=0;i<n;i++){
scanf("%d%s",&stu[i].num,stu[i].name);
scanf("%d%d%d",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
}
for (i=0;i<n;i++){
stu[i].avg=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;
if ((stu[i].avg>=90)||(stu[i].score[0]>=85 && stu[i].score[1]>=85 && stu[i].score[2]>=85)){
flag=1;
printf("%d %s\n",stu[i].num,stu[i].name);
}
}
if(flag==0) printf("No");
return 0;
}