由于我没有买c程序那本书,在oj上提交不了程序,故以下程序只是过了测试用例
习题9-6 按等级统计学生成绩
#include<stdio.h>
#define MAXN 10
struct student
{
int num;//学号
char name[20];
int score;//分数
char grade;//等级
};
int set_grade(struct student *p, int n);
int main()
{
//结构体数组
struct student stu[MAXN],*ptr;
int n,count;
scanf("%d", &n);
for (int i = 0; i < n;i++)
{
scanf("%d %s %d", &stu[i].num, &stu[i].name, &stu[i].score);
}
ptr = stu;
count = set_grade(ptr, n);
printf("The count for failed (<60): %d\n", count);
printf("The grades:\n");
for (int i = 0; i < n;i++)
{
printf("%d %s %c\n", stu[i].num, stu[i].name, stu[i].grade);
}
return 0;
}
set_grade(struct student *p, int n){
int count = 0;
for (int i = 0; i < n;i++)
{
if(p[i].score<60)
{
p->grade = 'D';
count++;
}
else if (p[i].score > 60 && p[i].score <= 69)
{
p[i].grade = 'C';
}
else if (p[i].score >= 70 && p[i].score <= 84)
{
p[i].grade = 'B';
}else{
p[i].grade = 'A';
}
}
return count;
}
判断回文
#include<stdio.h>
#include<string.h>
#define MAXN 20
typedef enum
{
false,
true
} bool;
bool palindrome(char *s)
{
int n = strlen(s);
int i;
for (i = 0; i < n;i++)
{
if(s[i]!=s[n-i-1])
return false;
}
return true;
}
int main()
{
char s[MAXN];
scanf("%s", s);
if(palindrome(s)==true)
{
printf("Yes\n");
}else{
printf("No\n");
}
printf("%s\n", s);
return 0;
}
追加字符串
#include<stdio.h>
#include<string.h>
#define MAXS 10
char *str_cat(char *s,char *t)
{
int lens = strlen(s);
int lent = strlen(t);
int i;
for (i = 0; i < lent;i++)
{
s[i + lens] = t[i];
}
return s;
}
int main()
{
char *p;
char str1[MAXS + MAXS]={'\0'}, str2[MAXS] = {'\0'};
scanf("%s %s", str1, str2);
p = str_cat(str1, str2);
printf("%s\n%s\n", p, str1);
return 0;
}
最大公约数和最小公倍数
#include<stdio.h>
int main()
{
int m, n, r;
scanf("%d %d", &m, &n);
int tm = m, tn = n;
while (n)
{
r = m % n;
m = n;
n = r;
}
printf("最大公约数:%d\n" ,m);
printf("最小公倍数:%d\n", (tm*tn)/m);//最小公倍数是两数之积除最大公约数
return 0;
}
逆置字符串
#include<stdio.h>
int main()
{
char s[80];
int n = 0, i;
for (i = 0; s[i - 1] != '\n';i++)
{
s[i] = getchar();
}
n = strlen(s);
for (i = n - 1; i >= 0;i--)
{
printf("%c", s[i]);
}
return 0;
}
计算成绩
#include<stdlib.h>
#include<stdio.h>
int main()
{
double *p;//成绩指针
double sum = 0, avg;
int n;
scanf("%d", &n);
p = (double *)malloc(n * sizeof(double));
int i;
for ( i = 0; i < n;i++)
{
scanf("%lf", p + i);
sum += *(p + i);
}
double min = *p, max = *p;
for ( i = 0; i < n;i++)
{
if(*(p+i)>max)
max = *(p + i);
if(*(p+i)<min)
min = *(p + i);
}
free(p);
avg = sum / n;
printf("avg=%.2lf\n", avg);
printf("max=%.2lf\n", max);
printf("min=%.2lf\n", min);
return 0;
}
统计字符个数
#include<stdio.h>
#include<math.h>
int main()
{
int letter, blank, digit, other;
char ch;
letter = blank = digit = other = 0;
int i;
for (i = 1; i <= 10;i++)
{
ch = getchar();
if((ch>='a'&&ch<='z')||ch>='A'&&ch<='Z')
{
letter++;
}else if (ch>='0'&&ch<='9')
{
digit++;
}else if (ch==' '||ch=='\n')
{
other++;
}
}
printf("letter = %d, blank = %d, digit = %d, other = %d", letter, blank, digit, other);
}
习题4-11 兔子繁衍问题
一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔子总数才可以达到N对?
首先,第i个月的兔子的来源有两处,一是第i-1个月原始积累的兔子,二是第i-1个月新出生的兔子。
第一个月有一对兔子,第二个月有一对兔子。然后依次往后计算,感觉有点像动态规划。
我们从第三个月开始计算兔子的数量(i的初始值为2)。然后,我们使用一个循环来逐步计算兔子的数量,直到达到或超过目标数N。最终,我们输出循环次数i,即最少需要的月数。
#include <stdio.h>
int main(void) {
int N;
scanf("%d", &N);
int i = 2, x1 = 1, x2 = 1;
while (x2 < N) {
int temp = x2;
x2 = x1 + x2;
x1 = temp;
i++;
}
printf("%d", i);
return 0;
}
打印倒三角
#include<stdio.h>
int main()
{
int i,j;
for ( i = 0; i < 4;i++)
{
for ( j = 0; j < i;j++)
{
printf(" ");
}
for ( j = 3 - i; j >= 0;j--)
{
printf("* ");
}
printf("\n");
}
return 0;
}
字符加密
A的阿斯科码是65,a的是97,相差32.
#include<stdio.h>
int main()
{
char ch;
//输入单个字符
ch = getchar();
while (ch!='\n')
{ if(ch>='A'&&ch<'Z'){
ch =ch+ 32 + 1;
}else if (ch=='Z')
{
ch = 'a';
}else if (ch>='a'&&ch<'z')
{
ch =ch- 32 + 1;
}else if(ch=='z')
{
ch = 'A';
}
putchar(ch);
ch = getchar();
}
return 0;
}
简易计算器
注:题目说四种运算符号优先级相同
#include<stdio.h>
int main()
{
char c;
int re, t, flag = 0;
scanf("%d%c", &re, &c);
while (c!='='&&flag==0)
{
switch (c)
{
case '+':
scanf("%d", &t);
re += t;
break;
case '-':
scanf("%d", &t);
re -= t;
break;
case '*':
scanf("%d", &t);
re *= t;
break;
case '/':
scanf("%d", &t);
re /= t;
break;
default:
flag = 1;
break;
}
scanf("%c", &c);
}
if(flag==1)
printf("ERROR");
else{
printf("%d", re);
}
return 0;
}
前n项和(具体题目见pta)
#include<stdio.h>
int main()
{
int n, i;
double sum = 0, a = 1.0, b = 2.0;
scanf("%d", &n);
for (i = 1; i <= n;i++)
{
sum += b / a;
b = a + b;
a = b - a;
}
printf("%.2f", sum);
return 0;
}
字符串排序
strcmp函数比的直接是字符串(单位),故编写程序不用一个字母一个字母比较了,具体的排序跟数字的排序就差不多了。
#include<stdio.h>
#include<string.h>
int main()
{
char s[5][100];
char temp[100];
int i, j;
for (i = 0; i < 5;i++)
{
scanf("%s", s[i]);
}
for (i = 0; i < 5;i++)
{
for (j = 0; j < 5 - i - 1; j++)//如果i从1开始,那么j就是j<5-i,注意边界问题
{
if(strcmp(s[j],s[j+1])>0)
{
strcpy(temp, s[j]);
strcpy(s[j], s[j+1]);
strcpy(s[j+1], temp);
}
}
}
printf("After sorted:\n");
for (i = 0; i < 5;i++)
{
if(i==4)
printf("%s", s[i]);
else{
printf("%s\n", s[i]);
}
}
return 0;
}