一、基础知识:
1. 普通变量(整型、单精度实型、双精度实型、字符型)的定义、数组的定义、指针变量的定义、结构体变量的定义
2. 以上变量的输入输出方法。
二、考试中常见的典型程序设计题目
(一)顺序结构程序设计
1.按照给出的公式求三角形的面积、梯形面积,华氏温度转换为摄氏温度
#include<stdio.h>
#include<math.h>
//知道三角形三边长,求面积
//海伦公式
int main(){
double a,b,c;//定义变量三边长
double s,p;
scanf("%lf %lf %lf",&a,&b,&c);//输入
if(a+b>c||a+c>b||b+c>a){
p=(a+b+c)/2;
s=sqrt(p*(p-a)*(p-b)*(p-c));
printf("%.2lf",s);//保留两位小数
}
else{
printf("无法构成三角形");
}
return 0;
}
#include<stdio.h>
#include<math.h>
//梯形面积
int main(){
double a,b,h;//上底、下底和高
double s;
scanf("%lf %lf %lf",&a,&b,&h);//输入
printf("%.2lf",(a+b)*h/2);//面积公式输出
return 0;
}
#include<stdio.h>
#include<math.h>
//华氏温度转换为摄氏温度
int main(){
double f;//定义
scanf("%lf",&f);//输入
printf("fahr = %lf, celsius = %lf\n",f,5.0*(f-32)/9);
return 0;
}
2.字母大小写之间的转换
(二)选择结构程序设计
1.分段函数
2.百分制成绩转换成等级制成绩
#include <stdio.h>
int main()
{
int score;//定义
int grade;
scanf("%d", &score);//输入
grade = score / 10;
if(score<0||score>100){
printf("Data Error");}
else
switch (grade)//switch判断
{
case 10:
case 9:
printf("A\n");
break;//退出
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("E");
break;
}
return 0;
}
3.判断闰年
#include <stdio.h>
//能被 4 整除的大多是闰年,但能被 100 整除 而不能被 400 整除的年份不是闰年
int main(){
int a;
scanf("%d",&a);
if((a%4!=0)||(a%100==0&&a%400!=0))
printf("%d年不是闰年",a);
else
printf("%d年是闰年",a);
}
(三)循环
1.求n个数的和
#include<stdio.h>
int main(){
int n,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
sum+=i;
}
printf("%d",sum);
}
求n的阶乘
#include<stdio.h>
int main(){
int n,t=1;
scanf("%d",&n);
for(int i=1;i<=n;i++){
t*=i;
}
printf("%d",t);
}
3. 输出水仙花数、完数、质数
#include <stdio.h>
//水仙花数
int main()
{
int a,b,c,n;
printf("3位数以内的水仙花数为:\n");
for (n=100;n<=999;n++)
{
a=n/100;
b=n/10%10;
c=n%100%10;
if(n==a*a*a+b*b*b+c*c*c) printf("%d\t",n);
}
printf("\n");
return 0;
}
#include<stdio.h>
int main(){
int sum;
//1000以内的完数
for(int i=2;i<=1000;i++) {
int sum=0;
for(int j=1;j<i;j++){
int t=i%j;
if(t==0)
sum+=j;
}
if(sum==i)
printf("%d\n",i);
}
return 0;
}
#include<stdio.h>
#include<math.h>
//判断质数
int main(){
int n,flag=0;
scanf("%d",&n);
if(n<=1){
flag=1;
}
for(int i=2;i<=sqrt(n);i++){
if(n%i==0){
flag=1;
break;
}
}
if(flag){
printf("%d不是质数",n);
}else{
printf("%d是质数",n);
}
return 0;
}
4.求复杂的前n项和。
如:求pi/4
#include<stdio.h>
#include<math.h>
int main()
{
double term;
double sum = 0;
do
{
int i = 0;
term = 1.0 / (2 * i + 1);
if (i % 2 == 0)
sum += term;
else
sum -= term;
} while (term < 1e-4);
printf("%.6f", sum);// pi/4
return 0;
}
求e(循环直至项值于10-4。
e=1+1/1!+1/2!+1/3!+1/4!+1/5!+…+1/n! )
/求e的值。e≈1+1/1!+1/2!+1/3!+…,直到最后一项的值小于10的-4次方为止。/
#include <stdio.h>
int main(void)
{
double e=0.0;
int i=1,j=1,t=1;
while(1.0/t >= 1e-4)
{
e+=1.0/t;
t*=j ;
j++;
}
printf ("%lf\n",e);
}
4. 九九乘法表
#include <stdio.h>
int main() {
int i,j; // i, j控制行或列
for(i=1;i<=9;i++) {
for(j=1;j<=i;j++)
// %-5d 控制宽度为5个字符,且左对齐
printf("%d*%d=%-5d", i, j, i*j);
printf("\n");
}
return 0;
}
6.break语句 continue语句
7.求x、y的最大公约数和最小公倍数
#include <stdio.h>
int zhuida(int a,int b){
int temp;
if(a<b){
//保证a>b
temp=a;
a=b;
b=temp;
}
while(b!=0){
//循环求两数的余数,直到余数为0
temp=a%b;
a=b;
b=temp;
}
return a;//返回最大公约数
}
int zhuixiao(int a,int b){
int zhuida(int a,int b);
int temp;
temp=zhuida(a,b);
return (a*b/temp);//返回最小公倍数
}
int main() {
int x,y;
int div,mul;
scanf("%d %d",&x,&y);
div=zhuida(x,y);//最大公约数
mul=zhuixiao(x,y);//最小公倍数
printf("%d %d",div,mul);
return 0;
}
//递归辗转相除求最大公约数
int gcd(int a,int b){
return a%b ? b : gcd(b,a%b);
}
8.有两个红球、三个黄球、四个白球,任意取五个球,其中必须有一个黄球,编程输出所有可能的方案。
#include<stdio.h>
#include<math.h>
int main(){
int red=2,yellow=3,white=4;
for(int i=0;i<=red;i++){
for(int j=1;j<=yellow;j++){
for(int k=0;k<=white;k++){
if(i+j+k==5){
printf("red=%d yellow=%d white=%d\n",i,j,k);
}
}
}
}
return 0;
}
(四)数组
1.从小到大排序:冒泡法排序、选择法排序
//冒泡排序
void b_sort(int a[],int n){
int temp;
for(int i=0;i<n-1;i++){
for(int j==0;j<n-i-1;j++){
if(a[j]<a[j+1]){
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
}
//选择排序
void s_sort(int a[],int n){
int temp;
for(int i=0;i<n-1;i++){
int min=i;
for(int j=i+1;j<n;j++){
if(a[j]<a[min]){
min=j;
}
}
if(min!=i){
temp=a[min];
a[min]=a[i];
a[i]=temp;
}
}
}
2.斐波那契数列前20项
#include<stdio.h>
int main()
{
int n,a[100];
a[0]=1;
a[1]=1;
scanf("%d",&n);
for(int i=2;i<n;i++){
a[i]=a[i-1]+a[i-2];//递推公式
}
for(int i=0;i<n;i++){
printf("%d ",a[i]);//输出
if(i%5==0&&i!=0){
//换行
printf("\n");
}
}
return 0;
}
3.求一维数组元素的和 、平均数 、 最大值(及其下标)
#include<stdio.h>
int main(){
int a[10]={
1,2,3,4,5,6,7,8,9,10};
int sum=0;
double average;
int max=0,maxnum=a[0];//max最大的下标;maxnum最大的值
for(int i=0;i<10;i++){
sum+=a[i];
if(a[i]>maxnum){
maxnum=a[i];
max=i;
}
}
average=sum*1.0/10;
printf("sum=%d average=%lf max=%d maxnum=%d",sum,average,max,maxnum);
return 0;
}
4.在一个有序数组中插入一个数仍然有序
#include <stdio.h>
void insert(int a[], int n, int x)
{
int i;
for (i = n - 1; i >= 0; i--) {
if (a[i]>x) {
a[i+1]=a[i]; // 当比较的数比x大时,将其后移
} else {
break; // 确定出x要插入的位置
}
}
a[i+1]=x; // 将x插入到数组中
}
int main(void)
{
int n = 8; // 初始数组大小为8
int x = 5; // 要插入的数为5
int A[20] = {
1, 2, 3, 4, 6, 7, 8, 9};
insert(A, n, x);
for (int i = 0; i < n + 1; i++) {
printf("%d ", A[i]);
}
return 0;
}
5. 数组的逆序存放
void reverse(int p[], int n)
{
int i, j, temp;
for(i=0,j=n-1; i<j; i++,j--)
{
temp = p[i];
p[i] = p[j];
p[j] = temp;
}
}
6. 求二维数组的转至矩阵、每一行的最大值、每一行的和、对角线元素之和
//用的是五阶矩阵
void zhuanzhihs(){
//转置函数
int temp;
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
if(j>i){
temp=*(*(p+i)+j);
*(*(p+i)+j)=*(*(p+j)+i);
*(*(p+j)+i)=temp;
}
}
}
}
void hangmax(){
//每一行最大值
for(int i=0;i<5;i++){
int max=arr[i][0];
for(int j=0;j<5;j++){
if(arr[i][j]>max){
max=arr[i][j];
}
}
printf("max=%d\n",max);
}
}
void hangsum(){
//每行求和
for(int i=0;i<5;i++){
int sum=0;
for(int j=0;j<5;j++){
sum+=arr[i][j];
}
printf("sum=%d\n",sum);
}
}
void duijiaosum(){
//对角线求和
int sum=0;
for(i=0;i<;i++)
{
sum+=a[i][i];
sum+=a[i][2-i];
}
sum-=a[3][3];
printf("%d",sum);
}
7. 杨辉三角
#include <stdio.h>
#define N 20
int main()
{
int i, j, k, n=0, a[N][N];
printf("请输入要打印的行数:");
scanf("%d",&n);
printf("%d行杨辉三角如下:\n",n);
for(i=1;i<=n;i++)
a[i][1] = a[i][i] = 1;
//两边的数令它为1,因为现在循环从1开始,就认为a[i][1]为第一个数
for(i=3;i<=n;i++)
for(j=2;j<=i-1;j++)
//i=3和j=2是关键点
a[i][j]=a[i-1][j-1]+a[i-1][j]; //除两边的数外都等于上两顶数之和
for(i=1;i<=n;i++){
for(k=1;k<=n-i;k++)
printf(" "); //这一行主要是在输出数之前打上空格占位,让输出的数更美观
for(j=1;j<=i;j++) //j<=i的原因是不输出其它的数,只输出我们想要的数
printf("%5d",a[i][j]);
printf("\n"); //当一行输出完以后换行继续下一行的输出
}
printf("\n");
}
8. 自己编程实现 :字符串的拷贝,连接,比较、统计字符个数,
int Strlen(char a[]){
//长度
int b,i,len=0;
for(i=0;a[i]!='\0';i++)
len++;
return len;
}
void strcat1(char a[],char b[]){
//接长
int lena,lenb,i,j;
lenb=Strlen(b);
lena=Strlen(a);
for(i=lena,j=0;i<lena+lenb;i++,j++)
a[i]=b[j];
}
void copy(char a[],char b[])//strcpy
{
int i;
for(i=0;a[i]!='\0';i++)
b[i]=a[i];
}
int strcmp1(char str1[],char str2[])//strcmp
{
int i=0;
while((str1[i] == str2[i]) && (str1[i] != '\0'))
//自定义实现strcmp();打印不同字符的差值
i++;
return str1[i]-str2[i];
}
大写小写互换、大小写字母的个数 字符串中某一字母(例如’a’)的个数
#include <stdio.h>
int main()
{
char a[100];
int i,cnt=0,cnt1=0,cnt2=0;
gets(a);
for(i=0;a[i]!='\0';i++){
if(a[i]=='a'){
cnt++;
}
if(a[i]>='a'&&a[i]<='z'){
a[i]-=32;
cnt1++;
}
else if(a[i]>='A'&&a[i]<='Z'){
a[i]+=32;
cnt2++;
}
}
puts(a);
printf("a的个数:%d",cnt);
printf("小写个数:%d 大写个数:%d\n",cnt1,cnt2);
return 0;
}
9. 判断字符串是否回文
#include<stdio.h>
#include<string.h>
int is_back_content(char str[]){
int i=0,j,len,n;
len = strlen(str);
j = len - 1;
n = len/2;
while(i<=n){
if(str[i]!= str[j])
return -1;
j--;
i++;
}
return 1;
}
int main(){
char str[100];
gets(str);
if(is_back_content(str)==1){
printf("是回文");
}else{
printf("不是回文");
}
}
(五)函数
1.所有前面学过的程序都能转换成函数调用的形式
main函数中输入、调用函数、输出。自定义函数完成相应的功能。
2.函数与一维数组:数组名作为函数参数。(例如一维数组的排序,查找某个数,求最大最小值,求和求平均值,字符数组的比较,连接,统计字符个数,查找某个字符)
//数组部分已经使用,不重复提供
(六)指针
1.利用指针,实现两个数交换内容(函数调用的方法)
void swap(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
2.指针与一维数组 利用指针,作为函数参数(形参和实参都行)
所有函数中一维数组作为参数的例子都可以改成指针来做。(例如一维数组的排序,查找某个数,求最大最小值,求和求平均值,字符数组的比较,连接,统计字符个数,查找某个字符)
//例如字符串的比较
int Strcmp( char* str1, char* str2)
{
while (*str1 == *str2)
{
if (*str1 == '\0'||( *str2='\0'))
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
//字符串的长度
int Strlen(const char *s)//计数器写法
{
if(s == NULL){
return 0;
}
int len = 0;
while(*s++ != '\0'){
len++;
}
return len;
}