一些学校的C实验(自己的obsidian没同步,粘csdn一下考前看)

发布时间:2024年01月15日

知识点:数组、循环、选择

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出10个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个30厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。现在已知10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
【输入形式】
==输入包括两行数据。第一行包含10个100到200之间(包括100和200)的整数(以厘米为单位)分别表示10个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。==第二行只包括一个100到120之间(包含100和120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
【输出形式】
输出只包含一个整数,表示陶陶能够摘到的苹果的数目。
【样例输入】
100 200 150 140 129 134 167 198 200 111

110
【样例输出】
5
```
#include <stdio.h>

int main() {
int i;
int n=0; //初始化够到的苹果为0
int num[10],maxHeight; //定义10个苹果的数组,能够摘到最大的高度
for(i=0;i<10;i++){
scanf("%d",&num[i]);
}
scanf("%d",&maxHeight); ? ? ?//输入最大的能够到的高度
for(i=0;i<10;i++){
if(maxHeight+30>=num[i]){ ? ? ?//板凳高度加能够到的最大高度大于苹果高度,n加1
n++;
}; ? ? //注意这里也有“;”,我也不知道为什么要注意……

}
printf("%d\n",n);
return 0;
}

```

我的问题1:怎么得到输入的数字:

数组里怎么遍历得到数字?请看VCR(……)
```
? for (i = 0; i < 10; i++) { ?
? ? ? ? scanf("%d", &a[i]); ?
? ? } ?
```
? %d、、、&、、、不要忘


问题2:感觉已经改的一模一样,但是输出0
循环这里不要忘记,能加就加
for后面括号的(i=多少;……)能加就加!!!

第二道
5名选手参加比赛,6位评委打分(百分制),选手得分的计算方法是去掉最高分和最低分后计算平均值。依次输入每位选手的6个分数,计算并输出每位选手的最后得分。

???????提示:依次输入5组,每组6个分数(类型为float),存入一个5行6列的二维数组。按行访问二维数组,找出每行6个分数的最高分、最低分并计算最后得分。

【输入形式】

???????依次输入5组,每组6个分数(类型为float)。

【输出形式】

???????输出一行,依次是5个选手的最后得分,保留到小数点后1位。分数之间用一个空格隔开。

【样例输入】??????

???100 80 70 80 80 80

???100 70 90 90 80 80

???100 70 95 95 95 95

???78.8 92.3 87.6 94.8 85.8 94.8

???99 98 97 99 98 98

【样例输出】

???80.0 85.0 95.0 90.1 98.3

这道比之前复杂点;


首先,得到一个a 56方阵
```
for(i=0;i<5;i++){
? ? for(j=0;j<6;j++)
? ? {
? ? ? ? scanf("%f",&a[i][j]);
? ? }
?? ?}
```
i是多少组,j是每一组
所以i外j内,
对于每一组来说,先要得到最大值和最小值和总和
```
? if(max<a[i][j])
? ? ? {
? ? ? ? ? max=a[i][j];
? ? ? }
? ? ? if(min>a[i][j])
? ? ? {
? ? ? ? ? min=a[i][j];
? ? ? }
? ? ? sum+=a[i][j];
? }
```

其次,这里有一个预设max和min的讲究,因为所有分值在0-100,所以为了使得第一个元素一来就能赋值进去,给了max=0,min=101


最后,存储都需要一个数组存放,在内循环外,外循环内,同时在内循环完成这一组后,记得在这个位置清楚上一组的数据
```
ave[i]=(sum-max-min)/4;

sum=0;
max=0;
min=101;
```

输出还要再循环一次

接下来是全文
```
#include<stdio.h>
int main()
{
float a[5][6],ave[5],sum,max=0,min=101;
int i,j;
for(i=0;i<5;i++){
? ? for(j=0;j<6;j++)
? ? {
? ? ? ? scanf("%f",&a[i][j]);
? ? }
}
for(i=0;i<5;i++){
? for(j=0;j<6;j++)
? {
? ? ? if(max<a[i][j])
? ? ? {
? ? ? ? ? max=a[i][j];
? ? ? }
? ? ? if(min>a[i][j])
? ? ? {
? ? ? ? ? min=a[i][j];
? ? ? }
? ? ? sum+=a[i][j];
? }
ave[i]=(sum-max-min)/4;
sum=0;
max=0;
min=101;
}
for(i=0;i<5;i++){
printf("%.1f ",ave[i]);
}
return 0;
}
```

第三道
插入式加密法是信息加密中一种简单的加密技术,其方法是在明文字符中插入一些无意义的字母来形成密文单词。例如,对于明文:China,在间隔为1的位置依次插入一个字母而形成密文:Coheifnia。因此,其解密过程与加密过程相反,即从密文中首字符开始取,每间隔1个位置依次取出字符,就得到原始的明文。请编程实现插入式加密法所对应的解密算法,将密文翻译成明文。

提示:定义两个字符数组ci和pl,分别存放密文字符串和明文字符串。解密过程即在字符串ci中,从下标0的字符(首字符)开始,将偶数下标的字符(’\0’之前的)依次取出赋值到字符数组pl中,最后即得到明文字符串。

【输入形式】

输入一行:密文字符串。

【输出形式】

输出有一行:翻译后的明文字符串。

【样例输入】

Coheifnia

【样例输出】
China

我不会1:数组/字符串有没有专用的函数 加上元素减去元素?
实际上,答案里并没用这个

如果是不带符号啊空格啊读取整个字符串,只需要:
?scanf("%s", ci); ?
?
输出一整个数组的:(eg.数组pl)

```
?while (pl[k]!='\0'){
? ? ? ? printf("%c",pl[k]);
? ? ? ? k+=1;
? ? }
```
这个太傻了,我采取的答案是
```
#include <stdio.h>
#include <string.h>
int main(){
? ? char ci[60];
? ? int i=0;
? ? int j=0;
? ? int m=0;
? ? char pl[60];
? ? scanf("%s", ci);
? ? m=strlen(ci);
? ? for(i=0;i<=m;i+=2){
? ? ? ? pl[j]=ci[i];
? ? ? ? j+=1;
? ? }

? ? printf("%s",pl);

? ? return 0;
? ? }
```

题四 大写小写转换和字符串

【问题描述】

输入一个长度小于20的含空格的字符串,然后对该字符串做如下处理:对字符串中的每个字符,如果是大写字母,将其转化为小写;如果是小写字母,将其转化为大写,最后将处理后的字符串输出。

【输入形式】

输入一行:长度小于20的字符串。

【输出形式】

输出一行:处理以后的字符串。

【样例输入】

I?Love?C!

【样例输出】

i?lOVE?c!

头部引入了消除toupper的警告<ctype.h>;针对strlen函数的<string.h>
```

#include<stdio.h>
#include<ctype.h>
#include<string.h>
int main(){
? ? char a[20];
? ? gets(a);
? ? int m=0;
? ? int i=0;
? ? m=strlen(a);
? ? for(i=0;i<m;i++){
? ? ? ? if(a[i]>=97&&a[i]<=122){
? ? ? ? ? ? a[i]=toupper(a[i]);
? ? ? ? }
? ? ? ? else if(a[i]>=65&&a[i]<=90){
? ? ? ? ? ? a[i]=tolower(a[i]);
? ? ? ? }
? ? ? ? else{
? ? ? ? ? ? a[i]=a[i];
? ? ? ? }
? ? }
? ? for(i=0;i<m;i++)
? ? {
? ? ? ? printf("%c",a[i]);
? ? }
? ? return 0;
}

```
当然,考点不在怎么消除那些警告,考点在
```
? ? if(a[i]>=97&&a[i]<=122) ?{a[i]=toupper(a[i]);}
? ? ? ? else if(a[i]>=65&&a[i]<=90) ?{a[i]=tolower(a[i]);}
? ? ? ? else ?{a[i]=a[i];}
```
65-90是A到Z;我也忘了原来可以直接a[i](字母)和ASCII码比大小
那么97-122显然是a-z了,小写变大写用toupper?
记忆:把to看作那个什么词根 然后变大写是up per 小写是low er(我英语不好没考证说不定真有整个单词……

注意::经过调试之后,我发现scanf(“%s”,a)读取的时候遇到空格会直接停止

所以如果是一串有字符的需要使用gets(a)

文章来源:https://blog.csdn.net/m0_72562466/article/details/135562422
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。