61.输出用户姓名和电话号码
编写一个程序,读入
n
个用户姓名和电话号码,按姓名的字典顺序排列后,输出用户的姓名和电
话号码,
n
从键盘输入。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct Numlist {
char name[50];
char num[50];//不能用int,因为空间不够
}Numlist;
int main() {
Numlist numlist[100];
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s%s", numlist[i].name, numlist[i].num);
}
for (int i = 0; i < n; i++) {
for (int j = n - 1; j > i; j--) {
if (strcmp(numlist[j].name, numlist[j - 1].name) < 0) {
Numlist temp;
temp=numlist[j];
numlist[j]=numlist[j - 1];
numlist[j - 1]=temp;
}
}
}
for (int i = 0; i < n; i++) {
printf("%s %s\n", numlist[i].name, numlist[i].num);
}
return 0;
}
小知识:创建 结构体变量 的语句们
方法一
struct book {
char title[50];
char author[50];
float value;
};
这里,语句最后的分号不能少。
方法二
struct book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
} a={"math","ergexwz",100.00};
方法三
typedef struct Book {
char title[MAXTITL];
char author[MAXAUTL];
float value;
}Book;
这里,将结构体变量重命名
62.统计大学生成绩
有
n
名学生,每个学生的数据包含学号、姓名、三门课的成绩。可以从键盘输入
n
个学生的数据,
按总成绩从小到大排序,打印包含学号、姓名、三门课成绩和总成绩的成绩单。(测试时,数据
从键盘输入。)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
typedef struct Gradelist {
char id[20];
char name[20];
int course1;
int course2;
int course3;
int total;
}Gradelist;
int main() {
int n;
scanf("%d", &n);
Gradelist glist[30];
for (int i = 0; i < n; i++) {
scanf("%s%s%d%d%d", glist[i].id, glist[i].name, //这里成员是数组不要&
&glist[i].course1, &glist[i].course2, &glist[i].course3);
glist[i].total = glist[i].course1 + glist[i].course2 + glist[i].course3;
}
for (int i = 0; i < n; i++) {
for (int j = n - 1; j > i; j--) {
if (glist[j].total < glist[j - 1].total) {
Gradelist temp = glist[j];
glist[j] = glist[j - 1];
glist[j - 1] = temp;
}
}
}
for (int i = 0; i < n; i++) {
printf("%s %s %d %d %d %d\n",
glist[i].id, glist[i].name, glist[i].course1,
glist[i].course2, glist[i].course3, glist[i].total);
}
return 0;
}
63.输出数字英文单词
编写一个程序,从键盘上读入一个数字串,把数字转化为对应的小写英语数字单词输出。例如:
输入
234
,输出
two three four
。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main(){
char word[][20] = { "zero", "one", "two", "three",
"four", "five", "six", "seven", "eight", "nine" };
char input[50];
scanf("%s", input);
printf("%s", word[input[0] - '0']);
for (int i = 1; i < strlen(input); i++) {
printf(" %s", word[input[i] - '0']);
}//字符的ASCII码减0的ASCII码即得对应数字
return 0;
}
64.统计字母出现次数
输入一个可能含空格的字符串(其长度不超过
81
),分别统计其中
26
个英文字母出现的次数(不
区分大、小写字母),并按字母出现的次数,从高到低进行排序。若次数相同,按字母顺序排
列。字母输出格式举例,例如:
A-3
,表示字母
A
出现
3
次,
C-0
表示字母
C
没有出现过。
方法一:利用二维数组
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char input[99];
scanf("%s", input);
int list[26][2];
for (int i = 0; i < 26; i++) {
list[i][0] = i;
list[i][1] = 0;
}
_strupr(input);
for (int i = 0; i < strlen(input); i++) {
if (input[i] >= 'A' && input[i] <= 'Z') {
list[input[i] - 'A'][1]++;
}
}
for (int i = 0; i < 26; i++) {
for (int j = 25; j > i; j--) {
if (list[j][1] > list[j - 1][1]) {
int temp0 = list[j][0];
list[j][0] = list[j - 1][0];
list[j - 1][0] = temp0;
int temp1 = list[j][1];
list[j][1] = list[j - 1][1];
list[j - 1][1] = temp1;
}
}
}
for (int i = 0; i < 26; i++) {
(i == 0) ? printf("%c-%d", 'A' + list[i][0], list[i][1]) :
printf(" %c-%d", 'A' + list[i][0], list[i][1]);
}
return 0;
}
命名二维数组的另一种方式
int count[26][2] = { {'A',0}, {'B',0}, {'C',0}, {'D',0}, {'E',0}, {'F',0}, {'G',0}, {'H',0}, {'I',0}, {'J',0}, {'K',0}, {'L',0}, {'M',0}, {'N',0}, {'O',0}, {'P',0}, {'Q',0}, {'R',0}, {'S',0}, {'T',0}, {'U',0}, {'V',0}, {'W',0}, {'X',0}, {'Y',0}, {'Z',0} };
带空格输出的一种方式:
int cnt=0; printf("%s%c-%d",cnt++?" ":"",i+'A',max);
方法二:利用结构体
gets_s和gets的区别:
在于gets不会限制输入的数量,所以容易出错,而gets_s在输入时就限制了长度,比较安全
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct _count
{
char alphabet;
int c;
} Count;
void BubbleAlpha(Count count[]);
int main()
{
Count count[26];
for (int i = 0; i < 26; i++){
count[i].alphabet = 'A' + i;
count[i].c = 0;
}
char input[100];
gets_s(input, 100);
/*gets_s和gets的区别在于gets不会限制输入的数量,所以容易出错,而gets_s在输入时
久限制了长度,比较安全*/
_strupr(input); //转为大写字母
int i = 0;
while (input[i]){
if (input[i] >= 'A' && input[i] <= 'Z'){
count[input[i] - 'A'].c++;
}
i++;
}
BubbleAlpha(count);
printf("%c-%d", count[0].alphabet, count[0].c);
for (int i = 1; i < 26; i++){
printf(" %c-%d", count[i].alphabet, count[i].c);
}
return 0;
}
void BubbleAlpha(Count* count)
{
for (int i = 0; i < 26; i++)//经典排序双循环
{
for (int j = 25; j > i; j--)
{
if (count[j].c > count[j - 1].c)
{
Count temp = count[j];
count[j] = count[j - 1];
count[j - 1] = temp;
}
}
}
}
65.输出特定整数序列
编写程序,有一个包含奇数个项的整数序列,按照以下规则进行排序:
最大值排在中间,最小值排在最左,中值排在最右,其它值清为
0
。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
void Bubble(int a[], int n);//冒泡排序
int main(){
int a[100] = { 0 }, n;
scanf("%d", &n);
for (int i = 0; i < n; i++){
scanf("%d", &a[i]);
}
Bubble(a, n);
int min = a[0];
int mid = a[n / 2];
int max = a[n - 1];
printf("%d", a[0]);
for (int i = 1; i < n; i++){
if (i == n / 2){
a[i] = max;
}
else if (i == n - 1){
a[i] = mid;
}
else{
a[i] = 0;
}
printf(" %d", a[i]);
}
/*或者:
printf("%d", a[0]);
for (int i = 1; i < n - 1; i++)
(i == n / 2) ? printf(" %d", a[n - 1]) : printf("0");
printf(" %d", a[n/2]);
*/
return 0;
}
void Bubble(int a[], int n){
for (int i = 0; i < n; i++){
for (int j = n - 1; j > i; j--){
if (a[j] < a[j - 1]){
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
}
66.编写函数
编写函数,求有
n
个元素的一维数组中的最大值和最小值,并返回数组元素的平均值,函数原形
如下:
double fun(int a[],int n,int max,int min);
输入:输入
n+1
个数,各个数之间用空格分隔。第一个数为数组元素的个数
n
。
输出:
3
个数字。第一个数字为数组中的最大元素值,第二个数字为数组中的最小元素值,第三
个数字为数组元素的平均值(保留小数点后
6
位有效数字
)
。
3
个数之间用空格分开。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
double fun(int a[], int n, int* max, int* min) {
for (int i = 0; i < n; i++) {
for (int j = n - 1; j > i; j--) {
if (a[j] < a[j - 1]) {
int temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
max = a + n - 1;
min = a;
double sum = 0;
for (int i = 0; i < n; i++) {
sum += a[i];
}
printf("%d %d ", *max, *min);
return sum / n;
}
int main(){
int n;
scanf("%d", &n);
int a[100];
for (int i = 0; i < n; i++) {
scanf("%d", a + i);
}
printf("%.6lf", fun(a, n, a[1], a[1]));
return 0;
}
67.输出小写字母
输入一个英文字符串(长度
<81
)可能包含空格,删除其中所有非小写字母的字符,并输出删除
后的字符串(小写字母的相对位置保持不变)
方法一:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main() {
char a[82];
gets_s(a, 82);
int len = strlen(a);
for (int i = 0; i < len; i++) {
if (a[i] >= 'a' && a[i] <= 'z') {
}
else {
for (int j = i; j < len; j++) {
a[j] = a[j + 1];
}
len--; i--;
}
}
printf("%s", a);
return 0;
}
方法二:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(){
char a[100]; gets(a);
for (int i = 0; a[i] != '\0'; i++)
(a[i] >= 'a' && a[i] <= 'z') ? printf("%c", a[i]) : 0;
return 0;
}
68.统计单词数目
输入一系列英文单词,单词之间用空格隔开(一到多个空格),用
“###”
表示输入结束,统计输入
过哪些单词以及各单词出现的次数,统计时区分大小写字母。本题假定:不重复的单词数不超过
100
个;每个单词长度限制在
20
以内。
注意:C语言中,字符串不能作逻辑运算。如:char x[100][20]; scanf("%s", &x[0]); if(x[0] == "###"){//这一就出错了!! <语句1>; }
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
typedef struct _wordcount {
char word[20];
int nble;
}wordcount;
int main() {
char x[100][20];
scanf("%s", &x[0]);
int num = 0;
for (int i = 1; strcmp(x[i - 1], "###"); i++) {
num++;
scanf("%s", &x[i]);
}
wordcount wcount[100];
for (int i = 0; i < 100; i++)wcount[i].nble = 0;
strcpy(wcount[0].word, x[0]); int n = 1; wcount[0].nble++;
for (int i = 1; i < num; i++) {
int flag = 1;
for (int j = 0; j < n; j++) {
if (strcmp(x[i], wcount[j].word) == 0) {//the same
wcount[j].nble++;
flag = 0;
}
}
if (flag) {
strcpy(wcount[n].word, x[i]);
wcount[n].nble++;
n++;
}
}
int cnt = 0;
for (int i = 0; i < n; i++) {
printf("%s%s-%d", (cnt++) ? " " : "", wcount[i].word, wcount[i].nble);
}
return 0;
}
69.升序输出所有小写字母
定义字符串数组
str
,其数组长度为
81
,键盘读入一个字符串(少于
81
个字符)。将该字符串中出
现的所有小写字母按字母序升序输出(字母序为:
abcdefg…xyz
)
注意:空字符是 0 或者 '\0'
方法一:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void Bubble(char a[]) {
for (int i = 0; i < strlen(a); i++) {
for (int j = strlen(a) - 1; j > i; j--) {
if (a[j] < a[j - 1]) {
char temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
}
int main() {
char x[82];
scanf("%s", x);
char a[82]; int num = 0;
for (int i = 0; i < strlen(x); i++) {
if (x[i] >= 'a' && x[i] <= 'z') {
a[num] = x[i];
num++;
}
}
a[num] = '\0';
Bubble(a);
printf("%s", a);
return 0;
}
方法二:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main(){
char a[81];
gets(a);
for (int i = 'a'; i <= 'z'; i++) {
for (int j = 0; a[j] != '\0'; j++)
if (a[j] == i)
printf("%c", a[j]);
}
return 0;
}
70.字符串奇数位排序
用户输入一个字符串,将字符串中的奇数位置上的字符按字母表中的顺序排序,仍按顺序保存在
奇位置上,其他字母位置不变。例如
teacher
,
t,a,h,r
排序后结果为
a,h,r,t
,则结果字符串为:
aehcret
。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void Bubble(char a[]) {
for (int i = 0; i < strlen(a); i++) {
for (int j = strlen(a) - 1; j > i; j--) {
if (a[j] < a[j - 1]) {
char temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
}
}
}
}
int main() {
char x[100];
scanf("%s", x);
char a[100] = {0};//直接将所有字符变为空字符,方便后序调用函数strlen(a)
for (int i = 0; i < strlen(x); i += 2) {
a[i / 2] = x[i];
}
Bubble(a);
for (int i = 0; i < strlen(x); i++) {
printf("%c", (i % 2) ? x[i] : a[i / 2]);
}
return 0;
}