101 使用数组统计学生成绩
输入学生的学号及语文、数学、英语成绩,输出学生各科成绩及平均成绩信息。
1、可宏定义学号及各科成绩的最大范围,这样可更改
2、平均值放在float
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#define MAX 50
main()
{
int name[MAX], ch[MAX], en[MAX], ma[MAX];
float avg[MAX];
int i = 0, num;
printf("输入学生总数\n");
scanf("%d", &num);
for(i = 0; i < num; i++)
{
scanf("%d %d %d %d", &name[i], &ch[i], &en[i], &ma[i]);
}
//求平均值
for(i = 0; i < num; i++)
{
avg[i] = ( ch[i] + en[i] +ma[i]) /3;
}
//输出学号&平均值
for(i = 0; i < num; i++)
{
printf("学号: %d, 平均成绩:%f \n", name[i], avg[i]);
}
printf("\n");
}
102 查找数组中的最值
实现查找数组中的最大值和最小值,并将最大值和最小值对应的下标和数值输出:
先将最大值和最小值赋值为数组的第一个数,后在通过for分别和数组中其他值比较。
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
int ch[20];
int i = 0, num, max, min, j, k;
printf("输入个数\n");
scanf("%d", &num);
for(i = 0; i < num; i++)
{
scanf("%d", &ch[i]);
}
max = ch[0];
min = ch[0];
for(i = 1; i < num; i++)
{
if(ch[i] > max)
{
max = ch[i];
j = i;
}
if(ch[i] < min)
{
min = ch[i];
k = i;
}
}
printf("最大值: %d, 第:%d \n", max, j);
printf("最小值: %d, 第:%d \n", min, k);
printf("\n");
}
103 判断一个数是否存在数组中
定义一个数组,并为这个数组初始化,在屏幕上输入一个整数来查看是否在数组中。
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
int ch[10] = {10, 20, 30, 40,50, 60, 70,80,90,100};
int i = 0, num;
printf("输入整数\n");
scanf("%d", &num);
for(i = 0; i < 10; i++)
{
if(num == ch[i])
{
printf("存在该整数,在第%d 个\n", i);
return 0;
}
}
printf("不存在该整数 \n");
printf("\n");
}
104 求二维数组对角线之和
有一个4 * 4 的矩阵,要求编程求出其从左上到右下的对角线之和。
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
int a[4][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}, { 9, 10, 11, 12}, {13, 14, 15, 16}};
int i = 0, j = 0, sum = 0;
for(i = 0; i < 4; i++)
{
for(j = 0; j < 4; j++)
{
if(i == j)
{
sum += a[i][j];
}
}
}
printf("和: %d \n", sum);
printf("\n");
}
105 模拟比赛打分
从键盘输入选手数目,然后输入裁判对每个选手的打分情况。这里假设裁判5个人,最后输出每位选手的总成绩。
就定义一个数组来存放裁判的分数
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
float a[100], b[100], sum = 0;
int i = 0, j = 1, n = 0;
printf("输入个数\n");
scanf("%d", &n);
for(i = 1; i <= n ; i++)
{
printf("now player %d\n", i);
for(; j < 5 * n + 1; j++)
{
scanf("%f", &a[j]);
sum += a[j];
if(j %5 == 0)
{
break;
}
}
b[i] = sum;
sum = 0;
j++;
}
j = 1;
printf("player judgeA judgeB judgeC judgeD judgeE total\n");
for(i = 1; i <= n; i++)
{
printf(" player %d ", i);
for(; j < 5 *n + 1; j++)
{
printf("%8.1f", a[j]);
if(j % 5 == 0)
{
break;
}
}
printf("%8.1f\n",b[i]);
j++;
}
printf("\n");
}
这里将各个裁判分成5个数组,最后在算总和,
优点:通俗易懂
缺点:冗余
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
#define MAX 50
main()
{
int num1[MAX], num2[MAX], num3[MAX], num4[MAX], num5[MAX],sum[MAX];
int i = 0, j = 0, num = 0;
printf("输入个数");
scanf("%d", &num);
for(i = 0; i < num ; i++)
{
scanf("%d", &num1[i]);
}
for(i = 0; i < num ; i++)
{
scanf("%d", &num2[i]);
}
for(i = 0; i < num ; i++)
{
scanf("%d", &num3[i]);
}
for(i = 0; i < num ; i++)
{
scanf("%d", &num4[i]);
}
for(i = 0; i < num ; i++)
{
scanf("%d", &num5[i]);
}
for(i = 0; i < num ; i++)
{
sum[i] = num1[i] + num2[i] + num3[i] + num4[i]+ num5[i];
}
for(i = 0; i < num ; i++)
{
printf("第%d位 和: %d \n", i,sum[i]);
}
printf("\n");
}
106矩阵的转置
将一个二维数组的行和列元素互换,存到另外一个二维数组中。
1、输入需要转换的数组元素的行和列,再输入数组
数组a的 i 行 j 列存到数组b 的 j 行 i 列。
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
int a[100][100], b[100][100];
int i1, j1, i, j;
printf("输入几行");
scanf("%d",&i1);
printf("输入几列");
scanf("%d", &j1);
for(i = 0; i < i1; i++)
{
for(j = 0; j < j1; j++)
{
scanf("%d",&a[i][j]);
}
}
for(i = 0; i < i1; i++)
{
for(j = 0; j < j1; j++)
{
b[j][i] = a[i][j];
}
}
for(i = 0; i < i1; i++)
{
for(j = 0; j < j1; j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
printf("\n");
for(i = 0; i < i1; i++)
{
for(j = 0; j < j1; j++)
{
printf("%4d", b[i][j]);
}
printf("\n");
}
printf("\n");
}
107 设计魔方阵
魔方阵:由自然数组成方阵,方阵的每个元素都不相等,且每行和每列以及主副对角线的各个元素之和都相等
如3×3的魔方阵:
8 1 6
3 5 7
4 9 2
魔方阵的排列规律如下:
- (1)将1放在第一行中间一列;
- (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);
- (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;
- (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;
- (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
int a[6][6] = {0};
int i, j, x =1, y = 3;
for(i = 1; i <= 25; i++)
{
a[x][y] = i;
if(x == 1 && y == 5)
{
x +=1;
continue;
}
if(x == 1) //
{
x = 5;
}
else
{
x--;
}
if(y == 5)
{
y = 1;
}
else
{
y ++;
}
if(a[x][y] != 0) //如果新位置存在该数,则退回原来数的列的下一行
{
x += 2;
y -= 1;
}
}
for(i = 1; i <= 5; i++)
{
for(j = 1; j <= 5; j++)
{
printf("%4d", a[i][j]);
}
printf("\n");
}
printf("\n");
}
108 字符升序排列
将已按升序排好字符串a和字符串b按升序归并到字符串c输出。
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
char a[100], b[100], c[200], *p;
int i = 0, j = 0, k = 0;
scanf("%s", &a);
scanf("%s", &b);
while(a[i] != '\0' && b[j] != '\0')
{
if(a[i] > b[j])
{
c[k] = b[j];
j++;
}
else
{
c[k] = a[i];
i++;
}
k++;
}
c[k] = '\0';
if(a[i] == '\0')
{
p = b + j;
}
else
{
p = a + i;
}
strcat(c, p);
puts(c);
printf("\n");
}
109 在指定位置输入字符
在屏幕上输入一个字符串和一个要插入的字符,并输入要插入的位置,会在指定的位置插入指定的字符,并输出结果
插入字符注意点:
需要判断输入的字符串是否为空
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
void insert(char s[], char x, int pos)
{
char string[100];
if(strlen(s) == 0)
{
s[0] = x;
s[1] = '\0';
}
else
{
strncpy(string, s, pos);
string[pos] = x;
string[pos +1] = '\0';
strcat(string, (s + pos));
strcpy(s, string);
}
}
main()
{
char str[100], c;
int pos;
printf("input:\n");
gets(str);
printf("插入?\n");
scanf("%c", &c);
printf("位置?\n");
scanf("%d", &pos);
insert(str, c, pos);
puts(str);
printf("\n");
}
110 删除字符串中的连续字符
实现删除字符串中指定位置指定长度的连续字符串。运行后输入一个字符串,输入要删除的位置及长度,输出删除字符后的字符串。
缺点:耗资源 ,
主要应用字符串各个处理函数解决
————ME__
void del(char str[],int pos, int n)
{
char str2[100], str3[100];
int len, i, j;
strncpy(str2, str, pos);
len = strlen(str);
for(i = pos + n, j =0; i < len; i++, j++)
{
str3[j] = str[i];
}
strcat(str2, str3);
printf("%s", str2);
}
main()
{
char string[100];
int pos, n;
scanf("%s", &string);
printf("删除位置: \n");
scanf("%d", &pos);
printf("删除个数: \n");
scanf("%d", &n);
del(string, pos, n);
printf("\n");
}
____ 官方
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
//小逻辑处理
char *del(char s[],int pos, int n)
{
int i;
for(i = pos + n -1; s[i] != '\0'; i++, pos++)
{
s[pos - 1] = s[i];
}
s[pos - 1] ='\0';
return s;
}
main()
{
char string[100];
int pos, n;
scanf("%s", &string);
printf("删除位置: \n");
scanf("%d", &pos);
printf("删除个数: \n");
scanf("%d", &n);
del(string, pos, n);
printf("string = %s\n", string);
printf("\n");
}
111 统计各种字符个数
输入一组字符数,要求分别统计出其中英文字母,数字、空格以及其他字符的个数。
直接通过gets()获得字符串,然后在判断输入字符类型。
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<stdlib.h>
#include<string.h>
main()
{
char string[100];
int en = 0, num = 0, space = 0, other = 0, i;
gets(string);
for(i = 0; string[i] != '\0'; i++)
{
if(string[i] >= '0' && string[i] <= '9')
{
num++;
}
else if(string[i] >= 'a' && string[i] <= 'z' || string[i] >= 'A' && string[i] <='Z')
{
en++;
}
else if(string[i] == ' ')
{
space++;
}
else
{
other++;
}
}
printf("英文 = %d\n", en);
printf("空格 = %d\n", space);
printf("数字 = %d\n", num);
printf("其他 = %d\n", other);
printf("\n");
}
通过getchar()获得字符,while循环来判断结束条件,在循环中判断输入字符类型。
————官方
main()
{
char c;
int letters = 0, digit = 0, space = 0, others = 0;
while((c = getchar()) != '\n')
{
if(c >= '0' && c <= '9')
{
digit++;
}
else if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' )
{
letters++;
}
else if(c == ' ')
{
space++;
}
else
{
others++;
}
}
printf("英文 = %d\n", letters);
printf("空格 = %d\n", space);
printf("数字 = %d\n", digit);
printf("其他 = %d\n", others);
printf("\n");
}
112 字符串替换
实现将字符串“today is Monday”转变为“today is Friday”
char *replace(char *s1, char *s2, int pos)
{
int i, j = 0;
for(i = pos; s1[i] != '\0'; i++)
{
if(s2[j] != '\0')
{
s1[i] = s2[j];
j++;
}
else
{
break;
}
}
return s1;
}
main()
{
char string1[100], string2[100];
int position;
printf("输入string1:\n");
gets(string1);
printf("输入string2:\n");
gets(string2);
printf("输入位置:\n");
scanf("%d", &position);
replace(string1, string2, position);
printf("the string :%s", string1);
printf("\n");
}
113 回文字符串
回文字符串:正读反读都一样的字符串,如radar,要求从键盘中输入字符串,判断该字符串是否为回文字符串。
将输入的字符串一分为二,进行判断。
//me
int judge(char *str1, char *str2, int num)
{
int i, j = num - 1, k = 0;
for (i = 0; i < num; i++)
{
if (str1[i] == str2[j])
{
j--;
k++;
}
}
if (k == num )
{
return 1;
}
else
{
return 0;
}
}
main()
{
int i, n;
char str[20];
gets(str);
n = strlen(str);
if (n % 2 == 1)
{
i = judge(str, str + ((n / 2) + 1), n / 2);
}
else
{
i = judge(str, str + (n / 2), n / 2);
}
if (i == 1)
{
printf("是回文");
}
else
{
printf("不是回文");
}
printf("\n");
}
114 字符串加密和解密
设计一个加密和解密算法,对一个指定字符串加密之后,利用解密函数能够对密文解密,显示明文信息。加密的方式是:将字符串中每个字符加上它在字符串中的位置和一个偏移值5,以字符串“mrsoft”为例,第一个字符“m”在字符串中的位置为0,则对应密文:“‘m’ + 0+ 5”
应用while(1)无限循环,result = 1,将明文加密输出,result = 2,将密文解密输出。
main()
{
int i = 0, result = 1;
char str[100], passstr[100];
while(1)
{
if(result == 1)
{
//将字符串加密。
printf("输入要加密的明文:\n");
gets(str);
while(str[i] != '\0')
{
passstr[i] = str[i] +i + 5;
i++;
}
passstr[i] = '\0';
printf("输出要加密的明文:\n");
puts(passstr);
printf("\n");
result = 2;
}
else if(result == 2)
{
i = 0;
//将字符串解密。
while(str[i] != '\0')
{
passstr[i] = str[i] +i - 5;
i++;
}
passstr[i] = '\0';
printf("输出要解密的明文:\n");
puts(passstr);
result = 1;
printf("\n");
}
}
printf("\n");
}
115 对调最大数与最小数
从键盘输入一组数组,找出这组数组中的最大数与最小数,将最大数与最小数位置互换,并将互换后数据输出
先将max,min值假设为数组第一位。后在进行比较。
main()
{
int i = 0, posmax, posmin;
char max, min, temp;
char str[100], passstr[100];
printf("输入:\n");
gets(str);
min = max = str[0];
while(str[i] != '\0')
{
if(max < str[i])
{
max = str[i];
posmax = i;
}
if(min > str[i])
{
min = str[i];
posmin = i;
}
i++;
}
for(i = 0; str[i] !='\0'; i++)
{
if(i == posmax)
{
str[i] = min;
}
if(i == posmin)
{
str[i] = max;
}
}
puts(str);
printf("\n");
}