用数组和tolower和toupper求输入10个数去掉最大最小求平均值
时间: 2023-05-12 15:07:34 浏览: 126
以下是用 C 语言实现的代码:
```c
#include <stdio.h>
#include <ctype.h>
int main() {
int nums[10];
int sum = 0, min = 1000000, max = -1000000;
printf("请输入10个整数:\n");
for (int i = 0; i < 10; i++) {
scanf("%d", &nums[i]);
nums[i] = tolower(nums[i]); // 转换为小写字母
if (nums[i] < min) min = nums[i];
if (nums[i] > max) max = nums[i];
sum += nums[i];
}
sum = sum - min - max; // 去掉最大值和最小值
float avg = (float)sum / 8; // 求平均值
printf("去掉最大值和最小值后的平均值为:%.2f\n", avg);
return 0;
}
```
这段代码可以接受用户输入 10 个整数,然后将它们转换为小写字母,并去掉其中的最大值和最小值,最后求剩余数字的平均值。
相关问题
你未定义toupper和tolower,如何解决
在实现 `myString` 类时,如果需要使用 `toupper` 和 `tolower` 函数来转换字符的大小写,可以包含 `<cctype>` 头文件。这些函数分别用于将小写字母转换为大写字母,以及将大写字母转换为小写字母。
### 解决方案
1. **包含头文件**:在 `myString.h` 文件中添加对 `<cctype>` 头文件的包含声明。
2. **实现 `to_upper` 和 `to_lower` 方法**:使用 `toupper` 和 `tolower` 函数来转换字符串中的每个字符。
### 示例代码
#### myString.h
```cpp
#ifndef MYSTRING_H
#define MYSTRING_H
#include <cctype> // 包含 toupper 和 tolower 函数
#include <stdexcept> // 包含 out_of_range 异常
class myString {
private:
size_t m_len;
char m_str[257];
public:
// 构造函数
myString();
myString(const char* str);
// 获取长度
size_t len() const;
// 获取子串
myString substr(size_t begin, size_t len) const;
// 获取指定位置的字符
char& at(size_t index);
// 转换为大写
myString to_upper() const;
// 转换为小写
myString to_lower() const;
// 获取内容
const char* get_content() const;
// 查找子串
size_t find(const char* substr) const;
};
#endif // MYSTRING_H
```
#### myString.cpp
```cpp
#include "myString.h"
// 默认构造函数
myString::myString() : m_len(0) {
m_str[0] = '\0';
}
// 带参数的构造函数
myString::myString(const char* str) {
m_len = 0;
while (str[m_len] != '\0' && m_len < 256) {
m_str[m_len] = str[m_len];
++m_len;
}
m_str[m_len] = '\0';
}
// 获取长度
size_t myString::len() const {
return m_len;
}
// 获取子串
myString myString::substr(size_t begin, size_t len) const {
if (begin >= m_len || begin + len > m_len) {
return myString(); // 返回空字符串
}
char temp[257];
for (size_t i = 0; i < len; ++i) {
temp[i] = m_str[begin + i];
}
temp[len] = '\0';
return myString(temp);
}
// 获取指定位置的字符
char& myString::at(size_t index) {
if (index >= m_len) {
throw std::out_of_range("Index out of range");
}
return m_str[index];
}
// 转换为大写
myString myString::to_upper() const {
char temp[257];
for (size_t i = 0; i < m_len; ++i) {
temp[i] = std::toupper(m_str[i]);
}
temp[m_len] = '\0';
return myString(temp);
}
// 转换为小写
myString myString::to_lower() const {
char temp[257];
for (size_t i = 0; i < m_len; ++i) {
temp[i] = std::tolower(m_str[i]);
}
temp[m_len] = '\0';
return myString(temp);
}
// 获取内容
const char* myString::get_content() const {
return m_str;
}
// 查找子串
size_t myString::find(const char* substr) const {
for (size_t i = 0; i <= m_len - strlen(substr); ++i) {
if (strncmp(m_str + i, substr, strlen(substr)) == 0) {
return i;
}
}
return m_len;
}
```
通过以上步骤,你可以正确地实现 `to_upper` 和 `to_lower` 方法,并确保它们能够正常工作。
不使用ctype.h中的toupper()和tolower()
如果不想使用`ctype.h`库提供的`toupper()`和`tolower()`函数,可以手动实现大小写字母的转换。例如,你可以通过ASCII码值来进行转换。以下是不依赖这两个函数的一种简单方法:
```c
#include <stdio.h>
#include <string.h>
// 手动实现的大写转换
char to_upper(char c) {
if (c >= 'a' && c <= 'z') {
return c - ('a' - 'A');
}
return c;
}
// 手动实现的小写转换
char to_lower(char c) {
if (c >= 'A' && c <= 'Z') {
return c + ('a' - 'A');
}
return c;
}
void convert_case(char *sentence) {
int len = strlen(sentence);
for (int i = 0; i < len; i++) {
if (i == 0 || sentence[i - 1] == ' ' || sentence[i - 1] == ',' || sentence[i - 1] == '.') { // 首字母和其他特定位置转大写
sentence[i] = to_upper(sentence[i]);
} else if (sentence[i] == 'i' || sentence[i] == 'I') { // 特殊的'I'或'i'保留不变
continue;
} else {
sentence[i] = to_lower(sentence[i]); // 其他字母转小写
}
}
}
int main() {
char input[101];
printf("请输入一句英文句子(不超过100字符): ");
fgets(input, sizeof(input), stdin); // 注意fgets处理换行符
// 移除多余的换行符
size_t len = strlen(input);
if (input[len - 1] == '\n') {
input[len - 1] = '\0';
}
convert_case(input);
printf("输出结果: %s\n", input);
return 0;
}
```
在这个版本的程序中,我们分别创建了`to_upper`和`to_lower`函数,它们通过计算ASCII码差值实现了大小写的切换。但是这种方法可能会比直接使用系统库函数稍微慢一些,因为每个字符都需要做一次加减运算。
阅读全文